강좌,팁

[강좌:32] 시리얼포트의 콜백함수를 만들어 이용하기

조회 수 33894 추천 수 0 2006.08.25 15:07:50
허창원 *.19.45.99

수익을 남기는 기반위에 봉사활동이 더욱 빛을 발할 수 있을 것입니다.
좋은 아이디어도 나눌 수 있는 공간을 만들고 싶습니다.

---------------------------------------------------------------------------------------

[강좌:32] 시리얼포트의 콜백함수를 만들어 이용하기

이용된 버전: LabWindows/CVI 7.1.1
강좌분류: 따라하기 및 샘플예제

차례
서론
1. 이번 예제 프로그램의 개요
2. 준비물
3. 작업준비
4. 코딩
   4.1 변수, 함수 선언
   4.2 변수 초기화 부분
   4.3 Textbox 초기화
   4.4 통신포트 설정
   4.5 ComPort 콜백함수
   4.6 Panel의 콜백함수
5. 실행
마무리

 

서론
산업현장에서 장치와의 통신에 지금까지도 가장 많이 사용하는 포트가 RS-232 시리얼 포트일 것입니다. 속도가 더빠른 USB 포트가 나오긴 했지만, RS-232에 비해 케이블의 허용 길이, 잡음(noise)에 대한 영향, 프로토콜과 드라이버의 구성, 비용 등에서 여전히 RS-232가 유리한 점이 많이 있는 것 같습니다.

USB와 Ethernet는 속도면에서 뛰어나다는 공통적인 장점이 있고, 특별히 USB는 휴대용장치에, Ethernet은 거리의 제한이 다른 연결장치들보다 뛰어나다는 점을 저는 꼽고 있습니다.
이에비해 RS-232는 속도는 떨어지지만, 그동안 워낙 많이 이용되어 왔고, 아직도 많은 장치들이 이 통신방법을 이용하고 있다는 것이겠지요.

시리얼 포트를 이용하여 통신을 할 때, PC에서 장치에 Write를 하는 것은 큰 부담이 되지 않습니다만, Read하는 것은 골치가 좀 아픈 일이 될 수 있습니다. 즉, 언제 장치에서 데이터를 보내올지 모르기 때문입니다. 그래서 PC의 프로그램은 시리얼 포트를 늘 감시할 수밖에 없는데, 그렇게 되면 프로그램의 다른 처리를 구현하려고 해도, 프로그램의 스케쥴 관리가 복잡해지게 됩니다.

그래서 LabWindows/CVI에서 제공하는 InstallComCallback() 함수를 이용하여, 별도의 쓰레드에서 시리얼포트를 감시하고 있다가 어떤 이벤트가 발생하면 실행될 콜백함수를 지정하게 됩니다. 이렇게 함으로써 프로그래머는 좀더 편리하게 프로그램의 기본 처리에 집중할 수 있게 됩니다.

1. 이번 예제 프로그램의 개요
이번 따라하기 강좌 예제에서는 극동테크의 모의 GPS Data 보내는 프로그램인 SendGPSData v1.0.002를 실행시켜두고, 그것으로부터 시리얼포트로 들어오는 문자열을 받아서 화면에 표시하는 간단한 프로그램을 만들어 볼 것입니다. 이때 시리얼 포트에 특정 문자열이 들어오면 지정된 콜백함수가 호출되어 그 문자열을 버퍼로 읽어들이고, 화면의 텍스트박스에 출력하는 동작을 하게됩니다.

그림 1.1에는 이번 예제에서 구현될 실행화면을 보였습니다.

그림 1.1 ComCallback 테스트 프로그램의 실행화면

2. 준비물
이번 강좌를 따라하려면, 별도의 프로그램 하나와 RS-232 통신 케이블이 필요합니다.

    - [프로그램] 모의 GPS Data 보내는 프로그램, SendGPSData v1.0.002 (극동테크 자료실 바로가기)
    - [케이블] RS-232 통신케이블(Null Modem 케이블, 보통 9핀짜리)

케이블은 그림 2.1에 보였습니다. PC의 시리얼 포트에 꼽을 수 있는 Female-Female 커넥터입니다.

그림 2.1 RS-232 통신케이블(Null Modem 케이블)

현재 자신의 PC에 시리얼 포트가 2개 있다면 하나의 PC로도 진행할 수 있고, 만약 시리얼 포트가 하나뿐이라면, 다른 PC나 노트북을 쓰던지, USB-RS232 변환 어댑터를 이용하시면 되겠습니다.

3. 작업준비
작업 준비 과정은 "[강좌:21] CVI 프로그래밍 시작단계 정의(2)" 강좌 글의
"2. LabWindows/CVI의 프로그래밍 작업 시작단계" 부분에 따라 아래와 같이 간단히 정리합니다.

프로젝트 파일명: ComCallback.prj

화면구성은 그림 3.1에 보였습니다.

그림 3.1 ComCallback 프로젝트의 화면구성

uir 파일 내의 각 컨트롤의 속성은 표 3.1과 같이 설정합니다.

표 3.1 컨트롤의 속성값

