socat使用rawer选项时无法读取串口数据的问题咨询
问题根因
你遇到的是4.9版本aarch64内核串口驱动与socat rawer模式参数重置逻辑的兼容性问题,核心问题出在你贴出的两组stty参数差异上:
- rawer模式下串口波特率被重置为0,无法正常收发数据
- rawer模式下
-cread标志被置位,直接关闭了串口的接收功能
具体逻辑说明
- socat的
raw选项只会基于当前终端配置做最小限度的调整,保留用户显式设置的波特率、CREAD接收位等核心串口参数,所以运行正常。 - socat的
rawer是更激进的绝对裸模式,会先把所有终端参数重置为POSIX定义的默认裸状态,再叠加用户传入的参数。你的4.9内核ttyTHS串口(通常是英伟达Jetson系列的TEGRA串口)驱动对该重置操作的处理存在缺陷:- 用户提前传入的
b9600波特率参数被重置操作覆盖,最终被设置为0 - 重置操作会默认清除
CREAD接收位,而该版本串口驱动不会在设置波特率时自动恢复该位,直接导致串口不接收任何数据
- 用户提前传入的
x86_64 5.4内核环境下正常的原因是:高版本内核串口驱动对tcsetattr全量重置操作的处理逻辑更完善,会保留用户显式设置的波特率优先级,且USB转串口驱动默认会强制维持CREAD位为开启状态,不会被重置操作清除。
解决办法
两种方案可选,都可以完全复现rawer的裸终端效果,同时避开兼容性问题:
- 方案1:手动补全rawer比raw多关闭的终端标志,不直接使用rawer选项:
socat /dev/ttyTHS1,b9600,raw,cread,iexten=0,echo=0,echoe=0,echok=0,echoctl=0,echoke=0 - - 方案2:调整参数顺序,用后置的配置覆盖rawer的重置结果:
socat /dev/ttyTHS1,rawer,b9600,cread -
内容的提问来源于stack exchange,提问作者shay
相关产品推荐
相关产品推荐

