我有一个传感器,使用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。
以下是我的串口设置代码:
现在该传感器具有奇怪的波特率,为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))