블로그 이미지
짱의 꽁기꽁기 월드입니다 ㅎ Baracuda

카테고리

분류 전체보기 (4858)
Days of my life (45)
좋은 글 좋은 생각 (93)
Cartoon~ (114)
Funny, HaHa (4450)
Music~ (6)
보울~~~링 (46)
Etc (59)
Private (13)
Utility (14)
XK2 (1)
Forte Koup (5)
Total
Today
Yesterday

'시리얼통신'에 해당되는 글 2건

  1. 2008.01.04 시리얼 통신 - 하이퍼 터미널이용해서
  2. 2007.12.26 시리얼 통신 관련 링크

1 시리얼통신의 이해
1) 용어 설명
 ① RS-232 (보장사용거리:약15m)
 RS-232C 규격은 미국의 EIA(Electronic Industries Association),현 TIA(http://www.tiaonline.org )에 의해 규격화 된 것으로 정확하게는 EIA-RS232C 규격이라 부르며 전기적/기계적 특성과 인터페이스 회로의 기능 등을 정의하고 있습니다.
 
 RS-232C는 컴퓨터들과 그 주변의 장치들 간에 비교적 느린 속도의 직렬 데이터 통신을 하기 위한 물리적 연결과 프로토콜에 관해 기술하고 있는 오래된 표준입니다 (현재의 가장 보편적으로 사용하는 버전이 "C"입니다.).
 RS-232C는 컴퓨터가 모뎀과 같은 다른 직렬장치 들과 데이터를 주고받기 위해 사용하는 인터페이스입니다.

 RS-232C가 규격화 되던 시절의 시대적 배경을 생각 해보면 통신의 주 목적은 본사의 컴퓨터와 지사의 컴퓨터를 모뎀을 통하여 서로의 데이터를 주고 받는 것이 주 목적이 아닐까 생각합니다.
컴퓨터로부터 나오는 데이터는 보통 메인보드 상에 있는 UART 칩에 의해 DTE 인터페이스로부터 내장(또는 외장) 모뎀이나 기타 다른 직렬장치 들로 전송이 됩니다.

또한 모뎀이나 다른 직렬 장치와 RS-232C 표준에 입각하여 통신하는 컴퓨터쪽의 DTE 인터페이스는 DCE 인터페이스라고 불리는 보완적인 인터페이스를 가지고 있습니다.
즉,초기에 정의된 RS-232c의 목적은 DTE(컴퓨터)와 DCE(모뎀)의 연결을 표준으로 하고 있습니다.
뒤에서도 다시 언급이 있겠지만 이런 이유로 인해서 사용하는 케이블의 배선방법이 달라집니다.
DTE 와 DCE를 연결하려면 1:1케이블(스트레이트 케이블)을 사용하며 DTE 와 DTE를 연결 하는 방식에서는 Null Modem Cable(혹은 Cross 케이블)이라고 부릅니다.

컴퓨터 내에 있는 데이터는 병렬회로를 따라 흐르지만 직렬장치 들은 오직 한번에 한 비트씩 만을 처리할 수 있기 때문에, UART 칩이 병렬로 되어 있는 비트들을 직렬 비트 열로 변환시킵니다.

다음의 항목들은 RS-232C의 전기적 특성입니다.
송신부 - 무부하 출력   :  ≤ 25V
송신부 - 부하 출력     :  5V∼15V
송신부 - 단락 출력 전류 :  ≤500mA
송신부 - 파워온시 특성  : ≥300Ω
수신부 – 입력저항   : 3㏀∼7㏀
수신부 – 히스테리시스  : ±3V
수신부 - 입력 최대전압  : ±25V
최대 케이블 길이    :  15m
최대 전송속도     :  20kbit/sec
신호 논리(부논리)    :  - TRUE : LOW (-3V 이하)
          - FALSE : HIGH(+3V 이상)
- 전송하지 않을 경우 : LOW
 

 위에서 얘기한 전기적 특징은 송/수신측의 전압 레벨과 라인의 입출력 저항 그리고 입력 스레쉬 홀드 및 펄스의 상승특성 등을 구성한 것으로 표준 인터페이스의 하나로서 데이터를 직렬로 전송하는 방법을 사용합니다.

 따라서 비교적 속도가 느리고 하나의 인터페이스에 대하여 하나의 단말장치 밖에 연결 할수 없으며 전송거리또한 상당히 제한적이긴 하지만 배선수가 적고 접속이 용이하다는 장점때문에 많이 사용합니다.
 
 RS-232C는 2개의 송.수신 신호선(TX/RX) 과 5개의 제어선( CTS/RTS , DTR/DSR , DCD ) 그리고 2개의 접지선 ( SG, FG ) 이 필요합니다.

 참고로 RS-232C에서 의 232는 전기공업협회에서 232번째 제정한 규정이라는 것입니다.( RS-232C : Recommended Standard 232 Revision C )

 따라서 직렬통신의 단점을 보완하는 규정들이 422번째,485번째 만들어지게 되었고 그들을 RS-422,RS-485라고 부릅니다.
 이들은 RS-232C의 전송거리가 짧은 이유가 선로상에 발생하는 잡음 및 전송선로에 의한 전압강하 때문이라고 생각하고 잡음에 강한 방식으로 데이터를 보내게 됩니다.

 즉 양쪽의 그라운드가 동일한 시점에서의 송수신할 때 잡음이 발생하면 신호가 약해지며 신호를 정확히 판단하지 못합니다. 그래서 송신을 +,- 로 분리해서 부논리를 쌍으로 보내는 방법을 택하여 잡음이 발생할 때 같이 감쇄되어 수신측에서는 보상을 하여 신호로 인식한다는 원리로 전송거리는 약 1.2킬로 정도 까지 보장을 합니다.

 또한 일대일 통신 의 단점을 보완해서 1:N 혹은 N:M으로 다중통신이 가능하게 만드는 규정도 생겨납니다.


② RS-422 and RS-423 (보장사용거리:약1.2k)
 직렬통신의 단점을 보완하는 규정 422번째,485번째 만들어진 것으로 RS-422와 RS-423은 EIA에 의해 승인된 직렬 장치 접속용 표준 인터페이스입니다.
 이 표준들은 더 빠른 속도를 제공하면서도 전기적인 간섭에 더욱 강해졌기 때문에, 이전의 표준인 RS-232를 대체할 목적으로 설계되었습니다.
 RS-423이 오직 점대점 접속만을 지원하는데 비해, RS-422는 멀티포인트 접속을 지원합니다.


③ RS-485(보장사용거리:약1.2k)
 RS-485는 멀티포인트 통신회선을 위한 TIA/EIA 표준입니다.
 이것은 DB-9이나 DB-37과 같은 커넥터들을 지원합니다.
 RS-485는 RS-422와 비슷하지만, 낮은 임피던스를 가지는 구동기와 수신기를 사용함으로써, RS-422보다 회선 당 노드 수를 더 많이 허용합니다.


④ 프로토콜
 프로토콜 본래의 의미는 외교에서 의례 또는 의정서를 나타내는 말이지만, 네트웍 구조에서는 표준화된 통신규약으로서 네트웍 기능을 효율적으로 발휘하기 위한 협정입니다. 즉, 통신을 원하는 두 개체간에 무엇을, 어떻게, 언제 통신할 것인가를 서로 약속한 규약이라고 볼수있습니다.

 컴퓨터 네트웍의 규모가 증가되고 네트웍을 이용한 정보전송 수요가 다양화되며, 소프트웨어와 하드웨어 장비가 계속 증가되는 최근의 환경에서, 효율적인 정보 전달을 하기 위해서는 프로토콜의 기능이 분화되고 복잡해질 수밖에 없습니다.. 따라서 이러한 환경적인 요구를 만족하기 위해서는 프로토콜 계층화의 개념이 필요하게 되었습니다.

 프로토콜 계층화의 개념은 마치 구조적 프로그래밍 개념과 비슷한데, 각 계층은 모듈과 같으며 각 계층의 수직적 상하관계는 top-down 구조와 같습니다. 즉, 네트웍의 프로토콜 계층화는 하위계층이 상위계층을 서비스하는 것과 같으며 호출 프로그램과 피호출 프로그램의 매개변수 상호전달 방식 또한 상위계층이 하위 계층의 서비스를 받을 때와 같은 매개변수 전달방식과 같습니다.. 이러한 프로토콜 계층화 개념을 받아들여 상품화한 것이, IBM사가 1974년에 내놓은 SNA (system network architecture)입니다.

 SNA의 목적은 IBM사 제품뿐만 아니라 다른 회사 제품과의 컴퓨터 기기 상호 접속시 발생되는 여러 종류의 호환성 문제를 해결하는 것이었습니다. SNA 이후 다른 회사들도 각자의 네트웍 구조를 내놓았는데, 이들의 목적 또한 네트웍간의 호환성 유지와 정보전송 최소화에 있습니다.

 특히 인터넷에서는 TCP/IP라는 프로토콜을 사용하는데 그 내용은 다음과 같습니다.
 TCP (Transmission Control Protocol)는 정보 패킷 차원에서 다른 인터넷 노드와 메시지를 상호 교환하는데 필요한 규칙을 사용하며, IP (Internet Protocol)는 인터넷 주소 차원에서 메시지를 보내고, 받는데 필요한 규칙을 사용합니다.
 
 결론적으로 프로토콜이라는 단어의 의미는 두 개체간의 통신에 있어서의 약속입니다.
 우리가 무전기를 사용할때 마지막에 '오버'라는 말을 붙이는 것 처럼 상대방이 듣고있다가 '오버'라는 말이 나오면 송신이 끝났음을 알고 자신이 할 얘기를 하는것과같은 약속의 의미입니다.


⑤ DTE (Data Terminal Equipment) ; 데이터 단말 장치
 컴퓨터 데이터 통신에서 DTE는 컴퓨터가 모뎀이나 기타 다른 직렬장치를 이용하여 데이터를 교환하기 위한 RS-232C 인터페이스입니다.


⑥ DCE (Data Communication Equipment) ; 데이터 통신 장치
 컴퓨터 통신에서의 DCE는 모뎀이나 다른 직렬장치들이 컴퓨터와 데이터를 주고받기 위해 사용하는 RS-232C 인터페이스를 의미합니다.


⑦ 병렬통신의 종류 LPT (Line Print Terminal)
 LPT는 프린터나 기타 다른 장치에 접속하기 위한 PC의 병렬포트를 지칭하는 통상적인 호칭입니다.
 대부분의 PC들은 하나 또는 두 개의 LPT 접속을 가지고 있는데, 이들 각각을 LPT1과 LPT2라고 부릅니다.. 어떤 시스템들은 세 번째 포트인 LPT3를 지원하는 것도 있습니다. 그러나, 몇 개가 지원되든 간에 보통 LPT1이 디폴트값입니다.
 사용자는 자신의 컴퓨터에 병렬포트 어댑터를 장착함으로써, 두 번째 프린터나 기타 다른 장치용 병렬포트를 추가할 수 있습니다. LPT 포트는 QuickCam이나 CU-See-Me와 함께 쓰이는 비디오카메라 등과 같은 입력장치에도 사용될 수 있습니다.

 병렬 접속에는 전통적으로 프린터 통신을 위한 센트로닉스 인터페이스가 사용되어 왔습니다. EPP/ECP라고 불리는 새로운 표준은 기존의 구형 인터페이스는 물론, 스캐너나 비디오카메라 등을 포함한 다양한 범위의 장치들에 대해 더 빠른 통신을 지원합니다.
     
프린터포트는 3개의 주소를 가집니다. 데이터 출력 포트, 상태 포트, 제어 포트입니다.
LPT1의 경우 기본주소는 378h입니다. 이때 상태 포트 주소는 379h가 되며,제어 포트 주소는 37Ah입니다.
또한 상태 레지스트 포트의 내용은 프린터에러 및 종이 유무 및 기타 작동 상태등을 나타냅니다.
     
⑧ 병렬통신의 종류 GPIB (General Purpose Interface Bus)
컴퓨터와 주변 기기를 연결하여 정보를 전달하기 위한 외부 버스의 일종입니다.
일반적으로 약어로 불리며, ‘범용 인터페이스 버스’라고도 합니다.
원래는 휴렛패커드(HP-현 Agilent)사가 개발하여 자사의 이름을 따서 HPIB라고 한 것인데, 미국 전기 전자 학회(IEEE)가 1975년경에 IEEE 488로 표준화하였으며 이것을 기본으로 하여 국제 전기 표준 회의(IEC)가 IEC 625로 표준화하였읍니다.

GPIB는 컴퓨터와 각종 전자 계측 기기, 센서, 자동 시험 기기 등 생산 자동화 관련 기기를 연결하여 정보를 교환하거나 컴퓨터로부터 계측 기기 등을 제어하기 위한 외부 버스의 사실상의 업계 표준 또는 국제 표준이 되어 있지만 일반적인 PC에서는 많이 사용되지 않습니다.
초기의 GPIB의 성능은 최대 전송 속도가 초당 1MB, 최대 접속 가능 기기 15대, 최대 케이블 길이 20m였으나 점차 데이터 전송 속도를 고속화하고 있는 실정입니다.
     
GPIB 인터페이스를 사용하기 위해서는 별도의 GPIB Board 를 사용 해야 하며 가장 많이 사용하는 GPIB Board는 National Instrument사와 Agilent사에서 만든 Board입니다.


2 하드웨어적인 준비.
1) 직렬통신으로 장비를 제어하려고 하거나, 시리얼통신으로 제어가 되는 장비를 만들려고 할때는 다음의 순서에 따라 시험하시기 바랍니다.
① 제어 보다는 모니터링 즉, 수신을 먼저 목적을 가져야 합니다.
② 프로그램을 만들려고 하기 전에 기존의 프로그램으로 충분히 시험합니다.
③ 기존의 프로그램이란 범용 통신 프로그램으로 하이퍼터미널과 같은 프로그램으로 이미 기능상의 검증을 받은 프로그램을 말합니다.
④ 시리얼 포트의 연결 방법은 3선식만 알아도 99% 가능하므로 다음의 결선 방식을 참고바랍니다.

