|
Rs232이고 양방향 바코드 리더기 입니다
1번 방법이 제일 적당한듯한데 혹시 comport 수신 timeout이 따로 있나요? 제가 완전 초보라서 ㅠㅠ
퇴근 못할거 같아요 해결안되면
스머팩트 님이 쓰신 글 :
:
: 수신데이터가 5초동안 없으면 에러로 처리하고 싶다는 말씀이신듯 합니다.
: 구체적인 시퀀스 프로토콜을 모르는 상태라서 제가 적당한 방법을 제시한건지 모르겠네요.
:
: ------------------------
: 1. Timer를 이용하는 방법
: ------------------------
:
: 1) 타이머를 1초 주기로 이벤트가 발생하도록 초기화 합니다.(꼭 1초가 아니어도 되겠죠)
: 2) 데이터가 수신되면 수신된 시간을 변수에 저장 합니다.
: 3) 타이머 이벤트가 발생했을 때
: - 지금이 에러를 처리해야 하는 상황인지와
: - 마지막 수신시간과 지금 시간을 비교해 5초가 넘었으면 에러처리루틴 호출 합니다.
:
: ------------------------
: 2. Thread를 이용한 방법
: ------------------------
:
: 0) 사용자 메시지 WM_RX_ERROR를 정의하고 이벤트 핸들러(에러처리 함수)를 구현하고 등록 합니다.
: (사용자 메시지 핸들러 정의 도움말을 참조하세요)
: 1) Thread를 생성합니다.
: - Thread는 1초를 Sleep 해가며 루프를 돕니다.(Child-Thread)
: 2) 데이터가 수신되면 수신된 시간을 설정 합니다.(Main-Process가 시간을 기록)
: 3) Thread가 Sleep에서 깨어나면(Child-Thread)
: - 지금이 에러를 처리해야 하는 상황인지와
: - 마지막 수신시간과 지금 시간을 비교해 5초가 넘었으면
: Main-Process에 WM_RX_ERROR(User가 정의한Message)를 PostMessage()로 보냅니다.
:
: 참고1) 시간변수와 같이 Main-Process와 Child-Thread가 동시 접근 할 가능성이 있는 변수들은
: Mutex를 사용해 동시접근을 막아야 겠죠
: 참고2) WM_RX_ERROR를 정의하고 PostMessage로 에러를 발생 시켜,
: Main-Process가 에러를 처리하게하는 이유는
: - GDI나 쓰레드에 안전하지 않은 VCL을 보호하기 위함 입니다.
: - 물론 Synchronize()와 같은 함수로 처리할 수도 있겠으나 저는 PostMessage를 선호 합니다.
:
: 대충 봐도 Timer를 이용하는 방법이 쉬워 보입니다.
: 빨리 구현해 보고 싶으시다면 Timer를 사용하시고, 좀더 견고한(?) 프로그램을 만들고 싶다면 Thread를 사용하기 바랍니다.
: Thread를 사용하는 방법은 여러통신에 자주 사용될 뿐만 아니라 Unix와 Windows를 가리지 않고 사용되고 있습니다.
: 저는 Timer보다는 Thread를 선호 합니다.
:
:
: [마지막으로]
: 1. 통신이 단방향인지, 양방향인지 그리고 양방향 동기식/비동기식에 따라서 구현이 다소 달라질 수 있습니다.
: 2. RS232인터페이스를 VCL을 사용한것으로 간주했기 때문에, 데이터 수신시 이벤트가 발생 한다고 가정했습니다.
: 3. 짧은 설명과 간단한 구현을 위해 극대화된 효율성과 종료시 처리해야 할 문제는 생략했습니다.
:
: 도움이 되셨길 바라며....
:
:
: 쿼드콥터헬기 님이 쓰신 글 :
: : 만약 com1에서 5초 이내로 Rx을 받지 못하면 에러처리를 해야되는데 어떤식으로 해야될지 감이 안옵니다.
: : 빠른 답변 부탁드립니다.
: :
|