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

20151209 - 홍준모 3일차 오전 : 가상 리눅스 RFID 시리얼 통신(실패), 오후 : 도스 RFID 시리얼 통신(성공)

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

오전에는 전부 리눅스 RFID 통신 실험 

문제 발생 ! : vmware의 가상 머신과의 시리얼 통신이 내부적인 어떤 문제가 있는 모양. 소스로 Beep 음 내는 데이터를 write() 시키니 RFID 통신이 안된다.

윈도우에서 문제를 발생 시키는 것일 수도 있고, 경우의 수가 워낙 다양. 어째뜬 ComportMaster로 RFID 시리얼 통신에 성공 했으니 우선 도스나 윈도우 RFID 통신으로 바로 넘어가기로.

오후 부터는 도스, 윈도우 용 할 것이다.

주쌤 : 코드 쳐노셈. 


주쌤 : 남수진 씨 문제 -> 두 자릿수 컴포트 번호는 원래 안 열림.

하물며 백신 문제도..





//gps 에서 오는 데이터를 읽으면, x,y 좌표를 읽을 수 있다.
//그 좌표를 구글 맵이나 네이버 맵에 던져주면 지도에 현재 위치가 표시 되는 것이다.
//나머지는 맵하고 연동만 하면 되는 것이다. gps의 문제점은 지도가 있냐 없느냐, 어디에 그 좌표를 찍을것이냐 라는 문제다.
//시리얼만 할 줄 알면 그 장비에 대한 
//그 프로토콜만 알면 시리얼 통신이야 쉽다라는 것이다.

#include <windows.h>
#include <stdio.h>

#define CRC_POLYNOM     0x8408
#define CRC_PRESET      0xFFFF

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

int main()
{
  u_char caString[255= { 

    0x0D  //총 갯수 3개
    , 0x00    
    , 0x71    
    
    , 0x000x30
    , 0x000x07  //비프음만 Flash 동작
    , 0x000x0A
    
    /*
    , 0x00, 0x3F
    , 0x00, 0x07  //OSF => 두 LED, 비프음 Flash 동작. 
    , 0x00, 0x0F  //LED는 red : 01, grn : 11 다른 속도로 동작
    */

    /*
    , 0x00, 0x0F
    , 0x00, 0x0F  //OSF => 두 LED, 비프음 Flash 동작. 
    , 0x00, 0x0A  //LED는 red : 01, grn : 11 같은 속도로 동작
    */

    , 0x000x00
    
    };  
  DWORD dwCount;    //double world Written 쓰기 후 실제 쓴 바이트 수 저장 공간
  DCB sPState;      //struct port state 시리얼 포트 상태 저장
  HANDLE hComm = CreateFile(L"COM6"  //handle of Communication
    , 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, 40964096))
  {
    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;
  }

  *((unsigned short*)(caString + caString[0] - 2)) = CRC16(caString, caString[0] - 2);  //46, 41 뺐음, (2바이트 캐스팅)(주소) => 46 41 이 계산되어 넣었다라는 뜻., 이제 crc 값은 자동 생성 된다.

  WriteFile(hComm, caString, caString[0], &dwCount, 0);
  ReadFile(hComm, caString, 1&dwCount, 0);
  ReadFile(hComm, (caString + 1), (caString[0] - 1), &dwCount, 0);  //하나 수신 했기에 -1
  printf("수신한 바이트 수는 2 : %d\n", dwCount + 1);

  CloseHandle(hComm);

  return 0;
}

//uiLen == number of protocol bytes without CRC
unsigned short CRC16(void *vpData, unsigned int uiLen)
{
  unsigned short crc = CRC_PRESET;
  unsigned int i, j;
  unsigned char *DATA = (unsigned char*)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