9핀 9핀
2번 (RX) 3번 (TX)
3번 (TX) 2번 (RX)
5번 (SG) 5번 (SG)
   
   
25핀 25핀
2번 (TX) 3번 (RX)
3번 (RX) 2번 (TX)
7번 (SG) 7번 (SG)
   
   
9핀 25핀
2번 (RX) 2번 (TX)
3번 (TX) 3번 (RX)
5번 (SG) 7번 (SG)
⑤ 주의점은 통신설정창의 흐름제어를 양쪽의 설정을 동일하게 ‘없슴’으로 설정하십시오.
⑥ 이와 같은 방법은 초보가 아니라 전문가도 꼭 거쳐야 문제가 적다는 점을 알기 바랍니다.
⑦ RS-422, RS-485 등의 시리얼 통신을 해야 할 경우는 232 TO 422/485 컨버터를 이용하시기 바랍니다.
⑧ 상기의 과정이 완전히 익숙하지 않은 분은 프로그램을 시도하지 않으시는게 좋을 줄로 생각합니다.  반대로 상기과정이 익숙하시면 프로그램으로 통신하는데  일단 모든 걱정을 던져 버리시기 바랍니다.


2) 에코시험 (Loop Back Test )
① 자신의 컴퓨터의 직렬포트에 맞는 케이블을 연결합니다.
② 하이퍼터미널을 실행하여 직접 연결로 COM1을 설정하는데 나머지는 디폴트로 있는 그대로 하되 흐름제어는 없음이나 XON/XOFF로 합니다.
③ 나머지 설정은 스스로 터득하시기 바랍니다.
④ 연결한 케이블 끝단 커넥터의 2번과 3번 핀을 찾아내어 쇼트를 안정하게 시켜두고 하이퍼터미널에서 키보드 입력을 했을때만 문자가 에코 된다면 성공입니다.
⑤ 위의 시험이 성공한다면 다른 포트로 옮겨서 다시 시험하시기 바랍니다.

3) 두 포트간의 통신 시험.
① 위의 2가지 시험이 잘 되었으면 이젠 케이블을 수정하는데 한쪽만 2번과 3번 핀의 연결을 바꾸어 연결한다.  이걸 널 모뎀케이블이라고 합니다.(위의 케이블 결선도를 참고 바랍니다.)
② 그럼 COM1과 COM2사이에 널모뎀 케이블을 연결하고 두개의 통신프로그램에서 교대로 입력하여 상대 창에 전송되면 시험 종료입니다..
③ 그 상태에서 자주 각종 설정에 따른 변화를 터득하고 기술을 습득하고 프로그램 개발시에도 시험의 무대로 삼기 바랍니다.

