2008. 4. 16. 19:25
CVI 시리얼 통신 예제
2008. 4. 16. 19:25 in Programmings/CVI
간단한 '시리얼 통신프로그램'을 'LabWindows/CVI'로 구현하는 방법에 대해 알아보려 한다.
LabWindows/CVI에서 제공하는 Sample RS232예제를 보고 하려니 쫌 답답한 면도 있고.. 약간 복잡(?)한것 같아 일단 접는다. ㅋ
'CVI 정보나눔'이라는 한글 CVI관련 사이트의 예제 프로그램을 간단히 분석해보려 한다.
RS-232통신이라고 하지만.. 간단한 예제라 그런지 생각보다 단순하다.
'CVI 정보나눔'에서는 다른 프로그램과 연동하여 그 프로그램의 정보를 받아오는 역할을 하지만, 본인은 간단히 루프백하여 전송한 데이터를 다시 받아오는 형식으로 진행한다. 그게 간단하니깐...
프로그램을 설명하자면, RS-232 Port에서 포트를 선택하고, Write 에서 전송할 데이터를 입력하고 Query버튼을 클릭하면, 전송한 데이터가 Read로 다시 리턴되는 프로그램이다.
대충의 'uir'을 위의 화면과 같이 작성한다. 보기 좋게 속성 값과 함수의 값도 설정하고...
다 대충 대충 해도 Query버튼에 관련된 세팅은 대충하면 안된다. RS-232 통신하는데 가장 중요한 부분이므로..
본인의 경우 Query버튼의 속성을 아래 그림과 같이 Callback Function을 cmdQuery라고 정해 주었다. 사실... CVI정보나눔에서 이리 되어 있어 따라한거긴 하지만... -_-
cmdQuery 콜백함수의 내용은 아래와 같다.
int CVICALLBACK cmdQuery (int panel, int control, int event,
void *callbackData, int eventData1, int eventData2)
{
switch (event) {
case EVENT_COMMIT:
{
int port, RTCount;
// 쓰기 버퍼관련 변수들..
char WriteBuffer[256];
int length;
int TermChar; // 전송하기 전에 덧붙일 Term.Char방법
// 0:None, 1:CR(0x0D), 2:LF(0x0A), 3:CR+LF
// 읽기 버퍼관련 변수들..
char ReadBuffer[10000];
// 1. Port를 Open하고, Configure합니다.
GetCtrlVal (panel, PANEL_ringRESOURCE, &port);
if(!OpenComConfig (port, "", 9600, 0, 8, 2, 512, 512) ) {
SetComTime (port, 2000);
// 2. 장치 포트로 보낼 데이터를 읽어옵니다.
GetCtrlVal (panel, PANEL_strWriteBuffer, WriteBuffer);
GetCtrlVal (panel, PANEL_ringTermChar, &TermChar);
// 3. Termination character를 덧붙여서 송신합니다.
switch(TermChar) {
case 1:
strcat(WriteBuffer, "\015"); // CR(0x0D)는 8진수로 015
break;
case 2:
strcat(WriteBuffer, "\012"); // LF(0x0A)는 8진수로 012
break;
case 3:
strcat(WriteBuffer, "\015\012");
break;
}
length = strlen(WriteBuffer);
ComWrt (port, WriteBuffer, length);
// 4. 장치 포트로부터 데이터를 읽어옵니다.
ReadBuffer[0] = '\0';
RTCount = ComRdTerm (port, ReadBuffer, 50, 0x0A);
ReadBuffer[RTCount] = '\0';
SetCtrlVal(panel, PANEL_strReadBuffer, ReadBuffer);
// 5. 포트를 닫습니다.
CloseCom (port);
}
}
break;
}
return 0;
}
일반적인 통신 프로그래밍과 얼추 비슷한것 같다.
통신할 장치(Device)를 열고, 읽고, 쓰고, 통신한 장치를 닫고... 등..
LabWindows/CVI에서의 시리얼 통신에 관련된 부분은 NI의 웹페이지에서도 찾아볼 수 있다.
LabWindows/CVI Serial Communication Serial Communication Programming(http://www.ni.com/support/cvi/serlprog.htm)
위의 링크를 따라가면
- Opening and Closing COM Ports
- Writing to COM Port
- Reading from COM Port
- Using InstallComCallback with Serial Reads
'Programmings > CVI' 카테고리의 다른 글
CVI Control Modes for Generating Events (0) | 2008.04.24 |
---|---|
CVI Serial통신 관련 함수 (0) | 2008.04.21 |
CVI Ring control의 간단한 예 (0) | 2008.04.11 |
CVI에서 Dynamic Link Library(DLL) 만들기 (0) | 2008.02.01 |
CVI에서 Static Library 만들기 (0) | 2008.02.01 |