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

20151209-김재홍-Serial_3일차-RFID_도스

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

/***Serial통신_3일차-RFID_도스용시리얼통신프로그램***/


어제하던 리눅스 시리얼 프로그래밍 마무으리


시리얼 통신 실습시 주의 사항

※ V3백신 프로그램을 사용하고 있다면

실습중에 종료해주면 시리얼 통신이 원활해집니다.

※ 리눅스 시리얼 통신 환경으로, 리눅스를 최신버전으로 업그레이드해주고 

작업하는 것을 권장합니다.



/*--Non_Canonical.c--*/
#include<stdio.h>
#include<fcntl.h>
#include<termio.h>
#include<sys/types.h>
#include<sys/stat.h>
#include "smart.h"

#define SPEED B19200
#define SPORT "/dev/ttyS0"
#define POLYNOM 0x8408
#define PRESET  0xFFFF

unsigned char ucAbeep[] = {0x0D, 0x000x710x00,
                        0x300x000x000x00,
                        0x0A, 0x000x000x460x41};

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

int main1(void)
{
        unsigned short usCRC = CRC16(ucAbeep, (ucAbeep[0] - 2) );
        printf("%04x\n", usCRC);
        return 0;
}

int main(void)
{
        char cBuff[255];

        int iDev = 0;
        int iRet = 0;

        struct termios stOldState;
        struct termios stNewState;

        iDev = open(SPORT, O_RDWR | O_NOCTTY);

        if (0 > iDev)
        {
                perror(SPORT);
                exit(-100);
        }
        tcgetattr(iDev, &stOldState);
        bzero(&stNewState, sizeof(stNewState));

        stNewState.c_cflag = SPEED | CRTSCTS | CS8 | CLOCAL | CREAD | PARENB;

        stNewState.c_iflag = IGNPAR | ICRNL;
        stNewState.c_oflag = 0;

        stNewState.c_lflag = 0;
        bzero(stNewState.c_cc, NCCS);
        stNewState.c_cc[VTIME] = 0;
        stNewState.c_cc[VMIN] = 10;

        tcflush(iDev, TCIFLUSH);
        tcsetattr(iDev, TCSANOW, &stNewState);

        while (1)
        {
                getchar();
                iRet = write(iDev, ucAbeep, ucAbeep[0]);
        }

        tcsetattr(iDev, TCSANOW, &stOldState);
        close(iDev);

}

unsigned short CRC16(void * vpData , unsigned int uiLen)
{
        unsigned int iCntX;
        unsigned int iCntY;
        unsigned short crc = PRESET;
        unsigned char * DATA = vpData;

        for (iCntX = 0; iCntX < uiLen; ++iCntX)
        {
                crc ^= DATA[iCntX];
                for (iCntY = 0; iCntY < 8; ++iCntY)
                {
                        if (crc & 0x0001)
                        {
                                crc = (crc >> 1)^POLYNOM;
                        }
                        else
                        {
                                crc = (crc >> 1);
                        }
                }
        }
        return crc;
}



연결된 포트번호를 확인합니다. COM3





시리얼통신 도스프로그래밍 소스 : 

Win_Serial.pdf



/*---dos.c---*/
#include <Windows.h>
#include <stdio.h>

#define PRESET  0xFFFF
#define POLYNOM 0x8408

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

int main(void)
{
  u_char caString[255= {0x0D, 0x000x710x00
            0x300x000x000x00,
            0x0A, 0x000x00};
  /*u_char caString[255] = {0x0D, 0x00, 0x71, 0x00,
            0x30, 0x00, 0x00, 0x00,
            0x0A, 0x00, 0x00, 0x46, 0x41};    */


  DWORD dwCnt;  // double world Written 쓰기 후 실제 쓴 바이트 수 저장 공간
  DCB sPState;    // struct Port State 시리얼 포트 상태 저장
  HANDLE hComm    // handle of Communication
    = CreateFile("COM3"
    , 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 == GetCommState(hComm, &sPState))
  {
    printf("시리얼 상태 설정 에러\n");
    CloseHandle(hComm);
    return 0;
  }

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

  WriteFile(hComm, caString, caString[0], &dwCnt, 0);
  ReadFile(hComm, caString, 1&dwCnt, 0);
  ReadFile(hComm, caString + 1, caString[0] - 1&dwCnt, 0);
  printf("수신한 바이트 수는 %d 입니다.\n", dwCnt + 1);  //


  CloseHandle(hComm);

  return 0;
}

unsigned short CRC16(void * vpData, unsigned int uiLen)
{
  unsigned int iCntX;
  unsigned int iCntY;
  unsigned short crc = PRESET;
  unsigned char * DATA = vpData;

  for (iCntX = 0; iCntX < uiLen; ++iCntX)
  {
    crc ^= DATA[iCntX];
    for (iCntY = 0; iCntY < 8; ++iCntY)
    {
      if (crc & 0x0001)
      {
        crc = (crc >> 1) ^ POLYNOM;
      }
      else
      {
        crc = (crc >> 1);
      }
    }
  }
  return crc;
}






728x90