c++ - 来自串行的 100 Hz 数据

标签 c++ windows serial-port

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

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

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

我的问题是,某处有什么东西在缓冲我的 100hz 消息,而我在接收它们时没有收到它们。我想改变它,但我不知道我在寻找什么。我不需要边界上的 100hz 消息,我只是不希望它处于 2 Hz。我对 30hz 甚至 20hz 都很满意。


下面是我的串口设置代码:

端口打开

 serial_port_ = CreateFile(L"COM6", GENERIC_READ | GENERIC_WRITE, 0, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);

CommState 和超时

 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 时,消息到达的距离太远,它正在通过其他一些逻辑刷新缓冲区。

这有意义吗?

关于c++ - 来自串行的 100 Hz 数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9314956/

相关文章:

c++ - 二进制 * 运算符未找到

c++ - 获取指向非静态成员函数的函数指针

windows - 使用免费工具开发基于 Windows 的轻量级(无运行时)GUI 应用程序

c++ - 除非第三方程序打开端口,否则无法读取串行数据

python - 从串口发送数据

c# - 如何解锁COM口

c++ - 使用 gcc、g++ 和 gdb 在 Window 7 上设置 VSCode 以进行 C/C++ 调试

android - 在 Android 的第二个项目中添加 .so 库

python - ctypes:printf 返回长度,它是 int 而不是字符串

c++ - 直接包装到 C++ 类中的函数