4) 널모뎀케이블
초창기에는 데이터 통신이 대부분 모뎀을 통하여 이루어졌습니다.
그러나 세월이 흘러 개인용 컴퓨터의 보급이 엄청나게 늘어나고 이에 따라 모뎀을 이용하지 않고 컴퓨터끼리 통신을 해야할 일의 필요성을 느끼게 되었습니다.
이때 생겨난 것이 널 모뎀 케이블입니다. (위의 케이블 결선도를 참고바랍니다.)
모뎀이 없으면서도 통신을 하게 해주는 케이블인셈이지요.
즉 DTE – DCE의 통신이 아닌 DTE – DTE 의 통신이 필요한것이지요.
이때 사용하는 케이블은 Direct (Straight) 방식이 아닌 Cross(Twist) 방식의 케이블을 사용합니다.
송신과 수신을 서로 교차되게 연결하고 접지를 같이 연결한 케이블이 널모뎀 케이블입니다.


5) 루프백 커넥터
루프백 커넥터는 루프백 시험을 하기 위한 커넥터입니다.
루프백 시험은 통신 기기가 제대로 동작하는지 알아보기 위한 시험으로서 통신 기기의 송신부와 수신부를 연결하여 자기가 보낸 데이터를 다시 자기가 받아보도록 하여 통신 기기의 이상유무를 판단할 수 있도록 합니다. 이는 다른 기기가 없이 혼자서도 해볼 수 있는 간단한 시험입니다.
 
6) 모뎀을 이용한 통신
모뎀이라해서 크게 어려운건 없읍니다.

모뎀의 기능은 컴퓨터에서 나오는 디지탈 신호를 아날로그 신호로 바꿔서 멀리가게 하는 기능과 아날로그신호로 들어오는 데이터를 다시 디지털 신호로 바꿔주는 기능이라고 보시면 됩니다.

일반 시리얼 통신과의 차이점은 접속해야하는 과정 뿐입니다. 그이후에는 똑같죠.

우리가 일반적으로 사용하는 모뎀은 헤이즈호환 모뎀이라고 합니다.
그렇기 때문에 모뎀에 보내는 명령은 'AT'라는 헤더를 가집니다.
먼저 수신측 프로그램이 가동되면서 모뎀에 'ATS0=1'이라는 명령을 보냅니다.
다음과 같은 코드로 표현됩니다.
MSComm1.Output = “ATS0=1” & vbCrLf

자세한 정보는 모뎀관련 매뉴얼에 자세히 나와있읍니다.

그리고 송신측에서는 접속이 필요한 시점에서 전화를 거는기능이 있어야겠죠?
'ATDT 123-4567'이라고 명령을 주면 됩니다.

그러면 모뎀이 전화를 걸게 되고 수신측에서는 링이 울립니다.

그러면 수신측 모뎀은 응답을 하게됩니다.

그때 수신측/송신측 모뎀은 서로의 조건을 확인합니다.

서로의 조건이 맞다면 양쪽 컴퓨터에 접속완료 메세지가 뜹니다.
이때 응답코드가 문자로 나타날지 숫자코드로 나타날지는 모뎀에 설정한 값에의해 결정됩니다만..
어쨌던 모뎀에서는 결과가 나옵니다.
만약 수신측이 통화중이라면 'BUSY'가 나올테고
정상적으로 접속이 되면 'CONNECT 9600'등이 나옵니다.

이때부터는 일반 직렬통신과 같이 보시면 됩니다.


아래에 간단히 절차를 순서대로 적도록 하겠읍니다. 참고 하시길..

(송) 이라고 한것은 송신측 컴퓨터이고 (수)라고 한것은 수신측 컴퓨터입니다.
물론 양쪽의 포트 속성은 똑같이 맞추셔야 하는건 아시겠지요?

(수) 포트를 연다.    Ex) MSComm1.PortOpen = True
(수) 'ATS0=2'를 보낸다   Ex) MSComm1.Output = "ATS0 = 2" & vbcr
(송) 포트를 연다    Ex) MSComm1.PortOpen = True
(송) 전화를 건다     Ex) MSComm1.Output = "ATDT 123-4567" & vbcr
(수) 링이 울린다     Ex) 따르릉~~
(수) 두번째 링이 울린후 빈대떡 부치는 소리가 들린다..
(송) 이에 뒤질세라 해물파전 부치는 소리가 들린다..
(송,수) 거의 동시에 접속 완료 메세지가 나타난다.
문자일경우도 있고 부호일경우도 있다. 일반적으로 'Connect xxx'
----- 여기까지가 접속 과정입니다. ------

(송) 온도를 구하는 명령을 보낸다.   Ex) MSComm1.Output = "N0303" & vbcr
(수) 명령을 받은후 현재의 온도를 보낸다..
(송) 수신버퍼를 확인하여 화면에 표시한다..

----- 모든 작업이 끝났다고 가정합니다. -----
(수) 모뎀을 자동응답기능을 해제합니다.   Ex) MSComm1.Output = "ATS0 = 0" & vbcr

(수) 전화를 끊습니다.        Ex) MSComm1.Output = “ATH0” & vbcr
(송) 전화를 끊습니다.        Ex) MSComm1.Output = “ATH0” & vbcr


7) D-Sub 커넥터의 핀 구성
9핀 25핀 신호명 입/출력 구분 설명
   
 1 FG - 보호용 접지 (Frame Ground)
2 3 RXD 입력 수신 데이타 (Receive Data)
3 2 TXD 출력 송신 데이타 (Transmitted Data)
7 4 RTS 출력 송신 요구 (Request to Send)
8 5 CTS 입력 송신 허가 (Clear to Send)
6 6 DSR 입력 데이타 세트 레디 (Data Set Ready)
5 7 SG - 신호용 접지 (Signal Ground)
1 8 DCD 입력 수신 캐리어 검출 (Carrier Detect)
4 20 DTR 출력 데이터 단말 레디 (Data Terminal Ready)


3 기본 통신 개통시험.
처음부터 프로그램을 개발하기 보단 정확히 하드웨어적으로 정상적인지를 테스트 해보아야 합니다.
그러기 위해서는 단순해 보이지만 오랜 시간동안 Test되었고 확실하다 싶은 프로그램으로 Test를 해보아야 합니다.
그러한 대표적인 프로그램으로 하이퍼 터미날을 이용하시기 바랍니다.
 
1) 하이퍼 터미널을 이용한 통신 시험
① 보조프로그램에서 하이퍼 터미날을 선택하여 새로 등록합니다.
 

사용자 삽입 이미지

② [주의사항] – 모든 항목에 대해 동일해야 합니다.


③ 새로 만든 하이퍼 터미날의 등록정보를 엽니다.

사용자 삽입 이미지

④ 연결대상에서 사용할 모뎀 COM Port를 지정합니다.
⑤ 설정에서 “ASCII설정”에서 아래와 같이 지정합니다.


사용자 삽입 이미지


사용자 삽입 이미지

사용자 삽입 이미지

 
 TEST1 COM1 PORT OPEN]
   
⑥ TEST1에서 입력.

비베에서 바라본 시리얼통신.
1) 먼저 알아야 할 내용.
① 통신 속성들
 - 전송 속도 는 데이터를 보내는 속도를 얘기합니다.
