我是使用串行端口的新手,并且我有一根用于 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 的其他端口后,我注意到我实际上看到发送值增加,但它们无法接收。有什么我没有尝试过的可能会阻止他们的接收吗?再次,我假设某些配置有所不同,因为第一个端口具有预期的行为(除了我没有预料到的自动环回),但我没有发现任何应用于任何端口的规则。