在FreeBSD中,必须设置O_NONBLOCK标志才能正确使用串行端口。而在Linux中,该标志不需要设置即可正常工作。因此,为了让代码在两个操作系统上都正常工作,应该使用以下方法:
import os
import serial
if os.name == 'posix':
ser = serial.Serial('/dev/ttyUSB0', baudrate=9600, timeout=1, rtscts=False, dsrdtr=True)
ser.setDTR(False)
ser.setRTS(False)
if hasattr(termios, 'CBAUD'):
try:
fd = ser.fileno()
attr = termios.tcgetattr(fd)
termios.tcsetattr(fd, termios.TCSAFLUSH, attr)
except termios.error:
pass
# Only need to set O_NONBLOCK on FreeBSD
if platform.system() == 'FreeBSD':
fcntl.fcntl(ser.fd, fcntl.F_SETFL, os.O_NONBLOCK)
else:
ser = serial.Serial('COM1', baudrate=9600, timeout=1, rtscts=False, dsrdtr=True)
该示例代码中,我们在UNIX系统上检查了操作系统的名称(通过import os)。然后,根据检测到的操作系统,设置了不同的串行端口设置。对于FreeBSD系统,我们设置了O_NONBLOCK标志,以便能够正确使用串行端口。对于Linux系统,我们不需要设置该标志,因为默认情况下就可以正常使用串行端口。最后,我们从相应的串行端口中读取数据,并执行相应的操作。