1、先入为主,实例开始,可以编写测试程序向串口发送数据,并用串口监测工具Access Port监测串口通信数据
a、设计串口类
class ComDevice
{
public:
ComDevice();
~ComDevice();
//打开串口
int OpenCom(char *,LPDCB);//char指向串口逻辑名,LPDCB指向设备控制块数据结构
int CloseCom();//关闭串口
int Read(char *,DWORD);//读串口收到的数据(一次)
int Write(char *,DWORD,DWORD);//向串口发送数据
public:
DWORD m_error_code;//最后一次操作错误码
DCB m_state;//串口配置
COMMTIMEOUTS m_Timeouts;//读写超时时间
HANDLE m_handle;//串口句柄
};
b、打开串口并初始化
int ComDevice::OpenCom(char *port,LPDCB lpDCB)
{
this->m_error_code = 0;//操作错误码复位
/*如果串口已经打开*/
if(this->m_handle != NULL)
return -1;
//打开串口
this->m_handle = CreateFile(port,GENERIC_READ | GENERIC_WRITE,//读写方式打开
0,
NULL,
OPEN_EXISTING,//已经创建,则打开即可
FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED,//重叠方式(异步)
NULL);
if(this->m_handle == INVALID_HANDLE_VALUE)
{
this->m_error_code = ::GetLastError();//获取错误码
this->m_handle = NULL;
return -2;
}
//初始化串口信息
//设置串口读写缓冲区大小
if(!SetupComm(this->m_handle,4200,4200))
return -1;
//终止所有的异步数据读写操作并清空读写缓冲区
if(!PurgeComm(this->m_handle,PURGE_TXABORT | PURGE_RXABORT |
PURGE_TXCLEAR | PURGE_RXCLEAR))
return -1;
if(!GetCommState(this->m_handle,&m_state))
return -1;
/*设置一些需要修改的信息即可,其他使用系统默认值*/
this->m_state.DCBlength = sizeof(lpDCB);
this->m_state.BaudRate = lpDCB->BaudRate;//传输速率
this->m_state.ByteSize = lpDCB->ByteSize;//指定端口当前使用数据位数
this->m_state.Parity = lpDCB->Parity;//奇偶校验
this->m_state.StopBits = lpDCB->StopBits;//指定当前串口使用停止位数
this->m_state.fOutxDsrFlow = lpDCB->fOutxDsrFlow;//指定DSR是否用于检测发送流控制,当该成员为TRUE,而DSR为OFF时,发送将被挂起,直到DSR置ON。
this->m_state.fDtrControl = lpDCB->fDtrControl;//DTR流量控制
this->m_state.fOutxCtsFlow = lpDCB->fOutxCtsFlow;//指定CTS是否用于检测发送流控制
this->m_state.fRtsControl = lpDCB->fRtsControl;//RTS流量控制
if(!SetCommState(this->m_handle,&(this->m_state)))
return -1;
return 0;
}
c、读串口数据
int ComDevice::Read(char *readBuff,DWORD readLen)
{
COMSTAT state;
DWORD error_ = 0;
DWORD len = 0;
this->m_error_code = 0;
if(this->m_handle == NULL)
return -1;
//读取DTR信号判断串口连接是否有效
if(this->m_state.fOutxDsrFlow == true)
{
DWORD sig_mask = 0;
GetCommModemStatus(this->m_handle,&sig_mask);
if((sig_mask & MS_DSR_ON) !&