我需要通过10bytes
编写一系列值(缓冲区,〜UART
)。
此序列需要以BREAK
分隔符开头,在我的情况下,我需要将波特率降低到较低的值。
有关我的环境的详细信息:
tty
学科使用的串行驱动程序:omap-serial。我最终获得的是这样的:
UARTIOHandler->setBaudRate(B9600);
unsigned char breakChar[] = { 0 };
UARTIOHandler->write(breakChar, 1);
UARTIOHandler->setBaudRate(B19200);
UARTIOHandler->write({1, 2, 3, 4, 5, 6, 7, 8, 9, 10});
write
方法以这种方式实现:
int UARTIOHandler::write(const std::initializer_list<uchar8> &data) {
uchar8 buffer[data.size()];
int counter = 0;
for(auto i : data) {
buffer[counter++] = i;
}
auto output = ::write(this->fd_write, buffer, data.size());
this->flush();
return output;
}
最后是flush()
方法:
void UARTIOHandler::flush() {
tcflush(this->fd_write, TCIOFLUSH);
}
此代码的问题在于刷新并不总是有效,有时BREAK
与数据的第一个字节(在范围内观察)之间的距离为~500us
(其中对于我的应用程序来说很好),有时最多可达~3ms
。
编辑:这是实际行为:
在前五秒内一切正常(BREAK
与消息的其余部分之间的距离不超过~1ms
),然后,在五秒后,有一些帧超过此帧间时间间隔(最多~3ms
)。
我发布的代码总是被执行,因此我无法忘记刷新缓冲区。
为什么会发生这种变化?
我搜索了相关问题并找到this,其中一个解决方法是在tcflush(...)
函数调用前使用延迟。我无法在我的应用程序中使用此方法,因为它会影响功能。
该主题中的另一个comment表明这是Linux内核中的一个错误,这可能也属于我的情况吗?