2017-06-02 123 views
0

我正在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); 
} 
+0

您的恐惧听起来没有根据。除了定时之外,是否有某种方法可以区分数据包的结束/开始(这是一个相当尴尬的区别)?如果没有,您可以添加一些独特的框架,这将允许您的接收应用程序与数据包边界同步。 – barny

+0

它有一个预定义的页眉和页脚。这个头文件可以是'0x10'或'0x80',页脚可以是'0x1F'或'0x8F'。但是,我将如何检查这个?另外我将如何设置50毫秒的差距? – EagerLearner

+0

编辑:我将ReadIntervalTimeout设置为50毫秒,其余设置为零。这是否意味着应用程序将在第一个字节前等待任意时间,然后填充缓冲区(其大小设为45),然后等待50毫秒? – EagerLearner

回答

1

检查在您需要实现对协议的接收应用程序 - 你的代码需要开始“不同步“这意味着在你的情况下,它会寻找一个页眉和页脚正确的字节数,并抛出数据,直到找到这些数据。当它们被发现时,协议是“同步的”,并且数据包被发送用于消费,并且协议总是保持对页眉/页脚的检查 - 如果找到,数据被接受为数据包,如果没有发现状态恢复到不同步。你的代码寻找一个数据包应该积累数据,一旦同步只消耗掉它的数据包长度,也就是说,如果你接收到46个字节,则消耗45个数据,然后继续向剩余的1个字节添加数据,直到你有45个或更多,放弃更多。当你得到这个工作时,你不需要担心数据包之间的差距。通常的做法是,你维护一个缓冲区,接收字节被添加到哪个缓冲区,以及从哪些缓冲区中消耗掉没有消耗的数据作为下一个数据包 - 这样你就不需要你的代码来担心数据包之间的超时或意外处理延迟等。

+0

因此,如果我确信页眉和页脚将相距43个字节,我是否可以减少同步条件以查找标题?上面添加了我修改过的读取功能。 – EagerLearner

+0

您的标题字节是否可以显示在这43个字节中?如果是这样,你有更强的需求,以确保你真正检测到真正的标题。对我而言,无论如何你都可以使用它。你必须在标题后面组装下面的43个字节,所以你可以等待第44个并检查它。 – barny

+0

您正在一次读取一个字节的传入数据,这看起来效率不高(但可能稍后会被修复),而且我看不到您的代码如何处理标头之后的字节(当i> 0时) ,而且我没有看到你的代码如何检查页脚(当我== 43和另一个字符已被接收),只有然后发送累积消息关闭进行处理。工作进展中,我假设。 – barny

相关问题