【问题标题】:Does we have something to check whether data is available in UART port in embedded linux..?我们是否需要检查嵌入式 linux 的 UART 端口中是否有数据可用..?
【发布时间】:2016-01-07 04:13:16
【问题描述】:

是否可以从用户空间应用程序检查数据是否可用于在 UART 端口中读取。代码是在嵌入式 Linux 平台上用 C 语言编写的。

例如:

while(isDataAvalable(fileDescriptor)) {
    read(fileDescriptor, buffer, 10)
}

我正在寻找linux提供的一些函数,如果有数据要从端口读取,则返回true,如果没有数据则返回false。但函数本身不应从硬件缓冲区中删除数据,直到使用“read”方法读取数据。

如果linux中没有这样的内置函数,有没有办法使用linux系统调用创建一个包装函数来实现上述功能,供用户空间应用程序使用..?

【问题讨论】:

  • 您是否尝试过使用select
  • 您对 I/O 和串口工作原理的理解是有缺陷的。设备驱动程序总是尽快读取 UART 端口,以防止接收 溢出错误。数据存储在系统缓冲区中。 (实际上可能有一系列缓冲区,例如用于线路规程。)用户空间 read() 总是从缓冲区中检索数据,而不是直接从硬件中检索数据。见cmrr.umn.edu/~strupp/serial.html#5_1_3
  • 我同意您的观点,即用户空间 read 调用从缓冲区中检索数据。我需要一个函数来检查该缓冲区中是否有任何数据可用。 read() 总是从缓冲区取数据,我不想取数据,只需要看看缓冲区有没有数据。

标签: linux serial-port embedded-linux uart


【解决方案1】:

如果您可以使用 Qt 框架,那么当数据可用时,QSerialPort 会发出信号 QIODevice::readyRead()。 (您可以在没有 gui 的情况下为您的平台部署 Qt 以最小化占用空间)

【讨论】:

    【解决方案2】:

    这可以通过在 linux 中使用 poll() 来实现。

    poll() 应该能够判断是否有数据要读取,在这种情况下非常有用。它监视一组文件描述符并等待其中一个文件描述符准备好执行 I/O。

    poll() 检查是否发生了任何期望的事件(如数据到达)。如果请求的事件已经发生,它将通过 POLLIN 提醒在特定文件描述符中事件已经发生(有数据要读取)。

    【讨论】:

      猜你喜欢
      • 2011-02-21
      • 2019-03-13
      • 1970-01-01
      • 2012-02-16
      • 1970-01-01
      • 1970-01-01
      • 2014-12-16
      • 1970-01-01
      • 2016-11-02
      相关资源
      最近更新 更多