我正在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毫秒?
我也可以使用这些超时设置事件处理程序吗?我希望能够保持应用程序运行,而只有在检测到数据时才会读取。但是我担心如果在启动时硬件设备已经发送了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);
}
答案 0 :(得分:1)
在您的接收应用程序中,您需要实现您的协议 - 您的代码需要从“不同步”开始,这意味着在您的情况下,它会查找页眉和页脚相隔正确的字节数,并丢弃数据,直到找到它们为止。当它们被找到时,协议被“同步”并且数据包被发送以供消费,并且协议总是继续检查页眉/页脚 - 如果找到,则数据被接受为数据包,如果没有找到则状态恢复为不同步。你的代码寻找数据包应该累积数据,一旦同步必须只消耗它的数据包长度,即如果你收到46个字节,消耗45然后继续将数据添加到剩余的1个字节,直到你有45或更多,并且'丢掉更多。当你开始工作时,你不必担心数据包之间的差距。通常的做法是保持一个缓冲区,添加接收到的字节,并从中消耗数据,留下尚未消耗的数据作为下一个数据包添加 - 这样您就不需要担心代码了数据包之间的超时,或意外的处理延迟等。