100 Hz串行数据

3
我有一个传感器,使用RS422通过串口输出消息(我认为这是正确的术语)。无论如何,我制作了我的接线束,并将其连接到我的rs422转usb转换器上,然后在超级终端中获得了数据。很好。
现在该传感器具有奇怪的波特率,为1500kbps。我在Windows中完成此操作,因此设置该波特率实际上并不难。最初,在通电时,传感器每10hz发送一次69字节的消息。我看到了这条消息,正确的字节被读取,并且消息非常准确(它包括一个时间戳,等待它,每个消息都会增加0.1秒!)最重要的是,我在其边界上获得了消息,换句话说,每次读取都是一个新消息。
总之,到目前为止情况还不错,所以我迈出了下一步,向串口发送了一个写入命令,以激活传感器数据消息。此消息大小为76字节,并以100hz的速度发送。再次成功,更多的数据开始出现在读数中。但是,我没有按照100hz的速度获取它,而是得到了3968字节的块。如果我降低缓冲区,我会很快地读取1024三次,然后立即读取896。(再次是3968字节)。 (请注意,我现在接收到了两条消息,一个大小为69的10hz消息和一个大小为76的100hz消息,请注意,这两条消息的任何组合都不能均匀地分成3968。)
我的问题是,某个地方正在缓冲我的100hz消息,而我没有在接收它们时得到它们。我想改变这种情况,但我不知道我要找什么。我不需要在其边界上获得100hz消息,我只是不希望以2 Hz的速度获取它。我会满意30hz甚至20hz。
以下是我的串口设置代码:
 serial_port_ = CreateFile(L"COM6", GENERIC_READ | GENERIC_WRITE, 0, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);

通信状态和超时

 COMMTIMEOUTS comm_timeouts;
 ZeroMemory(&comm_timeouts, sizeof(COMMTIMEOUTS));
 //comm_timeouts.ReadIntervalTimeout = MAXDWORD; //Instant Read, still get 3968 chunks
 comm_timeouts.ReadIntervalTimeout = 1; //1ms timeout
 comm_timeouts.ReadTotalTimeoutConstant = 1000; //Derp?
 comm_timeouts.WriteTotalTimeoutConstant = 5000; //Derp.
 SetCommTimeouts(serial_port_, &comm_timeouts);

 DCB dcb_configuration;
 ZeroMemory(&dcb_configuration, sizeof(DCB));
 dcb_configuration.DCBlength = sizeof(dcb_configuration);
 dcb_configuration.BaudRate = 1500000;
 dcb_configuration.ByteSize = 8;
 dcb_configuration.StopBits = ONESTOPBIT;
 dcb_configuration.Parity = ODDPARITY;
 if(!SetCommState(serial_port_, &dcb_configuration))

我的阅读

 if(!ReadFile(serial_port_, read_buffer_, 1024, &bytes_read, NULL))
1个回答

3
我猜测您的串口-USB转换器会进行缓冲。由于USB是基于数据包的,因此需要进行一些缓冲。在10Hz的速率下,可能存在足够大的延迟,以便在每条消息后刷新缓冲区。但是在100Hz时,消息之间的时间间隔很短,可能会通过其他逻辑来刷新缓冲区。
这样说您是否明白呢?

它确实是我所认为的。然而,我对串口编程还很陌生,所以我不想先做出这种假设。如果这是真的,那么我该怎么办呢?有没有一种方法可以设置串口的系统缓冲区?API调用可能会影响串口转换器驱动程序,是否有Windows API调用来设置通信缓冲区?我的观点是,我们知道转换器能够达到10HZ,让我们至少达到这个水平。而不是2 HZ。 - Constantin
4
我曾经查看过类似的应用程序,并在http://www.ftdichip.com/Support/Documents/AppNotes/AN232B-04_DataLatencyFlow.pdf的第3.1节中找到了USB转换器的好解释。该文档适用于FTDI FT232,但我认为其他设备的工作方式也类似(有其他有用的应用说明)。如果您正在使用FT232设备,则可以设置此延迟定时器。我相信在Windows上也可以做到,但我从未尝试过。对于Linux,您可以使用http://www.intra2net.com/en/developer/libftdi/documentation/group__libftdi.html#ga3e0227b0c7aa859d2d2afb5ffa4c8466。 - rve
2
在FT232设备的Windows系统中找到了它,它在AN_107高级驱动程序选项中:http://www.ftdichip.com/Support/Documents/AppNotes/AN_107_AdvancedDriverOptions_AN_000073.pdf - rve
我认为我的实际上是FTDI芯片,但我不知道具体型号。我无法弄清楚。它的型号是UTS-M14,是一个4端口USB转换器。这是我能找到的唯一支持> 1500 kbps的转换器。 - Constantin
嘿,我的驱动程序让我从设备管理器中更改了这些设置,我将超时时间从16毫秒调整到8毫秒,现在一切都很完美。感谢rve提供的文档,能否请您给出一个答案,以便我可以接受它并分享给其他人! - Constantin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接