2014. 6. 19. 08:14

Windows 7에서 C# Wait Timing

간만에 글을 씁니다.

RS-485 통신을 하는데, Panel PC에 내장되어 있는 RS-485 변환기가 반쪽짜리이더군요.

(정말 황당합니다. 이렇게 만들어져 있다니)

RTS 신호는 Enable로 해야만 송신이 되고, 이 때는 수신이 안되는 군요.

송신을 완료한 후, RTS 신호를 Disable로 해야 한다는 군요. 그제서야 수신이 됩니다.

 

Embedded 장치와 연동해서 할 때는 송신과 수신이 번갈아 가며 되기 때문에, 송신이 끝나면 무조건 수신 상태이어야 하기에 언제 송신이 끝났는지 정확하게 아는 것이 매우 중요합니다.

.

문제는, Windows 7에서 C#으로 프로그래밍이 되어 있는데, 송신이 언제 완료되었는지 알 길이 없다는 것입니다.

구글링해 보니, 헐~~~ 시간 계산해서, 기다렸다가 신호를 바꾸라는 군요.


시간 계산이야 하면 되지만, 문제는 기다리는 것입니다.

C#에서 제공하는 Sleep 함수는 ~~~ 그 말도 많은 함수 ~~~~

파라미터가 ms 단위로 되어 있기는 하지만, 오차가 15 ms 정도 나더군요.

뭐 상황에 따라 더 날 수도 있을 지도... (첨부화일 에서 시험해 보니 가관이군요)


결국은 Loop 돌면서 기다려야 합니다. (현재까지의 결론입니다.)

혹시 글을 읽으시는 분 들 중에서 고견이 있으면 댓글 부탁합니다.

두서 없이 적었기에 다른 분을 위해서 정리합니다.


<RS-485 통신 in Panel-PC>

1. 통신 설정

  * 흐름 제어 사용하지 않음

2. 송신 절차

  1) RTSenable = TRUE

  2) 대략 1~2ms 정도 기다림,

  3) Write data

  4) data가 다 보내 질 때 까지 기다림 (송신 속도 * data 수) (참고로 data 수는 1 byte 보낼때, 

      start, stop bit가 추가됨을 포함하여 bit 수를 계산해야 함. 즉 1 byte 보낼 때 bit 수는 

      총 10 bit 입니다)

  5) 다 보낸 후, 대략 1~2ms 기다림

  6) RTSenable = FALSE

3. 수신 절차

  1) RTSenable == FALSE 인 상태는 수신 상태임.

  <첨부1.윈도우에서 sleep 함수로 기다릴 때 시간 재기 

StopWatcher.zip

>

그럼, 도움이 되기를...