cat: /dev/ttyS0: 输入/输出错误

Mar*_*ter 7 kernel tty serial-port

我无法写入或读取 /dev/ttyS0

# cat /dev/ttyS0                
cat: /dev/ttyS0: Input/output error
Run Code Online (Sandbox Code Playgroud)

设备存在,root 有权限。

# ls -lAhF /dev/ttyS0
crw------- 1 root root 4, 64 Nov 18 12:09 /dev/ttyS0

# setserial -g /dev/ttyS0 
/dev/ttyS0, UART: 16550A, Port: 0x03f8, IRQ: 4

# dmesg | egrep -i 'serial|ttys'
[    1.243271] Serial: 8250/16550 driver, 1 ports, IRQ sharing disabled
[ 2703.151301] ttyS0: LSR safety check engaged!

# cat /proc/devices | grep tty  
  4 tty
  4 ttyS
  5 /dev/tty
Run Code Online (Sandbox Code Playgroud)

我在内核中启用了串行:

# grep SERIAL config
CONFIG_SERIAL_8250=y
CONFIG_SERIAL_8250_NR_UARTS=1
CONFIG_SERIAL_8250_RUNTIME_UARTS=1
CONFIG_SERIAL_CORE=y
Run Code Online (Sandbox Code Playgroud)

我该怎么做才能使串行工作?

t0w*_*7ne 0

串行设备需要大量配置(波特率、停止位、起始位、奇偶校验等)才能正常工作。一般来说,尝试使用 cat/echo 访问它们不会立即起作用,而且也不是一个很好的使用它们的方法。

您使用串行设备的用例是什么?您可以使用类似的应用程序minicom(请参阅:https ://www.youtube.com/watch?v=35gdWj94- lQ)或microcom访问您的设备并提供必要的配置吗?如果没有,请在尝试 echo/cat 之前尝试使用stty从设备读取串行配置或向设备写入串行配置。

如果您有使用 python 的经验,我建议尝试 PySerial 请参阅: https: //pyserial.readthedocs.io/en/latest/pyserial_api.html)库。它将允许您以编程方式设置串行配置,然后在串行端口对象上调用读/写。