'시리얼'에 해당되는 글 3건

  1. 2008.04.16 CVI 시리얼 통신 예제
  2. 2007.12.06 Debug port, UART, Serial, COM에 대한 간단한 정리..
  3. 2007.12.06 Windows CE에서 Debug Port 설정
2008. 4. 16. 19:25

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
등에 관련된 정보를 얻을 수 있다.

2007. 12. 6. 20:53

Debug port, UART, Serial, COM에 대한 간단한 정리..



시리얼 관련해 흔히 혼동하는 부분('Debug Port', 'UART', 'Serial', 'COM')에 대해서 자료를 찾다가 좋은 문서가 있어서..

먼저 UART는 Universal Asynchronous Receiver/Transmitter로서 CPU에 붙어있는 interface이다.
URAT0, UART1, ...등으로 얘기를 많이 하고, Data 통신을 RS232와 같이 RX/TX serial하게 하기 때문에 보통 시리얼 포트라고 한다.
RS-232는 보통 컴퓨터에 붙어있는 connector이름이다.

시리얼(Serial)은 응용프로그램과 드라이버간의 인터페이스를 이야기하는 것으로, 시리얼 디바이스 드라이버라고 한다.  UART 포트를 사용할 수 있는 드라이버..
응용프로그램은 UART포트가 0인지 1인지2인지를 알 수가 없다. 그래서 *.reg파일에 index를 할당하여COM의 번호를 할당해 준다.

COM은 UART의 Driver가 OS로 올라갈 때 COM이라는 이름으로 올라가는 것이다.

디버그 포트(Debug Port)는 OS에서 Debug용도(개발 보드에서 디버깅을 하기 위한 용도)로 사용하기 위해 설정하는 것이다. 흔히 하이퍼 터미널과 같은 것으로 부팅이나 프로그램 실행시 메시지를 확인하는 것이 디버깅 포트이다.

디버그 포트는 디바이스 드라이버가 올라가기 전부터 통신을 해야한다. 그래서 디버그 포트와 관련된 구현은 EBOOT, KERNEL쪽에 구현이 되어있다.

중요한 점은 Debug port와 UART의 driver가 같은 포트를 사용하게 되면 충돌이 일어나게 된다.
Debug port로 사용할 경우 UART를 사용할 수 없다는 말이다.

네이버 'WEEG 카페'에서 참고한 글임!!


2007. 12. 6. 15:13

Windows CE에서 Debug Port 설정



Windows CE에서 부팅 시 어떠한 일들이 벌어지는지 혹은 부팅 이후에 어떤 작업을 할 시에 무슨 일이 일어나는지에 대한 내용을 호스트 PC에서 '하이퍼터미널'과 같은 콘솔을 이용하여 확인할 수 있다.

이러한 것들을 확인하기 위해서는 'Debug Port'가 활성화 되어 있어야 한다.
일반적으로 이러한 내용들은 'OAL의 함수들'이 처리를 하게 된다.

디버깅 포트에 관련된 부분들은 'Debug.c'라는 파일을 참고하면 된다.
이 파일에서 'Debug Port'를 초기화 하는 함수를 볼 수 있다.
void OEMInitDebugSerial(void)
{
    InitBootInfo ((BOOT_ARGS *) ((ULONG)(*(PBYTE *)BOOT_ARG_PTR_LOCATION) | 0x80000000));

    switch ( g_pX86Info->ucComPort ) {
    case 1:
        IoPortBase = (PUCHAR)COM1_BASE;
        break;
    case 2:
        IoPortBase = (PUCHAR)COM2_BASE;
        break;
    case 3:
        IoPortBase = (PUCHAR)COM3_BASE;
        break;
    case 4:
        IoPortBase = (PUCHAR)COM4_BASE;
        break;

    default:
        IoPortBase = 0;
        break;
    }
   
    if ( IoPortBase ) {
        WRITE_PORT_UCHAR(IoPortBase+comLineControl, 0x80);
        WRITE_PORT_UCHAR(IoPortBase+comDivisorLow, g_pX86Info->ucBaudDivisor);
        WRITE_PORT_UCHAR(IoPortBase+comDivisorHigh, 0x00);
        WRITE_PORT_UCHAR(IoPortBase+comFIFOControl, 0x01);
        WRITE_PORT_UCHAR(IoPortBase+comLineControl, 0x03);
        WRITE_PORT_UCHAR(IoPortBase+comIntEnable, 0x00);  
        WRITE_PORT_UCHAR(IoPortBase+comModemControl, 0x03);
    }
    OEMWriteDebugString(TEXT("Debug Serial Init\r\n"));

}
Debug.c파일의 OEMInitDebugSerial()함수

시리얼로 사용될 수 있는 4개의 포트 중 하나의 포트를 선택하여 디버깅 포트로 사용한다는 내용이다.
현재 COM1을 디버깅 포트로 사용하고 있는데 이를 COM2로 수정하고자 한다면,
...
}

IoPortBase = (PUCHAR)COM2_BASE;

if(IoPortBase) {
...
와 같이 Port를 수정하여 설정을 바꾸어 주면 된다.

디버깅 포트를 막고자 한다면.. IOPortBase = 0으로 세팅해 주면 된다.
...
}

IoPortBase = 0;

if(IoPortBase) {
...

물론 registry에서의 설정도 사용할려는 시리얼에 관련된 내용을 포함하고 있어야 한다.