단위는 bps(bit per second), 초당 전송되는 비트수를 얘기합니다.
그렇다면 우리는 흔히 8비트 통신을 하게 되는데,
만약 9600bps라고 설정 한다면 초당 9600비트이므로
바이트로 환산 하면 9600/8 이 됩니다.
그러면 1200바이트/초 가 이론적으로는 계산이 됩니다만..
실제 한바이트가 8비트로 전송이 될때는 다른 비트들도 계산해주어야 합니다.
시리얼 통신으로 데이터를 보내게 되면 다음의 순서로 데이터가 송신 됩니다.
시작비트 – 데이터비트 – 패리티비트 – 종료 비트
이때 시작비트는 항상 1비트,데이터 비트는 7비트혹은 8비트,
패리티를 사용하면 1비트,사용하지 않으면 0비트,종료 비트는 선택에 따라 1,1.5,2비트가 나갑니다.
예를들어 우리가 흔히 사용하는 속성인 9600,n,8,1를 예를 들어 보겠습니다.
전송속도-9600
패리티 – 없슴
데이터 – 8비트
종료비트 – 1비트
이렇게 되면 1바이트의 데이터 전송될 때 실제 나가는 비트수는 총 10비트입니다.
시작 1비트 + 데이터 8비트 + 종료 1비트 = 10비트
따라서 9600보레이트의 경우 바이트로 환산 하면 960바이트가 1초에 전송이 되는 것이지요.
이렇게 계산 해보면 1바이트 문자가 전송되는데는 약 1밀리초가 소요됩니다.
이 내용은 수신시에도 그대로 적용이 됩니다.
우리가 흔히 범하기 쉬운 오류는 데이터를 송신 하고는 바로 수신 버퍼를 읽어온다는 것입니다.
우리가 데이터를 보내면 오로지 데이터를 보내는데만 걸리는 시간이 있으며,
수신측에서는 그 데이터를 받아서 처리하는데 걸리는 시간도 있을것이며,
수신측에서는 그에 응하는 응답을 보내게 될 때 그 데이터 길이에 따른 수신완료시의 시간이 있다는 것을 흔히 무시하는 경우가 있습니다.
다시 예를 들어 보겠습니다.
컴퓨터에서 ‘Hello?’라는 명령을 보내면 상대측에서는 곧 바로 ‘I am here.” 라는 응답을 보낸다는 가정을 해보도록 하겠습니다.
아까 얘기한 송신후 바로 수신하는 경우의 코드는 다음과 같습니다.
MSComm1.Output = “Hello?” & vbCr
MsgBox MSComm1.Input

이 코드는 데이터를 보낸후 바로 수신버퍼에서 읽고 끝냅니다.
그러나 이 경우 데이터가 정상적으로 수신되기 힘듭니다.
Output 명령 이후 Input 명령까지의 시간 간격이 적어도 20밀리초 이상이 소요되는 초울트라수퍼캡 저속 컴퓨터라면 가능합니다.
하지만 실제 상황은 그렇지 못합니다.

따라서 이 경우 데이터가 수신이 될때까지 기다리기 위해서 다음의 같은 방식으로 처리를 해주려고 합니다.
MSComm1.Output = “Hello? “ & vbCr

Do
  Doevents
  If MSComm1.InBufferCount > 0 Then Exit Do
Loop
MsgBox MSComm1.Input

이 코드는 처음 코드에 비해서는 기능이 향상 되었지만 그래도 문제점은 남아있습니다.
다시 생각해보면 명령을 내보내고 수신버퍼에 데이터가 들러오기 시작하면 루프를 빠져 나갑니다.
그리고 데이터를 수신버퍼에서 읽어옵니다.
이 경우의 문제는 수신버퍼에 있는 데이터를 읽으려는 시점이 모든 데이터가 다 수신완료된 시점이 아닐수도 있다는 문제입니다.
즉,데이터를 수신중인데도 수신완료로 생각해버린다는 문제이지요.

따라서 이 경우는 종료부호를 이용하여 통신을 한다면 종료부호를 체크해서 수신완료로 보는 방법과 수신될 바이트수를 알고 있는 경우라면 그 수신하고자 하는 만큼의 데이터가 들어왔는지를 확인 하는 방법과 데이터 수신중에 발생하는 수신 블록간의 갭을 이용하여 수신 완료로 보는 등의 방법을 강구해야 합니다.

다음의 코드를 참고하시기 바랍니다.
이 경우는 종료부호를 확인 하는 방법입니다.

MSComm1.Output = “Hello?” & vbCr

RBuf$ = “”
Do
  DoEvents
  If MSComm1.InBufferCount > 0 Then
   Rbuf$ = Rbuf$ & MSCOmm1.Input

   If Instr(Rbuf$,vbCr)>0 Then Exit Do
  End If
Loop


② QUEUE
큐는 순서를 가지고 있는 선형리스트 구조입니다.
요소의 삽입과 인출(삭제)가 다른 구조로 되어있으며 매표소에서 입장권를 사기 위해서 줄을 서서 기다리는 사람들의 모습을 생각하시면 됩니다.(물론 새치기는 허용이 되지 않습니다.)
여기서는 먼저 들어간 요소가 먼저 인출이 되므로 선입선출,혹은 FIFO(First In First Out)이라고도 합니다.
그리고 요소의 삽입이 일어나는 곳을 꼬리(Rear)라고 하며 인출이 일어나는 곳을 머리(Front)라고 합니다.

③ STACK
스택은 한쪽 끝이 막혀있는 구조로서 요소의 삽입과 인출이 한쪽끝에서만 일어나는 선형 리스트 구조입니다.
밑이 막혀있는 통을 세워놓은 구조를 생각하시면 됩니다.
여기서는 나중에 들어간 요소가 먼저 인출이 되게 되어있는 구조이므로 후입선출,혹은 LIFO(Last In First Out)이라고도 합니다.
요소의 삽입,인출이 일어나는 곳을 스택의 상위(Top)이라고 부르며 요소를 스택에 넣는 것을 푸쉬(Push)라고 부르며 요소를 인출하는 것을 팝(Pop)이라고 합니다.
스택은 서브루틴 호출이나 인터럽트 처리시 돌아갈 주소를 저장하는 용도로 많이 쓰이기도 합니다.

④ CIRCLE QUEUE
비베에서 가지는 통신용 버퍼에는 두가지가 있습니다.
수신버퍼와 송신 버퍼입니다.
이 버퍼의 크기는 각각 MSComm의 속성중 InBufferSize와 OutBufferSize의해서 결정이 됩니다.
우리가 주로 프로그램에서 많은 고민을 하는버퍼는 수신버퍼입니다.
따라서 지금부터는 수신 버퍼를 기준으로 설명 드리도록 하겠습니다.
수신버퍼는 환형큐라고 부르는 구조로 되어있습니다.
이 환형큐는 기본 구조 및 동작은 일반큐와 같으나 머리와 꼬리가 붙어있는 환형으로 되어있는 것이 다릅니다.
이 환형큐의 특징은 두개의 포인터를 가지고 있습니다.
하나의 포인터는 통신포트에 도착한 데이터를 수신버퍼에 갖다놓은 위치를 가리키고 있으며, 이 포인터를 외부포인터라고 부르겠습니다.
또 하나의 포인터는 응용프로그램에서 가져올수 있는 수신버퍼의 위치입니다.
이 포인터는 내부포인터라고 부르겠습니다.
다음의 그림을 참고 하시기 바랍니다.

각각의 격자에는 수신되는 데이터가 바이트 단위로 적재가 됩니다.
위의 그림처럼 외부포인터와 내부포인터가 마주 보고있다면 더 이상 버퍼에 남은 데이터가 없는걸로 생각하여 InBufferCount가 0이 됩니다.

먼저 다음의 그림을 보시면서 데이터의 흐름을 생각해보시기 바랍니다.

외부에서 발생한 데이터가 통신 포트에 도착하면 CPU 및 통신드라이브는 그 데이터를 1바이트씩 묶어서 메모리에 갖다 둡니다.
이때의 메모리는 수신버퍼로 생각하시면 됩니다.
그러면 우리가 만들거나 이미 만들어진 통신 프로그램에서는 수신버퍼에 들어와있는 데이터를 확인 하여 메모리로부터 가져오게 됩니다.
즉,우리의 응용프로그램에서는 통신포트로부터 직접 데이터를 가져오는게 아니며 통신 드라이브가 데이터를 바이트 단위로 묶어서 수신버퍼(메모리)에 갖다두면 그때 우리가 데이터를 얻을수 있는 구조로 되어있다는걸 생각하시기 바랍니다.

자, 실제 예를 들어 보겠습니다.
지금 외부에서 보낸 데이터가 있습니다. ‘12345” 라는 문자가 들어왔다고 하겠습니다.
물론 Input명령은 아직 사용하지 않았습니다.
그러면 다음과 같은 그림이 그려집니다.

아직 데이터를 가져가지 않았기 때문에 두개의 포인터는 벗어나 있습니다.
이때 InBufferCount를 보면 두 포인터의 차이를 계산해서 5라는 값이 나옵니다.
이때 InputLen라는 속성을 2로 하고 Input을 해보면 다음의 그림과 같이 됩니다.

즉 두바이트를 인출 시켜서 응용프로그램에 돌려주고는 내부포인터의 위치가 변경이 됩니다.
그리고 다시 데이터가 들어왔다고 가정합시다.
이번에는 ‘ABCD” 가 들어 왔다면 다음 그림처럼 데이터가 누적이 됩니다.

