【问题标题】:Why characters received in serial connection only after pressing enter?为什么只有在按回车后才能在串行连接中收到字符?
【发布时间】:2015-01-28 15:41:19
【问题描述】:

我有一个简单的 PC 到板使用串行连接(9600,无奇偶校验,8 位,无硬件流) 我在 PC 中打开了简单的终端 *with teraterm) 并在 teraterm 和板上输入密钥,我只是这样做

 cat /dev/ttyO5

我在范围内看到按下的字符,但我在板控制台中看到字符,只有在 teraterm 中按“输入”后(好像它们存储在 Linux 驱动程序中的某些 FIFO 中,只有输入触发)

  1. 为什么Linux驱动只有按回车键才能接收到字符?
  2. 有什么方法可以在不按回车键的情况下接收字符吗? (我们使用一些 ascii 协议,因此将其作为虚拟发送是没有意义的)

感谢您的建议, 然

【问题讨论】:

  • 设备真的是tty05,还是应该是ttyO5
  • 关于 tty05,我已经修正了问题中的错字

标签: linux serial-port uart


【解决方案1】:

但我在板控制台中看到字符,只有在 teraterm 中按“输入”后才能看到

您描述的行为是规范阅读(又名阅读行)的特征。
您似乎想要的行为称为非规范读取(也称为原始读取或二进制读取)。

  1. 为什么Linux驱动只有按回车键才能接收到字符?

不,Linux 串行端口驱动程序正在接收网络上出现的每个字符。
每个字符都被缓冲(通常在支持 DMA 的内存中),然后转发到 行规则处理程序,该处理程序也缓冲接收到的数据。
用户态程序的规范 read() 系统调用被阻止,直到行规则处理程序检测到行终止字符。

  1. 有什么方法可以在不按回车键的情况下接收字符吗?

是的,在发出cat 命令之前,将串口配置为非规范模式:

stty -F /dev/tty05 raw

或更可能是正确的设备节点

stty -F /dev/ttyO5 raw

或者在板上的用户空间程序中使用termios接口将串口配置为非规范模式。示例代码为here

有关如何正确编程串行端口的文档是 Serial Programming Guide for POSIX Operating SystemsSetting Terminal Modes Properly

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-05-02
    • 1970-01-01
    • 2021-01-28
    • 1970-01-01
    • 2020-03-14
    • 1970-01-01
    相关资源
    最近更新 更多