我正在Visual C++ 2008中开发一个应用程序,它应该读取通过串行接口从硬件设备接收的一些数据。数据以每50毫秒45个字节的数据包的形式发送。我正在使用WIN32 API提供的功能来完成所有必要的任务,如打开和关闭端口。如何设置固定数据包字节之间的读取超时值?
这是我的reference。
在它的作者提到设置超时的过程等待数据
COMMTIMEOUTS timeouts = { 0 };
timeouts.ReadIntervalTimeout = 50; // in milliseconds
timeouts.ReadTotalTimeoutConstant = 50; // in milliseconds
timeouts.ReadTotalTimeoutMultiplier = 10; // in milliseconds
timeouts.WriteTotalTimeoutConstant = 50; // in milliseconds
timeouts.WriteTotalTimeoutMultiplier = 10; // in milliseconds
的COMMTIMEOUTS
结构的第一构件是两个连续的字节之间的等待时间。对我来说,这应该是0,因为我一次接收45个字节,然后在等待下一个数据包时它必须等待50毫秒。
在设置DCB结构时,将字节大小设置为8*45
位,然后将ReadIntervalTimeout
设置为50毫秒工作?
编辑:它不会。我只是将字节大小的定义读为4和8之间。我可以用其他方法处理这个问题吗?
也可以设置事件处理程序与这些超时?我希望能够保持应用程序运行,而只有当它检测到数据时才能读取。但是如果启动硬件设备已经发送了45字节的20个字节,应用程序可能会将字节21作为第一个字节。这种恐惧没有根据吗?
编辑2:我已经修改了我的阅读功能,以下要占为适当的头
void CGCUGUIDlg::fnRead()
{
char TempChar; //Temporary character used for reading
char SerialBuffer[45];//Buffer for storing Rxed Data
DWORD NoBytesRead;
int i = 0;
do
{
ReadFile(m_hComm, //Handle of the Serial port
&TempChar, //Temporary character
sizeof(TempChar),//Size of TempChar
&NoBytesRead, //Number of bytes read
NULL);
if(TempChar == 0x10||0x80)
{SerialBuffer[i] = TempChar;// Store Tempchar into buffer
i++;}
}
while (NoBytesRead > 0);
}
您的恐惧听起来没有根据。除了定时之外,是否有某种方法可以区分数据包的结束/开始(这是一个相当尴尬的区别)?如果没有,您可以添加一些独特的框架,这将允许您的接收应用程序与数据包边界同步。 – barny
它有一个预定义的页眉和页脚。这个头文件可以是'0x10'或'0x80',页脚可以是'0x1F'或'0x8F'。但是,我将如何检查这个?另外我将如何设置50毫秒的差距? – EagerLearner
编辑:我将ReadIntervalTimeout设置为50毫秒,其余设置为零。这是否意味着应用程序将在第一个字节前等待任意时间,然后填充缓冲区(其大小设为45),然后等待50毫秒? – EagerLearner