윈도우 기반 직렬통신

 윈도우 기반 직렬 통신을 위해 먼저 Virtual Serial Port Driver 프로그램을 설치했다. 크로스 연결된 2개의 가상 포트를 생성할 수 있다.

 



설정이 끝나고 장치관리자를 보면 위와 같이 뜬다.

 직렬 통신 절차


 송신 프로그램
#include <stdio.h>
#include <iostream>
#include <windows.h>
using namespace std;

int main(void)
{
  char szPort[15];

  wsprintf(szPort, "COM%d"2);

  HANDLE m_hComm = NULL;
  m_hComm = CreateFile(szPort,
            GENERIC_READ | GENERIC_WRITE,
            0, NULL, OPEN_EXISTING,
            FILE_ATTRIBUTE_NORMAL, NULL);    // 통신 포트 열기
  
  if(m_hComm == INVALID_HANDLE_VALUE)
  {
    printf("(!) Failed to create a Comm Device file");
    return FALSE;
  }
  DCB dcb;
  dcb.DCBlength = sizeof(DCB);

  GetCommState(m_hComm, &dcb);  // 기본 통신 상태 읽기

  // 통신 속도 상태 설정
  dcb.BaudRate = 9600;
  dcb.ByteSize = 8;
  dcb.Parity = 0;
  dcb.StopBits = 0;

  SetCommState(m_hComm, &dcb);

  // 통신 이벤트 객체 생성
  OVERLAPPED osWrite;
  osWrite.Offset = 0;
  osWrite.OffsetHigh = 0;
  osWrite.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);

  char buf[100= "Hello world \r\n";
  while(1)
  {
    cout << "Input : ";
    cin >> buf;
    printf("send:%s\n", buf);
    WriteFile(m_hComm, buf, strlen(buf), NULL, &osWrite);  // 데이터 전송

    if((buf[0== '-'&& (buf[1== '1'))
      break;
    //Sleep(1000);
  }
  CloseHandle(m_hComm);

  return 0;
}

 수신 프로그램
#include <stdio.h>
#include <windows.h>
#include <iostream>
using namespace std;

int main(void)
{
  char szPort[15];

  wsprintf(szPort, "COM%d"3);

  HANDLE m_hComm = NULL;
  m_hComm = CreateFile(szPort,
            GENERIC_READ | GENERIC_WRITE,
            0, NULL, OPEN_EXISTING,
            FILE_ATTRIBUTE_NORMAL, NULL);  // 통신 포트 열기
  
  if(m_hComm == INVALID_HANDLE_VALUE)
  {
    printf("(!) Failed to create a Comm Device file");
    return FALSE;
  }
  DCB dcb;
  dcb.DCBlength = sizeof(DCB);

  GetCommState(m_hComm, &dcb);  // 기본 통신 설정 상태 읽기

  // 통신 속도 상태 설정
  dcb.BaudRate = 9600;
  dcb.ByteSize = 8;
  dcb.Parity = 0;
  dcb.StopBits = 0;

  SetCommState(m_hComm, &dcb);

  // 통신 이벤트 객체 생성
  OVERLAPPED osRead;
  osRead.Offset = 0;
  osRead.OffsetHigh = 0;
  osRead.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);

  DWORD size;
  char buf[100];
  while(1)
  {
    ReadFile(m_hComm, buf, 100&size, &osRead);  // 데이터 수신
    buf[size] = '\0';
    printf("recv:%s\n", buf);
    if((buf[0== '-'&& (buf[1== '1'))
      break;
  }
  CloseHandle(m_hComm);

  return 0;
}
// COM2, COM3는 가상 포트로 두 포트는 연결되어 있는 상태이다.
// 송신 프로그램에서 전송할 문자를 입력한 뒤 엔터를 치면 데이터를 전송한다.
// -1를 입력하면 송신 프로그램 수신 프로그램 모두 종료 된다.



+ Recent posts