串行100 Hz数据

时间:2012-02-16 16:22:33

标签: c++ windows serial-port

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

1 个答案:

答案 0 :(得分:3)

我怀疑你的serial-> usb转换器可以进行缓冲。由于usb是基于数据包的,因此需要进行一些缓冲。在10Hz的速率下,可能有足够大的延迟,在每条消息之后刷新缓冲区。但是在100Hz时,消息到目前为止,它正在通过其他逻辑刷新缓冲区。

这有意义吗?