我有一个传感器,它使用 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/