我有一个传感器,它使用RS422通过串口吐出消息。 (我认为这是正确的术语。)无论如何,我制作了我的线束,并将它连接到我的rs422到usb转换器和tada,我得到了超级终端的数据。好东西。
现在传感器具有奇数波特率,1500kbps。我在Windows中这样做,所以实际上设置波特率并不困难。最初,在通电时,传感器每10hz发出一个69字节的消息。我看到这条消息,读取了正确的字节,并且消息非常准确(它包含一个时间戳,等待它,每条消息增加0.1秒!)最重要的是,我在其边界上得到消息,换句话说每次阅读都是一条新消息。
到目前为止,事情进展顺利,所以我采取了下一步,我通过串口发送了一个写命令来激活传感器数据信息。此消息大76字节,并以100hz发送。再次成功,更多数据开始出现在读取中。但是,我没有得到100hz,我得到3968字节的块。如果我降低缓冲区,我会得到三个非常非常快速的1024读取,然后立即读取896.(再次3968字节)。 (请注意,我现在收到两条消息,一个是10赫兹,大小为69,另一个是100小时,大小为76,请注意,这两个消息的组合不会均匀地划分3968。)
我的问题是,有些东西正在缓冲我的100hz消息,而我没有得到它们,因为它们被收到了。我想改变它,但我不知道我在寻找什么。我不需要在其边界上使用100hz消息,我只是不希望它在2 Hz。我很高兴30hz甚至20hz。
下面我包含了我的串口设置代码:
Port Open
serial_port_ = CreateFile(L"COM6", GENERIC_READ | GENERIC_WRITE, 0, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
CommState和Timeouts
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))
答案 0 :(得分:3)
我怀疑你的serial-> usb转换器可以进行缓冲。由于usb是基于数据包的,因此需要进行一些缓冲。在10Hz的速率下,可能有足够大的延迟,在每条消息之后刷新缓冲区。但是在100Hz时,消息到目前为止,它正在通过其他逻辑刷新缓冲区。
这有意义吗?