Python监控串口(RS-232)握手信号

11 投票
1 回答
6448 浏览
提问于 2025-04-16 17:05

我需要监控串口信号的状态(比如RI、DSR、CD、CTS)。

用'串口'库来循环检查和轮询(比如使用getRI函数)会占用太多CPU资源,而且响应时间也不太理想。

有没有什么用Python的解决方案呢?

1 个回答

14

在Linux系统中,可以通过一种叫做阻塞系统调用TIOCMIWAIT的方法,来监控RS-232端口的信号引脚状态变化。这种方法是基于中断通知的,也就是说,当信号引脚的状态发生变化时,系统会自动通知你,而不是你一直去检查状态。

from serial import Serial
from fcntl import  ioctl
from termios import (
    TIOCMIWAIT,
    TIOCM_RNG,
    TIOCM_DSR,
    TIOCM_CD,
    TIOCM_CTS
)

ser = Serial('/dev/ttyUSB0')

wait_signals = (TIOCM_RNG |
                TIOCM_DSR |
                TIOCM_CD  |
                TIOCM_CTS)

if __name__ == '__main__':
    while True:
        ioctl(ser.fd, TIOCMIWAIT, wait_signals)
        print 'RI=%-5s - DSR=%-5s - CD=%-5s - CTS=%-5s' % (
            ser.getRI(),
            ser.getDSR(),
            ser.getCD(),
            ser.getCTS(),
        )

撰写回答