linux - 为什么只有在按回车后才能在串行连接中接收到字符?

标签 linux serial-port uart

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

 cat /dev/ttyO5

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

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

多谢指教 冉

最佳答案

but I see the characters in the board console, only after pressing "enter" in teraterm

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

  1. why are the characters received in Linux driver only when pressing enter key ?

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

  1. Is there some way to receive the characters without pressing the enter key ?

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

stty -F /dev/tty05 raw

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

stty -F /dev/ttyO5 raw

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

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

关于linux - 为什么只有在按回车后才能在串行连接中接收到字符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42196181/

相关文章:

java - 如何删除 "Context.USB_SERVICE"处的错误(Eclipse -> Android)

Linux 去除串口多余字符

c++ - 在包含 500,000 个文件的目录中快速访问文件

linux - Oprofile调用图: origin of syscalls

c++ - 在非阻塞文件描述符上等待长时间运行的 ioctl

java - 使用 Java 自动检测哪个 Com 端口连接到 USB GSM 调制解调器

c - 循环缓冲区突发丢失最后一个字节

c++ - 使用事件过滤器(嵌入式 linux)区分 2 个键盘击键

c - 向轮询监听套接字的 epoll 实例以外的 epoll 实例添加新套接字