参考博文
https://blog.csdn.net/liuzhuomju/article/details/7479507
#pragma once
#define RX_CHAR WM_USER+1
class CMySerialPort
{
private:
HANDLE m_hThread;
bool m_IsOpen;
public:
OVERLAPPED m_tOverLaped;
bool m_IsFun;
HANDLE m_hCom;
CWnd *m_pWnd;
public:
CMySerialPort(void);
~CMySerialPort(void);
public:
bool OpenPort(CString port,CWnd *pWnd);
bool ClosePort(void);
bool SetParament(DWORD BaudRate = 9600,
BYTE Parity = ODDPARITY, /* 0-4 = NOPARITY,ODDPARITY,EVENPARITY,MARKPARITY,SPACEPARITY */
BYTE ByteSize =8,
BYTE StopBits = 0); //0,1,2 = 1, 1.5, 2
bool ReadData(unsigned char *buf,UINT &len);
bool WriteData(unsigned char *buf,UINT len);
};
#include "StdAfx.h"
#include "MySerialPort.h"
CMySerialPort::CMySerialPort(void)
{
m_hCom = NULL;
m_pWnd = NULL;
m_hThread=NULL;
m_IsOpen = false;
memset(&m_tOverLaped,0,sizeof(OVERLAPPED));
m_tOverLaped.hEvent = CreateEvent(NULL,TRUE,FALSE,NULL);//创建一个事件
}
CMySerialPort::~CMySerialPort(void)
{
}
bool CMySerialPort::OpenPort(CString port,CWnd *pWnd)
{
bool flag = false;
if(m_IsOpen)
ClosePort();
m_hCom = CreateFile(port, //打开串口1
GENERIC_READ|GENERIC_WRITE, //允许读和写操作
0, //独占方式
NULL,
OPEN_EXISTING, //打开一个存在的串口
FILE_ATTRIBUTE_NORMAL,//|FILE_FLAG_OVERLAPPED, //异步方式打开
NULL
);
if (m_hCom!=INVALID_HANDLE_VALUE)
{
m_pWnd = pWnd;
m_IsOpen = true;
flag = true;
}
return flag;
}
bool CMySerialPort::ClosePort(void)
{
if(m_IsOpen)
{
m_IsFun =false;
m_IsOpen = false;
if(CloseHandle(m_hCom))
return true;
else
return false;
}
else
return false;
}
bool CMySerialPort::SetParament(DWORD BaudRate,BYTE Parity,BYTE ByteSize,BYTE StopBits )
{
SetupComm(m_hCom,1024,1024); //设置发送和接收缓冲区大小
//设置串口信息
DCB dcb;
GetCommState(m_hCom,&dcb);
dcb.BaudRate = 9600;
dcb.fBinary = TRUE;
dcb.fParity = TRUE;
dcb.ByteSize = 8;
dcb.Parity = ODDPARITY;
dcb.StopBits = ONESTOPBIT;
if (!SetCommState(m_hCom,&dcb))//设置串口状态
{
return false;
}
if (!SetCommMask(m_hCom,EV_RXCHAR | EV_TXEMPTY))//设置串口掩码
{
return false;
}
COMMTIMEOUTS timeout;
timeout.ReadIntervalTimeout = 50;
timeout.ReadTotalTimeoutMultiplier = 50;
timeout.ReadTotalTimeoutConstant = 500;
timeout.WriteTotalTimeoutConstant = 500;
timeout.WriteTotalTimeoutMultiplier = 50;
SetCommTimeouts(m_hCom, &timeout);
return true;
}
bool CMySerialPort::ReadData(unsigned char *DataBuffer,UINT &len)
{
COMSTAT rst;
bool flag = false;
ClearCommError(m_hCom,NULL,&rst);
//读取数据到缓冲区中
if (ReadFile(m_hCom,DataBuffer,len,NULL,NULL)>0)
{
flag = true;
}
return flag;
}
bool CMySerialPort::WriteData(unsigned char *buf,UINT len)
{
bool flag = false;
if(m_IsOpen)
{
if (WriteFile(m_hCom, buf, len, NULL,NULL)>0)
{
flag = true;
}
}
return flag;
}