이번에는 InPutLen속성을 0으로 주고 다시 읽어봅니다.
물론 MSComm1.Input으로 읽겠지요?
그러면 버퍼에 남아있던 모든 데이터를 다 되돌려주고 두 포인터는 서로 마주 보게 됩니다.
다음의 그림처럼..

자, 여기서 정리를 해보겠습니다.
우리가 사용하는  MSComm의 수신버퍼는 환형큐로 되어있습니다.
이 환형큐보다 더 큰 데이타가 들어오거나 우리가 미처 수신 데이터를 가져가기전에 다른 데이터가 들어온다면 버퍼내에서는 오버런이 발생합니다.
이때는 이전의 데이터는 없어지면서 그 위에 덮어쓰게 됩니다.
그리고 InputLen은 한번의 Input명령에 수신될 바이트를 지정한다는건 이해가 되셨을겁니다.
그리고 InBufferCount의 속성은 두개의 포인터의 차이를 되돌려주며 이는 수신 버퍼에 남아잇는 데이터 수를 돌려줍니다.
그런데 이 InBufferCount 의 또다른 용도가 있습니다.
MSComm1.InBufferCount = 0 이라고 하면..수신버퍼를 클리어시키는 역할을 합니다.
수신 버퍼에 쓰레기 데이터가 있다고 가정할 때 수신버퍼를 비우는 용도로도 사용되지요.
저번의 강좌에서도 말씀드렸지만 9600보레이트로 통신을 한다면 통신포트에서부터 수신버퍼까지 데이터가 들어오는 시간이 1밀리초가 걸립니다.
따라서 수신버퍼에 우리가 원하는 데이터가 다 수신이 되는데는 수신하려는 바이트수 * 1밀리초이상이 걸리므로 이 시간을 잘 기다려 주셨다가 읽어야만 여러분들께서 원하는 데이터를 얻으실수 있다는걸 유념해 주시기 바랍니다.

⑤ POLLING 과 INTERRUPT
우리가 통신을 한다는 목적은 같은 기종 혹은 다른 기종끼리의 데이터 송수신을 목적으로 하고있습니다.
데이터를 보내는 조건이나 시기는 보내는 쪽에서 대체적으로 결정을 합니다.
송신이 필요할 때 즉시 송신을 하거나 미리 예약을 했다가 정해진 시간에 송신을 하면 되겠죠?
하지만 수신의 경우는 조금 다릅니다.
보내는 쪽에서 언제 보낼지를 모르기 때문입니다.

우리가 지금 다루고 있는 통신의 인터페이스는 RS-232 통신입니다.
이 RS-232는 비 동기모드 통신 방식이라고 합니다.
여기서 말하는 비 동기 통신 방식이라는건 양쪽의 기기들에게 약속된 동기신호가 없다는 얘기입니다.
만약 정해진 동기신호(클럭)이 있다면 그 동기신호에 맞추어 데이터를 주고 받으면 됩니다만..
우리가 배우고 있는 RS-232에는 약속된 동기신호가 없습니다.
따라서 비 동기모드 통신이라고 하지요.
그러면 동기신호가 없는데 어떻게 데이터를 인식할 수가 있는지 궁금하실겁니다.
여기서 중요한건 시작비트와 종료비트 입니다.
이 때문에 일본에서는 RS-232통신을 조보통신(한문으로 쓰는건 잊어버렸습니다..^&^)이라고 하며
영어식으로 표현하면 Start-Stop Transmission 이라고 표현합니다.
이 내용 또한 시작비트와 종료비트로 동기를 맞춘다는 얘기이지요.

송신측에서 ‘1’을 보낸다고 가정을 하겠습니다.
‘1’은 10진수로는 49가 되며 16진수로는 ‘31’이 됩니다.
이때 송신측에서 문자’1’을 보내려고 하면 그 문자의 아스키코드의 10진수 형태와 16진수형태는 큰 의미가 없습니다.
즉,
MSComm1.Output = Chr$(49)
MSComm1.Output = Che$(&h31)
MSComm1.Output = “1”
위의 세가지 방법 모두 같은 데이터가 나간다는 얘기입니다.

어떤 포맷으로 보내든지간에 원하는 문자의 아스키코드에 해당하는 코드값이 8비트(혹은 7비트)로 이진 현태로 변환이 되며 그 앞에는 시작비트가 나가고 그 뒤에는 패리티비트(원할때만..) 그리고 그 뒤에는 종료비트가 붙어서 나갑니다.
이걸 단순히 생각해서 1과 0으로만 표시 해본다면..(기본 설정인 9600,n,8,1 로 설정 가정하고..)

시작비트 – 데이터 비트(8비트) – 종료비트  순으로 나갑니다. (패리티는 None이므로..)
즉,  1         0 0 1 1 0 0 0 1         1     의 순서로 나가지요. (비트간의 간격은 의미가 없습니다.)

그러면 수신측에서는 수신라인을 지켜보고 있다가 시작비트가 확인 되면 그 시점부터 정해진 시간인 100마이크로 초 (이 시간은 전송속도인 보레이트로부터 계산이 됩니다. 지금의 예는 9600보레이트이므로 1바이트에 수신에 1밀리초가 필요하며 1비트의 간격은 약 100마이크로 초입니다) 마다 샘플링을 하여 1인지 0인지를 판단합니다.
이렇게 8개의 비트를 모두 추출하면 이들을 합하여 바이트로 변환시키는 것이지요.
따라서 송신을 할 때 16진수값전송이나 10진수값전송에는 큰 의미를 두지 마시기 바랍니다.

자,다시 주제로 돌아가도록 하죠.
위와 같은 방식으로 송수신을 하기 때문에 수신자는 언제 데이터가 들어올지를 예측 할 수는 없습니다.

그래서 필요한 것들이 있습니다. 폴링과 인터럽트입니다.
물론 이들은 데이터의 수신을 그 기본목적으로 하고 있습니다.
단지 데이터의 수신이 아니고 수신의 동기를 맞추는게 더 중요한 목적이 잇다고 하겠습니다.
수신의 동기를 보다 더 정확하게 맞춘다면 데이터를 읽어내오지 않아서 발생할수 있는 오버런을 예방할수도 있으며 기기가 보내주는 중요정보를 바로 사용자에게 알려줄수 있는 효과와 잇점을 제공할수 있기 때문입니다.

폴링과 인터럽트를 다음과 같이 생각하시면 됩니다.

집에 전자오븐렌지가 있습니다.
제가 먹다남은 피자가 있길래 프로그램을 짜다말고 피자를 렌지에 넣고 시간을 맞추고 돌렸습니다.
그리고 다시 프로그램을 짜고 있습니다.
저는 피자가 다 되었는지 아직 덜 되었는지를 생각 할 필요가 없습니다.
젠자렌지에는 조리가 끝나면 ‘띵~’하는 소리로 조리가 끝났음을 알려주기 때문입니다.
따라서 저는 프로그램을 짜다말고 ‘띵~’하는 소리가 들리면 ‘ 아! 피자가 다 데워졌구나..’라고 생각하고 그에 맞는 행동을 합니다.
이것이 인터럽트입니다. 제가 어떤 일을 하더라도 이벤트가 발생하면 프로세서에게 보고가 되어지는 것..이것을 인터럽트라고 부르지요..MSComm에서는 OnComm이벤트로 대신합니다.

그런데 어느날 다시 피자를 데우려고 갔는데 전자레인지 문에 쪽지가 붙어있습니다.
“주의 - 이 전자레인지는 고장으로 인하여 조리후 ‘띵~’소리가 나오지 않음”
이때 저는 고민을 합니다. 그래도 피자를 먹을것인가..
만약 먹고 싶다면 저는 피자를 전자레인지에 넣고 조리를 시작한 다음 부터는 조리가 끝날 때 까지는 가슴을 졸이며 계속 전자레인지를 확인 해야 합니다.
그렇지 않으면 조리가 끝난걸 모르고 있다가 다 식은 피자를 먹어야 할지도 모르기 때문입니다.
이것이 폴링입니다.
어떤 작업이 끝났는지 혹은 어떤 이벤트가 일어났는지의 이벤트를 프로세서가 계속 확인을 하는 방법입니다.

우리는 경우에 따라서 폴링을 사용하거나 인터럽트(이벤트)를 사용하거나 결정을 해야합니다.
만약 두 가지를 다 사용하려고 한다면 우리는 정상적인 데이터를 얻을수 없기때문입니다.

