API/MFC

Serial Communication in MFC

by 너울 posted Aug 25, 2011
?

단축키

Prev이전 문서

Next다음 문서

ESC닫기

크게 작게 위로 아래로 게시글 수정 내역 댓글로 가기 인쇄

NI의 시리얼 통신 설명

http://zone.ni.com/devzone/cda/tut/p/id/5862


개인블로그, 시리얼통신 설명

http://jsaver.tistory.com/tag/serial%20%ED%86%B5%EC%8B%A0


시리얼 통신 질문, 답

http://social.msdn.microsoft.com/forums/en-US/vcgeneral/thread/9ac38c01-b5cb-4d64-99e1-869af7a18400/


중요내용 요약


MSCOMM ist an OCX that is a COM Interface to the serial communication port.

Using a HANDLE is the direct communication to the OS and the serail port.

I would never use MSCOMM, you sometimes don't know what its doing. Its slower, you don't have the direct access

Use the class from PJ Naughter!

http://www.naughter.com/serialport.html


i am providing some links that would be helfull for the answer:

http://msdn2.microsoft.com/en-us/library/aa363194(VS.85).aspx

http://www.codeproject.com/KB/system/cserialcom.aspx

http://msdn2.microsoft.com/en-us/library/ms810467.aspx

http://ontrak.net/mfc.htm



시리얼 통신 설명, 라이브러리


http://www.codeproject.com/KB/system/serial.aspx

라이브러리는 여기서 받을 것 : http://blog.daum.net/hdongle/79084

이 라이브러리를 이용한 강좌

http://www.constructor.co.kr/board/board.php?act=READ&content_idx=23&board_idx=2&category_idx=2

http://www.constructor.co.kr/board/board.php?act=READ&content_idx=27&board_idx=2&category_idx=2


요약


[소개]


시리얼 통신이 왜 어려운지 설명하겠다. 다른 응용프로그램에 쓰이는 클래스는 견고하지도, 확장이 용이하지도, non-MFC 프로그램에 적절치도 않다. 내가 만든 클래스는 안그렇다 ㅋㅋ


[왜 시리얼 통신이 어려울까?]


Baudrates, parity, databits, handshaking, etc...


시리얼 통신을 하려면 baudrates, parity, databits, stopbits 설정이 필요하다. 포트 양쪽의 이들 설정을 잘 매치시키면 큰 문제는 없다. 하지만 handshaking은 이보다 어렵다. Handshaking에 생긴 문제가 생기면 파악하기 어렵기 때문이다. 만약 송신측에서 data 보내는 속도가 수신측이 data를 처리할 수 있는 속도보다 빠르면 수신측의 버퍼에 data가 쌓이게 된다. 결국 어느 시간이 지나면 overflow가 발생한다. 만약 수신측이 overflow가 발생하기전 송신측에 data를 잠시동안 그만보내라는 신호를 보낼 수 있다면 overflow를 막을 수 있을 것이다. 이렇게 data 송신을 조절하는 것을 handshaking이라 부르고 기본적으로 세종류가 있다.


1. No handshaking

Handshaking을 사용하지 않는다. 즉, data를 계속 보낸다. 앞서 말한 이유로 비추. 적은 양의 data를 보낼 때 쓰일 수 있다.


2. Hardware handshaking

RTS/CTS 라인을 통해 data를 보낼 수 있는지 체크한다. 이를 위해선 양쪽 포트와 케이블 모두가 hardware handshaking을 지원해야한다. 견고하고 효율적이나 하드웨어 의존성이 강하다는 단점이 있다.


3. Software handshaking

XOFF/XON신호를 통해 data 송신을 제어한다. 이 방법의 단점은 XOFF/XON 신호(Ctrl + S / Ctrl + Q)를 data로 사용할 수 없다는 것이다. 그러므로 Binary data (ex : 16진수를 통한 통신. Instrutech사의 IGM-402)로 통신하는 경우에는 문제가 발생할 수 있다. 하지마 아스키 data를 보내는 경우엔 유용하다.


Win32 API는 더 많은 handshaking 옵션을 제공한다. 하지만 거의 쓰이지 않고 코드를 복잡하게만 한다.


비동기 I/O는 문제를 더욱 복잡하게 한다


File I/O는 시리얼 I/O보다 빠르다. 한 블럭의 코드를 실행할 때 수 ms 정도의 시간이 걸린다. 하지만 Serial I/O는 느려서 프로그램의 딜레이를 유발하곤 한다. 또 다른 문제는 data가 언제 도착할지, 얼마나 큰 data가 도착할지 알 수 없다는 것이다. Win32 API는 비동기 함수 (aka overlapped operations) 를 제공하여 이 문제를 피할 수 있다. 비동기 프로그래밍은 성능을 향상시킬 수 있는 좋은 방법이나 코드를 복잡하게 한다. 내가 제공하는 라이브러리는 비동기 I/O 문제를 어느정도 해결하였다. 사용자는 편하게 overlapped, non-overlapped operations을 적절히 섞어 프로그래밍 할 수 있을 것이다.


이벤트 기반 프로그래밍엔 적절치 않다


GUI 응용프로그램에선 문제가 더 복잡하다. 모든 이벤트는 메시지를 통해 전달된다. 그리고 메시지를 받기 위해선 적어도 하나의 윈도우가 필요하다. 일반적인 GUI 응용프로그램에서는 WM_QUIT 메시지가 오기 전까지 메시지 펌핑을 한다. 메시지큐에 메시지가 오기 전까지 다른 함수의 실행을 막으므로 시리얼 이벤트가 발생했을 때 이를 깨울 방법이 없다. 타이머를 설정하고 포트를 체크하는 방법이 있긴하나 적절치 않다. Win32 시리얼 통신 API는 이벤트 기반 프로그래밍에 적절치 않다. 시리얼 이벤트가 발생했을 때 Win32 API가 윈도우에 메시지를 전달하는 방법이 적절할 것이다.


다음 사이트에도 번역있음

http://aronze.egloos.com/877120


데이터 받는 부분 오류 해결 ( Sleep(20) 대신 )

http://www.codeproject.com/KB/system/serial.aspx?msg=1954427#xx1954427xx


또다른 Serial Communication 클래스와 설명

http://www.codeproject.com/KB/system/serial_com.aspx