컨트롤 종류 Constant Name Callback Function Label 비고
Text Message

TEXTMSG

   

제목: ComCallback 테스트(GPS Data 수신)

LED

LED_Com

LED_Com

포트상태 Control Mode를 Hot으로
Command Button

cmdClear

cmdClear

Clear  
Text Box

TEXTBOX

 

수신문자열  

 

Panel의 속성은 표3.2와 같이 설정합니다.

표 3.2 Panel의 속성설정

Panel 속성설정

Constant Name

PANEL

Callback Function

PanelCB

Panel Title

ComCallback 테스트

Other Attributes

Sizable, Can Maximize를 uncheck

그리고, 기본 소스를 생성합니다. 기본으로 생성된 함수는 main() 함수와 PanelCB(), LED_Com(), cmdClear()라는 콜백함수입니다.

4. 코딩
지금부터는 부분부분의 소스를 그대로 설명드리겠습니다. 원래 프로그램을 만들어 갈 때에는 왔다갔다하면서 작업하지만, 그렇게 설명하기는 너무 번거롭지요?
간단한 프로그램이므로  선언부분부터 하나씩 보여드리겠습니다.

4.1 변수, 함수 선언
그림 4.1에는 변수와 함수의 선언(declaration)부분을 보였습니다.

그림 4.1 ComCallback 프로그램의 선언부분
(소스코드 이미지를 클릭하면 소스 텍스트 창이 나타난다는 거 아시죠?)

콜백호출방법을 위한 flag 변수가 있습니다. callback_method 인데요, 시리얼 포트의 콜백함수가 호출되는 방법을 2가지로 설명드리기 위해 만든 변수입니다.

4.2 변수 초기화 부분
그림 4.2에는 변수를 초기화하는 부분을 보였습니다.

그림 4.2 변수 초기화 부분

flag_portopen은 Com port가 열려있으면, 1이라는 값을 갖도록 할 것이고, 닫힌 상태라면 0이라는 값을 갖도록 할 것입니다.

port와 baudrate는 시리얼 포트 설정을 위한 변수입니다. 포트 번호와 보오레이트 값을 갖습니다.

lenRecv는 시리얼 포트로 한번에 받아들일 문자열의 크기를 지정해두는 변수인데요, 이것은 Application에 따라 달라질 수 있습니다. 여기서는 SendGPSData v1.0.002 라는 프로그램에서 한번에 송신하는 문자열의 크기를 적었습니다.

callback_method는 시리얼포트의 콜백함수가 어떨 때 호출될 것인지를 프로그램 상에서 구분하기 위한 변수입니다. 통신포트 설정하는 부분과 Com Port 콜백함수 설정할 때 이용됩니다.

4.3 Textbox 초기화
텍스트박스에는 시리얼 포트를 통해 읽어온 문자열을 그대로 표시할 것입니다. 표시된 문자열이 너무 많을 때, Clear 버튼을 누르면, 텍스트박스의 내용을 지우도록 합니다. 그림 4.3에 Textbox 초기화 콜백함수를 보였습니다.

그림 4.3 Textbox 초기화 콜백함수

4.4 통신포트 설정
시리얼 통신을 하기 위해서는 Com port를 open하여야합니다. 저는 주로 OpenComConfig()라는 함수를 이용합니다. 그리고 저는 LED 컨트롤을 통신포트가 열렸는지, 장치가 제대로 연결되어 있는지를 표시하기 위해 이용합니다. 그리고, 이 LED 컨트롤을 Hot 모드로 해서 이용하는데, 이는 LED 컨트롤을 클릭하면 해당 장치의 연결 설정 및 연결도 수행하도록 하고 있습니다. 그림 4.4에 LED 컨트롤의 콜백함수를 보였습니다. 통신포트 Open 과정이 있고, 그 포트의 콜백함수를 지정하는 부분도 있습니다. 이 Com port 콜백함수는 뒤에 정의(definition) 될 것입니다.

그림 4.4 LED 컨트롤의 콜백함수(통신포트 Open, Com Port 콜백함수 지정)

4.5 ComPort 콜백함수
InstallComCallback() 함수에 의해 지정된 콜백함수를 정의하는 부분입니다. 그림 4.5에 보였습니다.

그림 4.5 ComCallback 함수

함수명이나 함수의 내용은 임의로 하시면 되겠습니다.

4.6 Panel의 콜백함수
Panel의 콜백함수를 그림 4.6에 보였습니다. 프로그램의 닫기 아이콘을 클릭하면, 해당 프로그램이 종료되도록 QuitUserInterface()를 EVENT_CLOSE 이벤트 처리에 넣었습니다.

그림 4.6 Panel 콜백함수

5. 실행
이제 프로그램을 Build 한 후에, 실행을 해보겠습니다.
그전에 먼저, SendGPSData(v1.0.002) 프로그램을 실행한 후, 거기서 시리얼포트를 통해 보내오는 신호를 ComCallback 프로그램이 실행된 PC의 시리얼포트로해서 받아들이게 됩니다.

그림 5.1에는 SendGPSData 프로그램을 실행한 화면을 보였습니다.