간단하게 비교를 한다면 폴링은 데이터를 보내고 응답을 확인 하면서 기다리는 방법입니다.
다음의 소스를 생각 해보시기 바랍니다.
Comm1.InBufferCount = 0
Comm1.Output = "D" & vbCrLf

    tmp$ = ""
      sTime = Now
       Do
           DoEvents
           If Comm1.InBufferCount > 0 Then
              tmp$ = tmp$ & Comm1.Input
           
   If Right$(tmp$, 2) = vbCrLf Then
       rData = Split(tmp$, ",")
                  Exit Do
              End If
           
              sTime = Now
           End If
           
           nTime = Now
           If Abs(DateDiff("s", nTime, sTime)) >= 3 Then Exit Do
    Loop
위의 경우 명령을 보내고 난 다음 종료부호가 들어오는지 확인을 하면서 수신갭의 시간이 3초를 초과하는지 확인을 합니다.
이 처럼 데이터를 보내고 원하는 데이터를 계속 확인 하면서 기다리는 방법을 폴링이라고 생각하시면 됩니다.

하지만 인터럽트는 다릅니다.
인터럽트는 필요 시 명령을 보냅니다. 그리고 끝입니다. 왜냐면 데이터가 수신이 되면 이벤트가 발생하라고 했기 때문이지요.
그렇다면 인터럽트를 발생시키려면 어떻게 해야 할까요.
비베에서는 약 10가지의 오류 이벤트와 7가지의 이벤트가 있습니다.
우리가 원하는 데이터 수신 이벤트는 그 중의 하나입니다.
따라서 MSComm의 Oncomm 이벤트 내에서도 현재 발생한 이벤트가 데이터 수신 이벤트인지를 확인 하는 기능이 들어가야 논리적 오류를 조금이라도 줄일수 있으리라 생각됩니다.
그렇다면 어떻게 해야 이벤트를 발생 시킬 수가 있을까요?
여기서 해답을 주는 속성이 있습니다.
그것은 바로 Rthreshold 라는 속성이었던 것입니다..(개그 콘서트 버전..)

이 속성은 언제 OnComm이벤트를 발생시킬 건지를 설정하는 속성입니다.
이 속성에 0을 설정 하면 이벤트를 사용하지 않을 것 이라는 의미입니다.
즉, 폴링으로 사용하겠다는 의미이지요.
하지만 0이외의 어떤 값 이 설정되어있다면 설정한 바이트 수 만큼의 데이터가 들어오면 그때 이벤트를 발생시키겠다는 의도로 보시면 됩니다.
일반적으로는 1을 설정합니다.
이때는 데이터가 들어올때마다 이벤트를 발생된다고 보시면 됩니다.

자,정리를 하도록 하겠습니다.

데이터를 안전하게 수신하는 방법에는 폴링과 인터럽트가 있습니다.
폴링은 데이터가 들어왔는지를 스스로 확인 하는 방법이며,
인터럽트는 데이터가 들어왔을 때 프로세서에게 즉각 보고를 하도록 하는 방법입니다.
비베를 이용한 통신을 MSComm으로 위의 방법을 사용하실때는 RThreshold라는 속성을 이용하시면 됩니다.
이 속성에 0이 들어있으면 폴링방식을 사용한다는 의미이며..
0 이외의 값이 들어있으면 설정한 수 만큼의 데이터가 수신되면 그때 이벤트가 발생이 된다는것입니다.

⑥ 바이너리 데이터 처리
우리가 통신을 하는 목적은 같은 기종 혹은 이기종 간의 데이터교환을 목적으로 하고 있습니다.
여기서 말하는 데이터는 컴퓨터가 인식하는 데이터를 의미하며 흔히 아스키코드로 얘기를 합니다.
ASCII(American Standard Code for Information Interchange : 미국 표준 정보 교환 코드) 코드는 컴퓨터내부에서 문자를 표현하는 표준적인 코드 체계입니다.
7비트로 구성되며 자료의 처리나 통신 장치의 표준코드로 널리 사용되고 있습니다.
기본적인 영문자,숫자 그리고 기호들은 모두 7비트로 표현이 가능합니다.
그러나 우리나라나 중국 일본처럼 유니코드를 사용하는 나라들은 8비트를 사용해야 합니다.
최상위비트인 8번째 비트를 사용함으로서 그 데이터들을 표현할수 있기 때문입니다.

여기서 잠깐 아스키코드 테이블을 살펴보겠습니다.

아스키코드 0 ~ 31 까지의 데이터는 제어코드 영역입니다.
이 영역의 데이터들은 모두 콘트롤키와의 조합으로 사용할수 있습니다.
예를들면 우리가 사용하는 엔터키를 캐리지리턴이라고도 합니다.
아스키코드값으로는 13 (&HD)입니다. 이 값의 명칭은 CR-즉,캐리지 리턴입니다.
그리고 콘트롤키 조합으로는 CTRL-M 입니다.
그렇기 때문에 텍스트 박스같은 곳에서 엔터를 누르지 않고 CTRL 과 M 을 동시에 눌러도 같은 효과가 나는것입니다.
또한 이 영역의 데이터들은 우리가 통신을 할 때 자주 사용하는 코드들이 있습니다.
때로는 데이터 프레임의 선두에 서서 데이터를 이끌고 갈때도 있고 프레임 중간 중간에 섞여서 나갈때도 있으며 또는 데이터의 끝을 장식하는 경우가 있습니다.
흔한 예로 우리는 데이터를 보낼 때 데이터시작을 의미할수 있게 ‘STX’를 보내며,
그리고 데이터의 끝을 알아볼수 있게 ‘ETX’를 붙여서 보낸다고 가정하겠습니다.
그때 우리는 다음과 같은 방법으로 데이터의 프레임을 표현합니다.
STX + Data + ETX
이때 STX와 ETX는 제어코드로서 프레임의 형식을 통일시키는 역할을 하지요.
만약 Data 가 “123” 이라는 문자열이라면 실제 전송되는 데이터는 다음과 같습니다.
02 31 32 33 03 (16진수 형태로 표현하였습니다.)
즉,한 바이트의 제어코드로서 서로의 송수신 프레임에 대한 약속을 하는것입니다.
이러한 용도로 사용하는 것이 제어코드 입니다.
하지만 딱 정해진 규정은 없습니다. 서로간의 약속에 의해서 맞춰 사용하시면 됩니다.
 
 아스키코드 32 ~ 127 까지의 데이터는 일반 문자 영역입니다.
여기에는 각종 부호와 숫자 영문자등이 있습니다.
 
그리고  또하나의 중요한 영역이 있습니다.
아스키코드 128부터 255까지의 영역입니다.
저는 이 영역을 확장 아스키코드 영역이라고 부릅니다.
이 영역은 아까도 말씀드렸지만 우리나라나 중국,일본같은 2Byte문자를 사용하는 나라에서는 자국의 언어를 처리하는 영역으로 사용됩니다.
MSB(최 상위비트)를 1로 Set함으로서 확장된 코드를 사용할수 있습니다.
또한 이 영역은 다른 용도로도 사용됩니다.
통신을 하다 보면 송수신 데이터양을 줄이기 위해서 각 비트별 가중치를 적용하는 경우가 많이 발생합니다.
예를 들면 0에서 255까지의 숫자를 보내야하는 장비가 있습니다.
이 장비가 일반 텍스트 형태로 데이터를 보내게 되면 최대 3바이트가 전송이 되지만 바이너리 형태로 보내게 되면 1바이트로 전송이 가능합니다.
이런 경우로 인해서 바이너리 데이터 송수신이 자주 일어납니다.

자,지금부터 바이너리 데이터의 송수신에 관해서 본격적으로 설명을 드리겠습니다.

우리가 비베를 통하여 데이터를 주고 받을 때 문제가 발생하는 부분은 확장 아스키코드 영역(128 부터 255까지의 코드값을 갖는 데이터)의 데이터 송수신입니다.

예전에 비베 3.0에서는 이런 문제가 전혀 없었습니다.
그런데 비베4.0으로 올라가면서 튀어나온 문제가 확장 아스키코드 영역의 데이터 송신시 Null로 송신되는 문제였지요.
당시에 한국 마이크로소프트와도 많은 얘기를 했지만 결국은 안된다는 결론이었습니다.
MS에서 제공해준 방법은 API를 사용하는 방법이었고,그 방법또한 무난하지 않겠다는 판단에 저는 제가 아는 분께 부탁을 드려 델파이로 DLL을 만들어서 처리를 했지요.
하지만 지금은 바이트 배열이라는 방법을 통하여 문제를 처리하고 있습니다.

