来自串行的100 Hz数据

100 Hz Data From Serial

本文关键字:Hz 数据      更新时间:2023-10-16

我有一个传感器,它使用RS422通过串行方式吐出消息。(我认为这是正确的术语。)无论如何,我制作了线束,并将其连接到我的rs422到usb转换器和tada,我在超级终端中获得了数据。好东西。

现在传感器的波特率为1500kbps。我在Windows中做这件事,所以设置波特率其实并不难。最初,在通电时,传感器每10hz发送一条69字节的信息。我看到了这条消息,读取了正确的字节,消息非常准确(它包括一个时间戳,等待它,每条消息增加0.1秒!)最重要的是,我在它的边界上得到了消息,换句话说,每次读取都是一条新消息。

无论如何,到目前为止一切都很好,所以我采取了下一步,我通过串行端口发送了一个写命令,以激活传感器数据消息。此消息大小为76字节,以100hz发送。再次成功,更多的数据开始出现在读取中。然而,我并没有在100hz下得到它,我得到了3968字节的块。如果我降低缓冲区,我会得到三个非常非常快速的1024读取,然后立即读取896。(再次为3968字节)。(请注意,我现在收到两条消息,一条在10hz,大小69,另一条在100hz,大小76,请注意,这两条消息的组合不会平分3968。)

我的问题是,有什么东西在缓冲我的100hz消息,而我并没有在收到它们时得到它们。我想改变这一点,但我不知道我在寻找什么。我不需要100赫兹的信息,我只是不希望它在2赫兹。我会很乐意使用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))

我怀疑是您的串行->usb转换器做了缓冲。由于usb是基于数据包的,它需要做一些缓冲。在速率为10Hz的情况下,可能有足够大的延迟,以便在每条消息之后刷新缓冲区。但在100Hz时,消息来得太远了,以至于它正在通过一些其他逻辑刷新缓冲区。

这有道理吗?