采用CreateFile方式创建串口并且串口延时的系数设置为MAX,0,0;
m_hSerial = CreateFile("COM3",GENERIC_READ | GENERIC_WRITE,0,NULL,OPEN_EXISTING,0,NULL);
m_hSerial2 = CreateFile("COM8",GENERIC_READ | GENERIC_WRITE,0,NULL,OPEN_EXISTING,0,NULL);
if(m_hSerial == INVALID_HANDLE_VALUE)
{
return FALSE;
}
if(m_hSerial2 == INVALID_HANDLE_VALUE)
{
return FALSE;
}
GetCommTimeouts(m_hSerial,&m_stCOMTime);
GetCommTimeouts(m_hSerial2,&m_stCOMTime);
DCB dcb;
GetCommState(m_hSerial,&dcb);
GetCommState(m_hSerial2,&dcb);
dcb.BaudRate=9600;
dcb.ByteSize=8;
dcb.Parity=0;
dcb.StopBits=0;
SetCommState(m_hSerial,&dcb);
SetCommState(m_hSerial2,&dcb);
m_stCOMTime.ReadIntervalTimeout = MAXWORD;
m_stCOMTime.ReadTotalTimeoutMultiplier = 0;
m_stCOMTime.ReadTotalTimeoutConstant = 0;
m_stCOMTime.WriteTotalTimeoutMultiplier = 0;
m_stCOMTime.WriteTotalTimeoutConstant = 0;
SetCommTimeouts(m_hSerial,&m_stCOMTime);
if(0 == SetupComm(m_hSerial,40,40))
return FALSE;
PurgeComm(m_hSerial,PURGE_TXCLEAR|PURGE_RXCLEAR);
SetCommTimeouts(m_hSerial2,&m_stCOMTime);
if(0 == SetupComm(m_hSerial2,40,40))
return FALSE;
PurgeComm(m_hSerial2,PURGE_TXCLEAR|PURGE_RXCLEAR);
return TRUE;
以上为串口设置的代码,一个串口用于接收数据,一个串口用于发送数据。
解决方案背景:因为工作原因会碰到串口数据处理,通常设备发送的串口数据为不定字节数量的数据,这样给接收并且分析数据带来了很大的困扰。很少设备的消息发送会采用定字节数量的方式。
解决方案目的:这里需要实现的是设备发送给软件不定字节数量的数据,我们需要从不定字节数量里面取一定字节数量的数据。比如A设备发送了300字节数据,也有可能在NG情况下发送310字节数据,而我只需要280有效字节数据即可(并且该数据是从数据段头开始计算长度的)。
解决方案实现:即另外设置一个串口用于回发消息。
int CSerialTestDlg::SerialPortMesgBack(HANDLE hSerialPort)
{
int ret=0;
CString strSend = "A\n";
unsigned long len = strSend.GetLength();
ret = WriteFile(hSerialPort,strSend,len,&len,NULL);
if(0 == ret)
{
return -1;
}
Sleep(40);
return 1;
}
即在ReadFile之后调用消息回发函数即可,需要注意的是Sleep延时函数是不能够省略的。
以上解决方法是通过本人自己实验得出,但是其中的原理很遗憾并不能够理解或领悟。