여기서도 송신과 수신으로 나누어 생각을 해 보도록 하겠습니다.

먼저 송신시의 바이너리 데이터 처리방법입니다.
보내고자 하는 데이터의 코드값이 128부터 255까지의 데이터가 있다면 일반 문자열 전송 방식으로는 정상적인 처리가 되지 않습니다.
이때 사용하는 방법이 바이트 배열 방식입니다.

먼저 전송하고자 하는 데이터의 크기에 맞는 바이트를 배열로 선언 한다음..
각각의 방에 전송하려는 데이터의 아스키코드값을 넣고..
MSComm의 Output 을 이용할 때 바이트 배열명을 지정하시는 방법과..
방이 하나짜리인 바이트 배열을 만들고..
전송하려는 데이터의 아스키코드값을 그 배열에 넣은다음 그때그때 전송을 하는 방법으로 생각해볼수 있습니다.

전자의 경우는 다음의 소스를 참고 하시기 바랍니다.

Dim sBuf(0 to 4) As Byte

SBuf(0) = 2  ‘STX
SBuf(1) = &h31 ‘1
SBuf(2) = &h32  ‘2
SBuf(3) = &h33 ‘3
SBuf(4) = 3  ‘ETX

MSComm1.Output = sBuf

이때 주의하실 사항은 Output할 때 지정한 배열의 모든 첨자가 다 전송이 됩니다.
예를들어 100개짜리 방을 만들고 그중 5개의 방에만 데이터를 넣은 다음 원하는 5개의 데이터만 전송을 할 수가 없습니다.
아무리 5개의 데이터를 넣고 그 데이터만 전송을 하고 싶어도 100개의 데이터가 모두 전송이 된다는걸 유념하시기 바랍니다.

후자의 경우는 다음과 같습니다.

Dim sBuf(0) As Byte

SBuf(0) = 2  ‘STX
MSComm1.Output = sBuf

SBuf(0) = &h31 ‘1
MSComm1.Output = sBuf

SBuf(0) = &h32  ‘2
MSComm1.Output = sBuf

SBuf(0) = &h33 ‘3
MSComm1.Output = sBuf

SBuf(0) = 3  ‘ETX
MSComm1.Output = sBuf

두 경우의 차이점을 생각해보시고 사용하시려는 용도에 적합한 방법으로 사용하시면 됩니다.

다음은 바이너리 데이터의 수신시 처리방법입니다.
먼저 수신하려는 데이터가 확장 아스키코드 영역의 데이터를 포함하고 있다면..
MSComm의 속성중 InputMode를 바이너리로 설정하셔야 합니다.
그리고 Input을 이용하여 데이터를 수신하는 변수는 Variant 로 선언 하시면 됩니다.
이때 InputLen의 속성에 따라 수신변수의 상황은 달라집니다.
만약 InputLen을 1로 설정 해서 한 바이트씩 데이터를 받아내면 수신 변수는 바이트변수와 비슷합니다.
그런데 InputLen이 1을 초과하면 수신 변수는 그 데이터의 크기에 맞는 바이트 배열로 됩니다.
이 속성만 잘 이해하시면 큰 문제는 없습니다.

다음의 소스를 잘 생각해보시기 바랍니다.

Dim rBuf As Variant

MSComm1.InputMode = 1 ‘Binary Mode
MSComm1.InputLen = 1  ‘1Byte씩 수신

If MSComm1.InBufferCount >=1 Then
  RBuf = MSComm1.Input  ‘이때는 바이트 변수와 같이 동작합니다.
End If

MSComm1.InputMode = 1 ‘Binary Mode
MSComm1.InputLen = 0  ‘한꺼번에 모든 데이터 수신

If MSComm1.InBufferCount >1 Then
  RBuf = MSComm1.Input  ‘이때는 바이트배열로 동작합니다.
End If         ‘만들어진 방의 개수는 UBound함수로 알아보실수 있습니다.


여기서 다시 한번 정리 하도록 하겠습니다.

MSComm의 속성중 InputMode는 데이터 수신에만 적용되는 속성입니다.
데이터 송신의 경우는 보내는 방법을 달리 함으로서 바이너리데이타를 보내실수 있기 때문에 InputMode 와는 관계가 없는 것이지요..
송신데이타중 확장 아스키코드영역의 데이터가 있다면 일반 문자열 전송방식으로는 정상적으로 송신이 되지않기 때문에 이때는 바이트 배열을 이용하시면 됩니다.

데이터 수신의 경우는 InputMode를 바이너리 모드로 하시고 Variant로 데이터를 받으시면 됩니다.
이때 데이터의 길이에 따라,혹은 InputLen의 속성에 따라 수신되는 데이터가 바이트 변수가 될수도 있고 바이트배열변수가 될수도 있습니다.

   
2) MSComm 컨트롤의 많은 중요한 5가지 속성
① CommPort   통신 포트 번호를 반환하거나 설정합니다.
② Settings    전송 속도, 패리티, 데이터 비트, 정지 비트를 문자열로 반환하거나 설정합니다.
③ PortOpen   통신 포트의 상태를 반환하거나 설정합니다. 또한 포트를 열거나 닫습니다.
④ Input    수신 버퍼에서 문자를 반환하거나 삭제합니다.
⑤ Output    문자열을 전송 버퍼에 기록합니다. 
 

3) 기타 참고 속성
① Break  중단 신호 상태를 설정하거나 해제합니다. 디자인 모드에서는 이 속성을 사용할 수 없습니다.
② CDHolding  반송파 검출(CD) 회선의 상태를 쿼리하여 반송파가 존재하는 지의 여부를 결정합니다. CD는 모뎀에서 모뎀이 온라인인 지를 나타내기 위해 연결된 컴퓨터로 보내는 신호입니다. 이 속성은 디자인 모드에는 사용할 수 없으며 실행 모드에서는 읽기 전용입니다
③ CommEvent  가장 최근의 통신 이벤트나 오류를 반환합니다. 이 속성은 디자인 모드에는 사용할 수 없으며, 실행 모드에서는 읽기 전용입니다.
④ CommID  통신 장치를 구분하는 핸들을 반환합니다. 이 속성은 디자인 모드에는 사용할 수 없으며 실행 모드에서는 읽기 전용입니다
⑤ CTSHolding  Clear To Send(CTS) 회선 상태를 쿼리하여 데이터를 보낼 수 있는지의 여부를 결정합니다. 일반적으로 전송 취소 신호는 전송이 진행될 수 있는 지를 나타내기 위해 연결된 컴퓨터에서 모뎀으로 보내집니다. 이 속성은 디자인 모드에서는 사용할 수 없으며 실행 모드에서는 읽기 전용입니다.
⑥ DSRHolding  Data Set Ready (DSR) 회선의 상태를 결정합니다. 일반적으로 데이터 설정 준비 신호는 작업할 준비가 되어 있는 지를 나타내기 위해 연결된 컴퓨터에서 모뎀으로 보내집니다. 이 속성은 디자인 모드에는 사용할 수 없으며, 실행 모드에서는 읽기 전용입니다.
⑦ DTREnable  통신 도중 Data Terminal Ready (DTR)를 가능하게 할 것인지의 여부를 결정합니다. 일반적으로 데이터 터미널 준비 신호는 컴퓨터가 들어오는 전송 신호를 받을 준비가 되어 있는 지를 나타내기 위해 컴퓨터에서 모뎀으로 보내집니다.
⑧ EOFEnable  EOFEnable 속성은 입력 도중 MSComm 컨트롤이 End Of File(EOF)를 찾을지 결정합니다. EOF 문자를 발견하면 입력이 중지되고 CommEvent 속성이 comEvEOF로 설정되면서 OnComm 이벤트가 발생합니다
⑨ Handshaking  하드웨어 초기 접속 신호 프로토콜을 반환하거나 설정합니다.
⑩ InBufferCount  수신 버퍼에서 기다리고 있는 문자의 수를 반환합니다. 이 속성은 디자인 모드에는 사용할 수 없습니다.
⑪ InBufferSize  수신 버퍼의 크기를 바이트 단위로 반환하거나 설정합니다.
⑫ InputLen  Input 속성이 수신 버퍼에서 읽는 문자의 수를 반환하거나 설정합니다.
⑬ InputMode  Input 속성에서 검색하는 데이터 형식을 반환하거나 설정합니다.
⑭ RThreshold  MSComm 컨트롤이 CommEvent 속성을 comEvReceive로 설정하고 OnComm 이벤트를 발생시키기 전에 수신할 문자의 개수를 반환하거나 설정합니다.
⑮ RTSEnable  RTS(전송 요청) 회선을 활성화 시킬지를 결정합니다. 일반적으로 데이터 전송에 대한 허가를 요청하는 RTS 신호는 컴퓨터에서 모뎀으로 보내집니다.
16 Settings  전송 속도, 패리티, 데이터 비트, 정지 비트 매개 변수를 반환하거나 설정합니다.
17 SThreshold  MSComm 컨트롤이 CommEvent 속성을 comEvSend로 설정하고 OnComm 이벤트를 발생시키기 전에 전송 버퍼에서 허용 가능한 최소 문자 개수를 반환하거나 설정합니다.

