为啥只有在按回车后才能在串行连接中收到字符?
Posted
技术标签:
【中文标题】为啥只有在按回车后才能在串行连接中收到字符?【英文标题】: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 中,只有输入触发)
-
为什么Linux驱动只有按回车键才能接收到字符?
有什么方法可以在不按回车键的情况下接收字符吗? (我们使用一些 ascii 协议,因此将其作为虚拟发送是没有意义的)
感谢您的建议, 然
【问题讨论】:
设备真的是tty05
,还是应该是ttyO5
?
关于 tty05,我已经修正了问题中的错字
【参考方案1】:
但我在板控制台中看到字符,只有在 teraterm 中按“输入”后才能看到
您描述的行为是规范阅读(又名阅读行)的特征。 您似乎想要的行为称为非规范读取(也称为原始读取或二进制读取)。
为什么Linux驱动只有按回车键才能接收到字符?
不,Linux 串行端口驱动程序正在接收网络上出现的每个字符。 每个字符都被缓冲(通常在支持 DMA 的内存中),然后转发到 行规则处理程序,该处理程序也缓冲接收到的数据。 用户态程序的规范 read() 系统调用被阻止,直到行规则处理程序检测到行终止字符。
有什么方法可以在不按回车键的情况下接收字符吗?
是的,在发出cat
命令之前,将串口配置为非规范模式:
stty -F /dev/tty05 raw
或更可能是正确的设备节点
stty -F /dev/ttyO5 raw
或者在板上的用户空间程序中使用termios接口将串口配置为非规范模式。示例代码为here。
有关如何正确编程串行端口的文档是 Serial Programming Guide for POSIX Operating Systems 和 Setting Terminal Modes Properly。
【讨论】:
以上是关于为啥只有在按回车后才能在串行连接中收到字符?的主要内容,如果未能解决你的问题,请参考以下文章
为啥打开arduino串口监视器后软串口才能向其他元件收发数据