1) Serial 통신 개념잡기
이번에는 Serial 통신에 대해서 기술을 하도록 하겠습니다.
거의 모든 사람들이 Serial 통신 하면 굉장히 난해 하다는 생각들을 합니다. 실은 필자도 Serial 통신에 대해 알기 전까지는 개념조차 파악을 못했고 정말 어려운 부분이구나 라는 막연한 생각만 했었습니다.
그러나 그렇게 어렵게만 생각되던 Serial 통신은 사실 알고나면 아무것도 아닌 것을 왜 그 시절엔 어렵게만 느껴졌을까? 하는 생각을 지금 해 봅니다.
왜 어려울까요?
그것은 책이 제대로 가르쳐주기 때문입니다. ???????????
책은 그야말로 정석을 잘 가르쳐 주지요....
RS-232C Cable연결부터 시작해서 CCITT,Vxx가 어쩌고 저쩌고.......정말 제대로 가르쳐 주지요?
물론 책들이 잘못 되었다고 말하는 것은 물론 아닙니다. 그러나 그렇게 기술한 책들을 초보자가 본다면 정말정말 헷갈립니다. 도대체가 무신말을 하는지 알 수도 없구요...
일전에 예를 한번 들었었는데 자료가 많다보니 업그레이드 하면서 자료가 도망갔나 봅니다. 아무리 찾아도 없네여......T_T
그럼 다시 쓰면 되지 뭘......
왕복16차선 도로면 편도 8차선 도로지요? 이 도로를 8대의 버스가 나란히 아주 나란히 가고 있었습니다. 아마도 수학여행을 가나 봅니다. 버스 안에는 형형색색의 옷을 입은 학생들이 타고 있군요 (무신 소설을 쓰나?)
그런데 앞에 공사중이군요 그것도 7차선을 모두 막고 한차선만 남겨 놨네요...반대차선도 마찬가지로 7차선을 모두 막고 한차선만 열어 놨습니다.
상상을 해 보세요....
그럼 8대의 차가 어떻게 빠져 나가야 할까요? 8차선의 차부터 하나하나 빠져 나가야 하겠지요?(참고로 중앙선 부근이 1차선) 그리고 8대의 버스가 다 빠져 나가면 다시 또 일렬로 버스가 가겠지요.....그리고 8대의 버스가 다시 올 때 마찬가지로 공사중이므로 한대한대 빠져 나와야만 합니다.
무언가 뇌리를 스치는 듯한.....?!!
그렇습니다. 8대의 버스가 일렬로 나란히 간다는 것은 바로 8BIT 병렬을 말하는 것이고 한대한대마다 버스가 공사 구간을 빠져 나가야 하는 것은 바로 직렬(SERIAL)을 의미 하지요. 이것을 데이터에 비유 한다면 8개의 비트가 나란히 가다가 어느순간 1비트 단위로 출력이 되는 것입니다.
그리고 다시 8비트로 재정렬하여 출력이 되는 것이죠...
여기까지는 이해가 되셨는지.....
이글을 쓰면서도 참 많이 고민 됩니다.
왜냐하면 기술적으로 써야만 되는 내용이 많은데 그러자니 아무것도 모르는 문외한은 모를테고...그래서 일단은 개념적인 것과 실제에서 어떻게 사용 하는지 또 CPU내에서는 어떠한 동작을 하는지에 대해서만 기술합니다.
중요한 것은 이러한 것들을 빨리 배우고 익힐려면은 직접 만들어서 프로그램을 짜야 쉽게 이해하실수 있다는 것입니다.
그럼 먼저 RS-232C에 대해서 설명 합니다.
SERIAL통신시 TTL LEVEL로 데이터를 전송하면 전송길이가 짧아 집니다. 그 이유는 선로저항에 의해 파형이 많이 뭉그러지지요... 또한 노이즈까지 발생한다면 원하는 데이터를 받을 수 없습니다. 그래서 이러한 TTL LEVEL의 전압을 +/-12V로 변환하여 출력하게 되는데.... 요즘은 전용칩등이 많이 있으므로 이러한 부품을 이용하면 됩니다.
대표적인 부품이 바로 MAX232입니다.
이것은 TTL 입력으로 +/-12V로 출력하며 또한 입력된 +/-12V를 TTL LEVEL로 변환하여 CPU와INTERFACE를 할 수 있도록 도와 줍니다. MAX232는 또한 내부적으로 절연입니다. 왜냐하면 차지펌프방식으로 +/-12V를 공급하기 때문인데 일단은 여기까지만 설명 합니다.
MAX232의 구조를 보면 TX 2PORT, RX 2PORT가 있습니다. 즉 2개의 TX/RX를 사용할 수 있도록 되어 있습니다. 제가 작성한 MC68HC11 START BASIC KIT을 보시면 1개의 PORT만 사용 하였습니다. 그런데 이상한 것은 CTS,RTS,DTR,DSR등은 전혀 사용 안한다는 것입니다. 왜 그럴까요?
그건 시스템의 사양에 따라 달라집니다. 만일 연결되는 장비의 SERIAL PORT의 단자가 위의 사양들을 요구 한다면 당연히 사용을 해야겠지요... 그러나 지금까지 이러한 장비들을 제작하면서 CTS등을 사용하는 장비는 모뎀외에는 보질 못한 것 같습니다.
즉 RS-232는 실제로 TX,RX,GND 단자만 있으면 어떠한 장비에도 접속을 할 수 있습니다. 그러므로 실제로 우리가 사용하는 단자는 위의 3단자외에는 극히 쓸일이 없다는 얘기겠죠.... PC를 예로들면 D-SUB 9PIN의 2번은 RX단자 3번은 TX단자 그리고 5번은 GND단자입니다. 그래서 우리가 만드는 장비도 연동시에는 상기 PC에 설정된 단자를 따라가죠...사실은 이것은 여러책을 보시면 아시겠지만 D-SUB 9핀 단자에 2번,3번,5번핀을 위와같이 정의 하였습니다. 여기까지 이해가 되셨습니까?
요점을 정리하면 D-SUB 9PIN단자의 2번,3,번,5번 단자외에는거의 쓸일이 없습니다. 자세한 핀의 설정은 책이나 다른 홈페이지를 보시면 많이들 설명이 되어 있습니다. 참고로 필자의 경험에 비추어 보면...RS-232C를 12M까지 깔아본 경험이 있는데 이 정도의 길이가 되면 노이즈가 상당히 많이 발생 합니다. 그러나 통신은 정상적으로 되더군요...
그리고 CABLE을 사용 하실 때는 전용 CABLE이 있습니다. 같은 4P SHIELD선이라도 RS-232C용이 있고 RS-422용이 있습니다. 만일 정상적이지 않은 예를들어 SHIELD가 되어 있지 않는다던가 하는 CABLE을 사용 한다면 아마도 통신 거리는 짧아질 것입니다.
그 다음 SERIAL통신에서 가장 중요한 것이 있습니다. 바로 PROTOCOL이라는 것이죠.... 아마도 다른책을 보신 분들은 통신규약이라는 말을 보시거나 들으신적이 있을 겁니다. 그럼 이것이 도대체 뭔말일까요? 통신규약이라는 것이 따로 있는건가? 이것은 바로 시리얼에서 상호간 통신시 어떠한 데이터를 보낸다하는 규약입니다. 즉 STX,ETX 라는 것 말입니다.
이러한 PROTOCOL은 따로 규정이 되어 있는 것이 아니라 바로 여러분이 작성을 해야하는 것입니다.
그럼 어떻게 작성 하냐구여? 왜 그런 것이 필요 하냐구여?
예를들어 설명해 보면....음...PC에서 당 홈페이지에 있는 BASIC KIT의 LED를 ON/OFF 하고 싶다할 경우에 어떻게 하실껍니까?
LED를 전부켜고 싶다. 그러면 SERIAL로 $00이라는 데이터를 보내야지? 하고 보냈습니다. 이것을 CPU내부에서 검증(통상적으로 우리는 디코딩이라고 한다.)하여 LED를 켰습니다. 즉 SERIAL로 $00이라는 데이터를 받으면 LED를 전부 켠다하는 명령어를 만들어서 데이터 수신시 이를 반영한 것이죠... 여기서 바로 $00 이 PROTOCOL이 되겠습니다. 간단 하지요?
PROTOCOL이라는 개념이 단방에 세워졌으니 말입니다.
그럼 간단한 프로토콜을 만들어 봅시다.
일단 $00일 때 모든불을 켜기로 하였습니다. 그런데 KIT는 LED가 모두 16개 즉 2BYTE 이지요 그럼 아래 [표 9-1]과 같이 만듭니다.
STX
DATA1
DATA2
ETX
$02
$00
$00
$03
[표 9-1]
자! 가장 기본적인 프로토콜이 완성 되었습니다. 위의 PROTOCOL이 송신하는 PROTOCOL이라면 이제 상대편은 DATA1 및 DATA2를 해석하여 LED의 점등 여부를 결정 하겠지요?
그런데 불을 켜야하는 LED는 모두 16개인데 왜 2BYTE만 사용 했을까요? 16BYTE를 사용해야 하는데.... 하는 사람들도 있을지 모르지만 위의 PROTOCOL로 모두 제어가 가능 합니다.
왜냐하면 한 개의 LED에 1BIT가 할당되므로 모두 16BIT가 되지요 그러므로 2BYTE만으로도 LED의 점등이 가능 합니다. 즉 BIT를 제어하여 LED 16개를 점멸 하겠다는 내용입니다.
그런데 한가지 문제가 있습니다. 뭐냐하면 DATA1이나 DATA2중에 STX나 ETX의 DATA가 있다면 곤란 하거든여....
그 이유는 프로그램을 어떻게 짜느냐에 달려 있지만 위와 같이 PROTOCOL을 정의 하면 DATA1 또는 DATA2에 $03이라는 DATA가 있으면 ETX DATA와 같으므로 추후 DATA의 해석시 해석이 안되는 결점이 있습니다.
각설하고 여하튼 여러분은 SERIAL통신을 하기 위해서는 이 PROTOCOL이라는 것을 만들어야만 합니다. 그렇지 않으면 SERIAL 통신은 시작도 못해보고 접게 되는 것이죠...
이제 PROTOCOL이라는 개념을 좀 잡으셨습니까?
마지막으로 한번더 설명 하겠습니다.
우리가 위의 PROTOCOL을 GENERAL PORT에 WRITE하면 음...만일 STX를 WRITE한다고 하였을 때... 음 BIT0은 '0' 그리고 BIT1만 '1'이 되는군요 그리고 나머지 BIT는 모두 '0'네요.......
즉 병렬처리에서는 8개의 BIT가 모두 한번에 출력이 되지만 SERIAL에서는 한 개의 BIT씩 한 개의 PIN으로 출력이 된다고 생각 하시면 됩니다. 그리고 한 개의 BIT가 출력이 되는 시간은 우리가 흔히 말하는 9600bps(9.6KHz)라고 생각하시면 되는거죠...
그러므로 병렬처리는 한번에 8개의 PIN에서 8개의 출력이 발생 하므로 속도가 빠르겠지요? 그러나 SERIAL통신은 2개의 PIN을 사용해서 8개의 DATA를 주고 받아야 하므로 속도가 느리겠죠...
그런데 사람들은 왜 SERIAL통신을 쓸려고 할까요? 그것은 바로 선 가닥수가 얼마 되지 않기 때문이지요.. 또한 접속도 용이하고.....
만일 멀리 떨어진 곳에 대국장치가 있다면 8가닥의 선을 끌고 가는 것이 좋을까요? 아니면 단 3가닥(GND 포함)의 선을 끌고 가는 것이 효율적일까요?
bps(Bit Per Sec)의 정의는 초당 대국에 보낼 수 있는 DATA BIT의 갯수를 나타냅니다. 이론적으로 9600bps라면 초당 9600개의 BIT를 보낼 수 있다는 것이죠...
이제 대충 감이 오시나요?^^;
두서없이 설명은 했지만 약간의 감이라도 잡으셨다면 다행입니다.
나머지는 이제 실습에 들어가서 배우기로 하겠습니다.