Q&A

  • RS232에서 들어오는 값이 이상해요 ?
ComPort 콤포넌트를 사용해서 기계와 컴퓨터를 연결했습니다.
그런데 RS232가 무선 RS232 입니다.
유선으로 TEST하면 문자값 (ABCDE)를 보내면 제대로 받는데
무선으로 하면 'A'가 먼저들어오고 난 후 'BCDE'가 들어옵니다.
읽혀지는 값에 따라 다음 값을 보내주어야 하는데 읽혀지는 값이
두번에 나누어서 읽려져 다음 값을 보내지 못합니다.
어떻게 해결해야 하나요 ?

그리고 ComPort에서 기계에 AT+BTINFO?라는 값을 보내면
RETURN 되는 값이 해당 RS232의 SERIAL번호와 현재 상태
즉 STANYBY 인지 아닌지를 보내오는데 ComPort의 RxChar 이벤트에서
어떻게 하면 STANDBY 가 들어올때 까지 기다릴 수 있나요 ?
계속 이벤트를 발생할 수 도 없고.... 전혀 감이 잡히지 않습니다.

또 한가지는 RxChar 이벤트(읽혀지는 이벤트)에서 한 번 문자를 읽어서
showmessage()를 이용해서 잠시 멈춘 후 진행하면 다음 값을 제대로 읽는데
showmessage()를 하지않고 sleep(1000)를 이용해서 하면 다음값을
제대로 읽지 못합니다. (Event내에서 Showmessage()로 읽혀지는 값 확인했음) 왜 그런가요 ? 강제적으로 Showmessage()를 보내주는 효과를
줄 수 있나요 ?

긴 질문 읽어주셔서 감사합니다. RS232 통신은 처음해보는 거라 전혀 감이
없습니다. 자세히 알려 주시면 정말로 감사하겠습니다.
그리고 시간이 없어서 ... 미안하데 빠른 답변 부탁드립니다.

3  COMMENTS
  • Profile
    박정일 2003.07.23 09:53


    일단 무선RS232이라고 한다면 블루투스to232 converter 혹은 RF를 이용한 232 converter를 사용한다고 보여지는데.. 장치간에 delay가 존재합니다.
    유선으로 할 경우와는 좀 다르죠... converter가 가지는 delay이 이니까요..
    일단은 콤포넌트에 있는 readinterval을 길게 잡아야 겠네요.. default는 -1일건데 500정도(너무 많나?) 혹은 그 이상 주어 보세요...


    RxChar이벤트 내에서 기다리는 건 좀 무리가 있어 보입니다. 어짜피 버퍼의 값은 이미 읽어 온 뒤니까요... 일정 간격으로 쓰는 이벤트가 있다면 혹은 쓰레드를 이용한다면 timer를 이용해서 쓰기 쓰레드 혹은 쓰기 이벤트를 잠시 죽여 두고 timer이벤트가 쓰기 쓰레드 혹은 이벤트를 살리도록 한다면 timer 설정시간동안은 프로그램이 RxChar를 기다리는 효과가 나지요..


    윗분이 설명 잘 해놓으신것 같습니다. 제가 보기에도 그 이유일것 같네요...
  • Profile
    손광현 2003.06.07 21:21
    For idx := 1 To 10 Do Begin
         Application.ProcessMessages;
         sleep(100);
    End;


  • Profile
    KDDG_RNStone 2003.06.07 19:21
    저 같은 경우는 보통 데이트를 바을 때요. 보내는 데이터건 받는 데이터건 간에 맨 뒤에 특정 문자가 붙습니다.

    뭐 수신 요청이면 #2#3. 데이터 전송은 #5 뭐 이런 식으로요.

    그러니까 RxChar에서는 전역변수 하나 둬서 그거 클리어 시킨 다음에 특정 문자를 만날때 까지 계속 While문을 돌리는 거지요. 그러면서 그 전역 변수에 받은 데이터를 더하는 거에요.

    예를 들어 RtVal := RtVal + String; 뭐 이런 식으로요.

    테스트 시에는 만약을 대비해서 ESC 버튼을 눌렀을 겨우 빠져나오는 것도 좀 넣어서 테스트하시면 될것 같네요.

    글구 Sleep()은 잠시 작동을 완전히 멈추게 하는걸로 알고 있습니다.