为什么我的串口在没有环回线的情况下有响应?

为什么我的串口在没有环回线的情况下有响应?

我是使用串行端口的新手,并且我有一根用于 Centos 7 计算机上串行的环回电缆。我在 python 中有一些东西可以测试端口,但我发现即使没有附加环回,程序也会返回预期值。 Linux 中的端口是否已经存在某种软件环回?

如果这是有用的信息,我正在使用如下所示的 pySerial (我必须从内存中输入其中一些信息,因此如果出现错误,我深表歉意,但我的问题不是关于代码,而是关于这些端口实际如何工作)

import serial

BAUD_RATE = 9600

def main():
    tx = b"A"

    COM_PORT='/dev/ttyS0'
    ser = serial.Serial(COM_PORT, BAUD_RATE, timeout=1, parity=serial.PARITY_NONE, rtscts=False, dsrdtr=False)
    ser.setDTR(False)
    ser.flush()
    print("Port " + COM_PORT)
    for y in range (0,10):
        print("Sent: " + str(tx))
        ser.write(tx)
        rx = ser.read(1)
        print("Received: " + str(rx))
    if(len(rx) > 0):
        print(COM_PORT + " - " + str(rx))
    ser.close()

if __name__ == "__main__":
    main()

当我使用如下所示的更短且简单的串行测试时,也会发生同样的事情

1号航站楼

cat /dev/ttyS0

第2航站楼

echo "test" > /dev/ttyS0

就像我说的,我从两个测试中得到了预期的输出,但无论电缆是否连接,我都会得到相同的输出。


测试输出

  • 检查接口是否确实是字符设备

    ls -l /dev/ttyS0

输出:crw-rw----, 1 user group 4, Date /dev/ttyS0

  • 检查没有其他进程打开它

    sudo lsof /dev/ttyS0

输出:错误我必须稍后复制。如果我在没有 sudo 的情况下运行,我会返回一个空行

  • 检查 UART

    sudo setserial -v /dev/ttyS0

输出:/dev/ttyS0, UART: 16550A, Port: 0x03f8, IRQ: 4

  • 当施加信号时,CTS 和类似引脚会发生变化

    sudo statserial /dev/ttyS0

输出:/dev/ttyS0, UART: 16550A, Port: 0x03f8, IRQ: 4

无论连接或未连接电缆,对端口运行 echo 命令时,此输出都不会发生变化。

  • 检查发送和接收号码是否发生变化

    sudo cat /proc/tty/driver/serial

输出:

0: uart:16550A port:000003F8 irq:4 tx:8335 rx:8301
1: uart:16550A port:000002F8 irq:3 tx:0    rx:0
//There's a few more serial ports, but they all have 0 tx and rx, and on port 03F8, the tx and tx increase when I send to the serial port ttyS0

另一个可能相关的问题/症状是,在运行 python 脚本后,我无法再 cat /dev/ttys0

因此,我可以在运行 python 脚本之前随时对该文件进行 cat 操作,次数不限,但是在运行该 Python 后,我无法立即对该文件进行 cat 操作,它会立即返回,但什么也没有。我检查过,文件尚未打开。我不确定为什么会发生这种情况。


更新

在测试了发送和接收时显示 0 的其他端口后,我注意到我实际上看到发送值增加,但它们无法接收。有什么我没有尝试过的可能会阻止他们的接收吗?再次,我假设某些配置有所不同,因为第一个端口具有预期的行为(除了我没有预料到的自动环回),但我没有发现任何应用于任何端口的规则。

相关内容