关于串口读取指定字节的操作流程

采用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延时函数是不能够省略的。

以上解决方法是通过本人自己实验得出,但是其中的原理很遗憾并不能够理解或领悟。

猜你喜欢

转载自blog.csdn.net/mce_19/article/details/79340456