rs232c 시리얼 통신을 하다 보면 자료의 변환이나 손실에 의해 본의 아니게 수신하는 쪽이 Wait 에 빠지는 경우가 있습니다. 아직 받아야 할 것이 더 있다는 것이죠.
STX |
DATA |
CRC | ETX |
예로 위와 같은 순서로 자료를 받는 다면 수신하는 측은 STX를 받은 후에 ETX를 만날 때 까지 계속 자료를 수신하는 상태가 될 것입니다. 이때 통신 상의 문제로 ETX를 받지 못했다면 수신하는 측은 ETX를 기다리는 Wait 상태로 빠지게 됩니다.
이번에는 전송하는 쪽의 입장을 생각해 보겠습니다. 전문을 전송한 후에 상대방으로부터 자료를 잘 받았다, 또는 못 받았다라는 응답을 기다리게 되는데, 그렇다고 무작정 기다릴 수 없을 것입니다.
이때 전송하는 쪽과 수신하는 쪽에서 시간 약속을 하는데, 전문 전송 후에 얼마만큼 기다린 후에 응답이 없으면 다시 전문을 전송한다라는 것이죠. 그리고 그것을 몇 회 반복한다. 몇 회 반복해서 안된다면 에러를 출력한다. 뭐 이런 시간 약속을 하게 됩니다.
그렇다면 얼마나 기다려야 할까요? 대충 3초, 5초하는 식으로 진행합니다만 대기 시간이 짧으면 아직 전송 중인데, 다시 전문을 보내는 경우가 발생하므로 주의해야 합니다. 한마디로 프로그램이 성질 급한 놈이 되는 것이죠. 또한 너무 많은 시간을 대기하면 해 넘어가죠. 이번에는 상대발의 성질을 긁는 놈이 될 것입니다.
전송 시간 계산
- 데이터 최대 크기 계산
우선 한번에 주고 받는 데이터의 최대 크기를 확인합니다. 전송할 경우를 정리하고 각 경우를 통합하여 가장 긴 데이터의 크기를 계산합니다.
- bps 확인
bps 는 말 그대로 bit per sec 이기 때문에 전송 시간을 구할 수 있습니다. 그러나 주의 하셔야 할 점은 시스템끼리 rs232 케이블로 연결된 상태라면 보오율은 bps 와 같기 때문에 문제가 없지만 모뎀을 사용하신다면 주의하셔야 합니다. 이 말씀은 내용 아래에 다시 자세히 말씀 드리겠습니다.
- start bit 와 stop bit 개수를 추가하여 계산
rs232c 와 같은 시리얼 통신은 비동기 통신 방식이라 하나의 바이트 전송에 항상 start bit 와 stop bit를 앞/뒤에 추가하여 전송합니다.
시리얼 통신은 전압의 크기를 이용한 통신 방식입니다. 또한 통신 포트를 계속해서 전압 값을 읽어 들일 수 있습니다. 그러나 지금 읽고 있는 전압 값이 평상 시 상태인지, 상대방이 자료를 전송 중인 상태인지를 알 수가 없습니다. 즉, 상대방과 제 시스템간에 통신을 위한 동기를 맞추는 작업이 없다 보니까, 한 바이트를 보내 더라도 데이터 비트의 시작이라는 start bit와 stop bit 를 데이터의 앞뒤에 추가하여 전송하게 됩니다.
또한 start bit 는 다른 비트와 달리 크기가 보통 비트의 2개 크기입니다. 또한 stop bit 는 통신하기 전에 1 비트를 사용할지 2 비트를 사용할 지를 결정하게 됩니다.
시간 계산 예제
자, 이와 같은 내용을 참고하여 예로 계산해 보겠습니다.
- 8bit 데이터 통신을 한다.
- 1 stop bit 를 사용한다.
- 보오율은 9600 이다.
- 여러 경우를 확인해 보았지만 stx, etx, crc 모두 합쳐서 한번에 최대 1000byte 미만으로 전송한다.
8bit 통신이고 1 stop bit 를 사용한다면 2 bit 크기의 start bit 까지 합쳐서 1 개의 byte 에,
8(data bit) + 2(start bit) +1(stop bit) = 11 bits
즉, 총 11비트를 사용하게 됩니다. 그리고 한번에 1000 byte 미만으로 통신한다고 했으니까, 한번의 통신에
11bits * 1000 = 11000bits
다시 사용할 보오율 9600으로 나누면, 약 1.1458 초 정도 걸리게 되네요. 여기에 (1) 얼마 안되지만 하드웨어적인 지연 및 (2) 상대방이 전문 처리에 대한 시간이 걸린다든지, 바쁘기 정도에 따른 상대방의 응답 지연을 예상해서 여유 시간을 1초나 2초, 또는 충분히 추가하여 대기 시간을 결정합니다.
상대방이 별로 바쁠일도 없고 한 경우, 예제에 대해서는 1.2초 정도 이므로 2초나 아니면 넉넉히 3초 정도로 결정합니다.
모뎀을 사용할 때에는
모뎀을 사용하지 않고 PC와 PC끼리 또는 PC와 보드, 보드와 보드처럼 DTE 끼리 통신한다면 보오율은 bps 와 같기 때문에 보오율을 bps 로 생각하고 계산하면 되지만 모뎀 같은 장비를 중간에 연결하여 사용했을 때에는 실제 통신 속도는 모뎀과 모뎀끼리의 속도이며, 모뎀 끼리는 변조와 복조를 하여 송수신 하므로 보오율과 bps 가 반드시 같지 않습니다.
즉, 아래와 같이 bps와 baud하고는 차이가 있습니다.
bps = baud * 한 번에 변조되는 비트 수
더 자세한 내용은 본 강좌 내용 중 시리얼 통신 - 통신 속도 결정을 참고하여 주십시오.
또한 모뎀을 이용하는 통신에서는 내 시스템과 상대방 시스템이 직접 연결하여 통신하는 것이 아니라 실은 모뎀하고의 통신입니다. 모뎀은 내 시스템에서 받은 데이터를 변조하여 상대방 모뎀에게 전송합니다. 자료를 받은 상대방 모뎀은 복조하여 시스템에 전송합니다. 즉, 상대방도 자기 모뎀하고 통신하는 것이지 내 시스템과 직접 통신하는 것이 아닙니다.
그러므로 이때의 통신 속도는 모뎀과 모뎀끼리의 통신 속도에 따라야 하며, 또한 연결할 때 마다 항상 같은 속도로 연결되는 것이 아니라 선로 상태에 따라 달라지므로 유의해합니다. 그러므로 모뎀을 이용하는 통신에서는 대기 시간의 여유를 더 충분히 주어야 합니다.
태그: *통신 *네트워크 *rs232 *protocol *프로토콜 *시리얼