그림 5.1 SendGPSData 프로그램의 실행화면

이제 여기서 만든 ComCallback 프로그램을 실행하여, 포트상태라고 이름 붙여진 LED를 클릭하여 통신 포트를 Open하면 문자열이 수신되어 텍스트박스에 표시될 것입니다. 그림 5.2에 그 화면을 보였습니다.

그림 5.2 ComCallback 프로그램 실행화면

시리얼포트로 데이터가 들어오는 중에 포트가 열렸다면, 그림 5.3과 같이 잘못된 문자열 조합이 표시될 수도 있습니다. 이러한 상황을 대비하기 위해서는 별도의 추가 처리 작업이 필요하겠지요?

그림 5.3 수신에러 상황의 예

그림 5.3의 에러는 마지막 문자열을 기준으로 포트를 읽어올때 생긴 상황이고, 문자열의 길이를 기준으로 포트를 읽어오는 경우에는 또다른 형태의 에러 상황이 생길 수 있습니다.

프로그래밍을 하다보면 생길 수 있는 에러상황에 대처하기 위한 작업을 많이 하게 됩니다. 시리얼포트의 통신에 있어서 이런 에러 상황은 물리적인 문제보다도 통신 프로토콜에 의해 많이 발생되기도 하고, 간단히 해결되기도 합니다.
그림 5.3의 경우에는 마지막 문자인 0x0A 문자를 체크하는데, 그 때 읽어들인 문자열의 길이를 체크하여 기준 이하이면 버리도록 함으로써 간단히 해결될 수 있겠습니다.

마무리
알게되면 간단한 InstallComCallback() 함수의 사용법이지만, 아직 사용해보지 않은 분들에게는 큰 장벽이 되기도 합니다. 이러한 사용법도 하나씩 터득해나갈때, 우리들의 프로그램 개발속도도 조금씩 향상될 것입니다.

오래 참으면 관원이 그 말을 용납하나니 부드러운 혀는 뼈를 꺾느니라(잠언 25장 15절)

어려움 속에서도 여러분, 파이팅 합시다.

 

극동테크(www.kdtechno.com) 허창원 드림


김용균

2006.08.27 03:09:55
*.118.64.161

정말 감사 드립니다. ^^
다른거 또 여쭈어봐도 되죠^^

허창원

2006.08.27 23:09:10
*.108.255.40

네... 이제 다시 학기가 시작되고 저도 이중으로 바쁘게 생겼네요... 힘닿는 데까지 열심히 하겠습니다.
List of Articles
번호 제목 글쓴이 날짜 조회 수
96 [강좌:37] 테이블 셀로 파일을 드래그앤드롭하기 file [1] 허창원 2007-09-01 29829
95 [강좌:36] 테이블 셀에서 체크박스 기능 이용하기 file 허창원 2007-09-01 21092
94 [팁:17] 사용가능한 Com Port 찾기 file 허창원 2007-08-18 30816
93 [강좌:35] 엑셀(Excel) 파일에 출력하기(양식 유지한채로) [6] 허창원 2007-04-08 52099
92 [팁:16] 엑셀파일(xls)로 저장하기 [4] 허창원 2007-03-29 34519
91 [에러 최소화 습관 팁] 아직 나타내지 않은 Panel의 Control 값을 Set할 때 [1] 허창원 2006-11-25 26761
90 [팁:15] 엑셀에서 지원하는 파일(csv) 생성하기 [1] 허창원 2006-11-23 28922
89 [강좌:34] CVI의 최소화 기능 개선 [3] 허창원 2006-11-18 24287
88 [요약] [강좌:34] CVI의 최소화 기능 개선 허창원 2006-11-18 25896
87 [강좌:33] 컨트롤 배열 처리하기 [5] 허창원 2006-09-28 37563
» [강좌:32] 시리얼포트의 콜백함수를 만들어 이용하기 [2] 허창원 2006-08-25 33894
85 [강좌:31] 한글 IME, 위치로~~(강력추천) 허창원 2006-06-30 17792
84 [요약] [강좌:31] 한글 IME, 위치로~~(강력추천) [2] 허창원 2006-06-30 19811
83 [강좌:30] Panel을 마우스로 드래그하기(강좌29 업그레이드 버전) file 허창원 2006-06-29 12896
82 [요약] [강좌:30] Panel을 마우스로 드래그하기(강좌29 업그레이드 버전) 허창원 2006-06-29 15022
81 [강좌:29] 타이틀바 없는 Panel을 마우스로 드래그하기 [2] 허창원 2006-06-03 16932
80 [요약] [강좌:29] 타이틀바 없는 Panel을 마우스로 드래그하기 허창원 2006-06-03 15992
79 [팁:14] 프로그램 제거 단축아이콘 넣기(1차수정) [4] 허창원 2006-04-26 15297
78 [메모] 강좌의 종류를 분류해봅니다 [5] 허창원 2006-03-30 21274
77 [팁:13] 디버그 종료시에 뜨는 메시지 A non-debuggable thread... 방지 file [2] 허창원 2005-12-21 26576