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

20151209 수업 / RFID_2-남수진

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

RFID

  • 가상머신에서 하면 안됨
    • VMWare에 새로운 리눅스를 설치해야

  • 도스에서 시리얼 통신으로 RFID 제어 프로그램 작성
    • 포트 번호가 2 자리수 이상이면 포트가 안 열린다
      • 장치 속성에서 수정

Image(164)

#include <windows.h>

#include <stdio.h>

int main(void)

{

    u_char caString[255] = {0x0D, 0, 0x71, 0, 0x30, 0, 0, 0, 0x0A, 0, 0, 0x46, 0x41};

    DWORD dwCnt;

    DCB sPState;

    unsigned short ucTmp;

    // 1. 시리얼 포트 열기

    HANDLE hComm = CreateFile("COM6"        // 포트 이름

        , GENERIC_READ|GENERIC_WRITE        // RW가능

        , 0

        , NULL

        , OPEN_EXISTING

        , FILE_ATTRIBUTE_NORMAL

        , 0);

    if(INVALID_HANDLE_VALUE == hComm)

    {

        printf("포트 열 수 없음\n");

        return 0;

    }

    if( 0 == SetupComm(hComm, 4096, 4096))    // 2. Read버퍼와 write 버퍼 길이 설정

    {

        printf("버퍼 설정 에러\n");

        CloseHandle(hComm);

        return 0;

    }

    if(0 == PurgeComm(hComm, PURGE_TXABORT|PURGE_TXCLEAR))        // 3. 버퍼 초기화

    {

        printf("버퍼 초기화 에러\n");

        CloseHandle(hComm);

        return 0;

    }

    sPState.DCBlength = sizeof(sPState);

    if( 0 == GetCommState(hComm, &sPState))        // 4. 현재 시리얼 세팅을 읽어온다

    {

        printf("시리얼 상태 읽기 에러\n");

        CloseHandle(hComm);

        return 0;

    }

    // 5. 시리얼 설정

    sPState.BaudRate = CBR_38400;

    sPState.ByteSize = 8;

    sPState.Parity = EVENPARITY;

    sPState.StopBits = ONESTOPBIT;

    if(0 == SetCommState(hComm, &sPState))        // 6. 시리얼 세팅 적용

    {

        printf("시리얼 상태 설정 에러\n");

        CloseHandle(hComm);

        return 0;

    }

    WriteFile(hComm, caString, caString[0], &dwCnt, 0);         // 7. 시리얼 통신

    ReadFile(hComm, caString, 1, &dwCnt, 0);

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

    printf("수신한 바이트 수는 %d 입니다\n", dwCnt+1);

    CloseHandle(hComm);

    return 0;

}

Image(165)


  • 시리얼로 전송하는 명령을 바꿔서 다른 방식으로 제어
    • 명령어 문자열의 CRC를 함수를 사용해서 계산

#include <windows.h>

#include <stdio.h>

#define CRC_POLYNOM     0x8408

#define CRC_PRESET          0xFFFF

unsigned short CRC16(void * vpData, unsigned int uiLen);

int main(void)

{

    u_char caString[255] = {0x0D, 0, 0x71, 0, 0x0F, 0, 0, 0, 0x0A, 0, 0};

    DWORD dwCnt;

    DCB sPState;

    unsigned short ucTmp;

    // 1. 시리얼 포트 열기

    HANDLE hComm = CreateFile("COM6"        // 포트 이름

        , GENERIC_READ|GENERIC_WRITE        // RW가능

        , 0

        , NULL

        , OPEN_EXISTING

        , FILE_ATTRIBUTE_NORMAL

        , 0);

    if(INVALID_HANDLE_VALUE == hComm)

    {

        printf("포트 열 수 없음\n");

        return 0;

    }

    // 2. Read버퍼와 write 버퍼 길이 설정

    if( 0 == SetupComm(hComm, 4096, 4096))

    {

        printf("버퍼 설정 에러\n");

        CloseHandle(hComm);

        return 0;

    }

    // 3. 버퍼 초기화

    if(0 == PurgeComm(hComm, PURGE_TXABORT|PURGE_TXCLEAR))  

    {

        printf("버퍼 초기화 에러\n");

        CloseHandle(hComm);

        return 0;

    }

    sPState.DCBlength = sizeof(sPState);

    // 4. 현재 시리얼 세팅을 읽어온다

    if( 0 == GetCommState(hComm, &sPState))

    {

        printf("시리얼 상태 읽기 에러\n");

        CloseHandle(hComm);

        return 0;

    }

    // 5. 시리얼 설정

    sPState.BaudRate = CBR_38400;

    sPState.ByteSize = 8;

    sPState.Parity = EVENPARITY;

    sPState.StopBits = ONESTOPBIT;

    // 6. 시리얼 세팅 적용

    if(0 == SetCommState(hComm, &sPState))

    {

        printf("시리얼 상태 설정 에러\n");

        CloseHandle(hComm);

        return 0;

    }

    // 7. CRC값 대입

    *((unsigned short *)(caString + caString[0] -2)) = CRC16(caString, caString[0]-2);

    // 8. 시리얼 통신

    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)

{

    int i, j;

    unsigned short crc = CRC_PRESET;

    unsigned char * DATA = vpData;

    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;

}

728x90