【发布时间】:2012-02-16 16:22:32
【问题描述】:
我有一个传感器,它使用 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 感到满意。
下面是我的串行端口设置代码:
端口开放
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))
【问题讨论】:
标签: c++ windows serial-port