4) 초기 접속 신호
수신 및 전송 버퍼를 관리할 때는 데이터가 앞뒤로 성공적으로 전송되는지 확인해야 합니다. 예를 들어 데이터가 수신되는 속도는 버퍼 한계를 넘지 않아야 합니다.

초기 접속 신호는 데이터가 하드웨어 포트에서 수신 버퍼로 전송될 때 내부 통신 프로토콜을 참조합니다. 데이터 문자가 직렬 포트에 도달하면 프로그램이 읽을 수 있도록 통신 장치는 문자를 수신 버퍼로 옮겨야 합니다. 초기 접속 신호 프로토콜은 통신 장치가 수신 버퍼로 데이터를 옮기는 것보다 빠르게 포트에 수신되어 포화된 버퍼에서의 데이터 유실을 막아줍니다.

Handshaking 속성을 설정하여 응용 프로그램에서 사용될 초기 접속 신호 프로토콜을 지정할 수 있습니다. 기본적으로 Handshaking 속성값은 없음(comNone)으로 설정됩니다. 그러나 아래 프로토콜 중 하나를 지정할 수 있습니다.

설정    값  설명
--------------------------------------------------------------------------------------------
ComNone   0  초기 접속 신호 없음(기본값)
ComXOnXOff   1  XOn/XOff 초기 접속 신호
ComRTS    2  RTS/CTS(전송 요청/전송 취소) 초기 접속 신호
ComRTSXOnXOff   3  전송 요청과 XOn/XOff 초기 접속 신호 모두
--------------------------------------------------------------------------------------------

연결하는 장치에 따라 프로토콜을 선택할 수 있습니다. 이 값을 comRTSXOnXOff로 설정하면 두 프로토콜을 모두 지원합니다.

대부분의 경우 통신 프로토콜 자체에서 초기 접속 신호를 처리할 수 있습니다. 따라서 이 속성을 comNone 이외의 것으로 설정하면 충돌이 발생할 수 있습니다. 이 값을 comRTS나 comRTSXOnXOff로 설정하려면 RTSEnabled 속성을 True로 설정해야 합니다. 그렇지 않으면 연결하여 데이터를 보낼 수 있지만 받을 수는 없습니다.

5) MS Comm 컨트롤 의 오류 메시지
아래 표는 MSComm 컨트롤에 대해 잡을 수 있는 오류의 목록입니다.

상수    값  설명
-----------------------------------------------------------------------------------------------------------------------------
ComInvalidPropertyValue  380  속성값이 잘못되었습니다.
comSetNotSupported   383  속성은 읽기 전용입니다.
comGetNotSupported   394  속성은 읽기 전용입니다.
comPortOpen     8000  포트가 열려 있는 동안은 작동이 유효하지 않습니다
8001 시간 초과 값은 0보다 커야 합니다
comPortInvalid     8002 포트 번호가 잘못되었습니다.
8003 속성은 실행 모드에서만 사용할 수 있습니다.
8004 속성은 실행 모드에서만 사용할 수 있습니다. 
comPortAlreadyOpen   8005 포트가 이미 열려 있습니다.
8006 장치 구별자가 유효하지 않거나 지원되지 않습니다.
8007 해당 장치의 전송 속도가 지원되지 않습니다.
8008 지정된 바이트 크기가 유효하지 않습니다.
8009 기본 매개 변수가 잘못되었습니다.
8010 다른 장치에서 잠궜기 때문에 하드웨어를 사용할 수 없습니다.
8011 그 기능은 큐를 할당할 수 없습니다.
comNoOpen      8012 그 장치가 열리지 않았습니다.
8013 그 장치는 이미 열려 있습니다.
8014 comm 통지를 활성화할 수 없습니다.
comSetCommStateFailed  8015 comm 상태를 설정할 수 없습니다.
8016 comm 이벤트 마스크를 설정할 수 없습니다.
comPortNotOpen    8018 포트가 열려 있을 때만 작동할 수 있습니다.
8019 장치를 사용 중입니다.
comReadError     8020 통신 장치를 읽는 중 오류가 발생하였습니다.
comDCBError     8021 포트의 장치 컨트롤 블록을 검색하는 중에 내부 오류가 발생하였습니다.












6) MS Comm 컨트롤 의 이벤트 리스트
Private Sub Comm_OnComm ()
Select Case MSComm1.CommEvent
' 각 case 문 아래에 코드를 위치시켜 이벤트나 오류를 처리합니다.

' 오류
Case comBreak   ' 중지 신호 수신.
Case comCDTO   ' CD (RLSD) 시간 초과.
Case comCTSTO   ' CTS 시간 초과.
Case comDSRTO  ' DSR 시간 초과.
Case comFrame   ' 프레이밍 오류
Case comOverrun  ' 데이터 손실.
Case comRxOver   ' 수신 버퍼 초과.
Case comRxParity  ' 패리티 오류.
Case comTxFull   ' 전송 버퍼 꽉 참.
Case comDCB   ' DCB 검색 중 예기치 못한 오류.
     
' 이벤트
Case comEvCD   ' CD 회선 변경.
Case comEvCTS   ' CTS 회선 변경.
Case comEvDSR   ' DSR 회선 변경.
Case comEvRing   ' 호출음 검출.
Case comEvReceive  ' 데이터 수신 이벤트 발생
Case comEvSend   ' 데이터 송신 이벤트 발생
Case comEvEof   ' 파일 끝
End Select
End Sub

'Etc' 카테고리의 다른 글

매트랩 강의 블로그  (0) 2008.01.23
매트랩, 주파수분석관련  (0) 2008.01.23
10의 지수(Power of 10)  (0) 2008.01.20
unsigned int 음수 결과  (0) 2008.01.17
춤추는 대수사선 보는 순서  (0) 2008.01.12
알FTP 사이트맵 백업  (1) 2007.12.31
16진수 2진수 10진수 8진수 변환표; Hex 헥사 값 대조표  (0) 2007.12.27
시리얼 통신 관련 링크  (0) 2007.12.26
원격 데스크탑 연결 명령어  (0) 2007.12.21
키보드 최적화  (0) 2007.12.13
Posted by Baracuda
, |

시리얼 통신 관련 링크

Etc / 2007. 12. 26. 18:02

AVR(ATmega128) 시리얼 통신 제어(1) - 시리얼통신과 패러렐 통신  http://blog.daum.net/roboting/5207096

AVR(ATmega128) 시리얼 통신 제어(2) - RS-232 통신 http://blog.daum.net/roboting/5207099

 AVR(ATmega128) 시리얼 통신 제어(3) - RS-422, RS485 통신 http://blog.daum.net/roboting/5207102

AVR(ATmega128) 시리얼 통신 제어(4) - 시리얼 통신 데이터 전송 포맷 http://blog.daum.net/roboting/5207106

AVR(ATmega128) 시리얼 통신 제어(5) - 시리얼포트 특징 http://blog.daum.net/roboting/5207110

AVR(ATmega128) 시리얼 통신 제어(6) - 시리얼 통신 레지스터 http://blog.daum.net/roboting/5207113

AVR(ATmega128) 시리얼 통신 제어(7) - 회로도 http://blog.daum.net/roboting/5207115


시리얼통신의 전체적인 개요
http://www.sciencesoftware.co.kr/TALtech/Tutorials/intro_sc/intro_sc.htm

http://www.mironae.com/


Posted by Baracuda
, |