본문 바로가기
코스웨어/15년 스마트컨트롤러

20151209_박서연_일일업무보고서_RFID(2)

by 알 수 없는 사용자 2015. 12. 10.
728x90
반응형

2015-12-09


*RFID(2)


#윈도우 SerialPort를 이용한 RFID 컨트롤


SetOut(0x71) 사용하여 Beep 츨력하기

소스

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

#include <Windows.h>
#include <stdio.h>

int main()
{
    u_char caString[255] = { 0x0D, 0x00, 0x71, 0x00, 0x30
                , 0x00, 0x00, 0x00
                , 0x0A, 0x00, 0x00, 0x46, 0x41 };
    DWORD dwCnt; 

    DCB sPState;        //struct Port State 시리얼 포트 상태 저장.
    HANDLE hComm = CreateFile("COM4"
        , GENERIC_READ | GENERIC_WRITE
        , 0
        , NULL
        , OPEN_EXISTING
        , FILE_ATTRIBUTE_NORMAL
        , 0);

    if (INVALID_HANDLE_VALUE == hComm)
    {
        printf("포트 열수 없음\n");
        return 0;
    }
    if (0 == SetupComm(hComm, 4096, 4096))
    {
        printf("버퍼 설정 에러\n");
        CloseHandle(hComm);
        return 0;
    }

    if (0 == PurgeComm(hComm, PURGE_TXABORT | PURGE_TXCLEAR))
    {
        printf("버퍼 초기화 에러\n");
        CloseHandle(hComm);
        return 0;
    }
    sPState.DCBlength = sizeof(sPState);
    if (0 == GetCommState(hComm, &sPState)) //시리얼 포트 상태를 조사한다.
    {
        printf("시리얼 상태 읽기 에러\n");
        CloseHandle(hComm);
        return 0;
    }
    sPState.BaudRate = CBR_38400;
    sPState.ByteSize = 8;
    sPState.Parity = EVENPARITY;
    sPState.StopBits = ONESTOPBIT;

    if (0 == SetCommState(hComm, &sPState)) //시리얼 포트 상태를 조사한다.
    {
        printf("시리얼 상태 설정 에러\n");
        CloseHandle(hComm);
        return 0;
    }

    WriteFile(hComm, caString, caString[0], &dwCnt, 0);

    ReadFile(hComm, caString  , 1, &dwCnt, 0);
    ReadFile(hComm, caString+1, caString[0]-1 , &dwCnt, 0);

    CloseHandle(hComm);

    return 0;
}
unsigned short CRC16(void *vpData, unsigned int uiLen)
{
      unsigned int i;
    unsigned int j;
    unsigned char *DATA = vpData;
      unsigned short crc = CRC_PRESET;
      for (i = 0; i < uiLen; i++)
      {
            crc ^= DATA[i];
            for (j = 0; j < 8; j++)
            {
                  if (crc & 0x0001)
              {
                crc = (crc >> 1) ^ CRC_POLYNOM;
              }
              else
              {
                crc = (crc >> 1);
              }
            }
      }
      return crc;
}

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////


일반적으로 리눅스 시리얼 통신과 순서상으로 동일한 부분이 많이 있다. Windows에서는 Handle을 사용해서 파일을 만들고 DCB를 사용해서 시리얼 포트의 상태를 알아내고 변경한다. 그리가고 파일에 쓸때에는 리눅스에서는 저수준 파일 입출력을 사용했지만 Windows에서는 ReadFile, WriteFile을 이용하여 읽고,쓰기를 한다.

caString의 배열을 적절히 변환한다면 비프음 뿐만 아니라 LED컨트롤도 가능하다.


728x90