刷新UART并不能按预期工作

时间:2016-07-13 11:28:19

标签: linux serial-port beagleboneblack uart

我需要通过10bytes编写一系列值(缓冲区,〜UART)。

此序列需要以BREAK分隔符开头,在我的情况下,我需要将波特率降低到较低的值。

有关我的环境的详细信息:

  • 开发板:BeagleBone Black。
  • Linux内核版本:3.8.13-bone70。
  • 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内核中的一个错误,这可能也属于我的情况吗?

0 个答案:

没有答案