Python串口模块pySerial - 简短的介绍
2017-3-2
这一篇的教程好简陋,作者有在认真写吗。。。。。。为了方便理解,我在翻译过程中加了点说明。原味教程
打开串口
我们打开一个串口,配置为“9600,8,N,1”(波特率,字节位数,是否有奇偶校验,),没有设置超时:
>>> import serial
>>> ser = serial.Serial('/dev/ttyUSB0') # open serial port
>>> print(ser.name) # check which port was really used
>>> ser.write(b'hello') # write a string
>>> ser.close() # close port
打开一个串口,配置为“19200,8,N,1”, 1s timeout:
>>> with serial.Serial('/dev/ttyS1', 19200, timeout=1) as ser:
... x = ser.read() # read one byte
... s = ser.read(10) # read up to ten bytes (timeout)
... line = ser.readline() # read a '\n' terminated line
打开一个串口,配置为“38400,8,E,1”, non blocking HW handshaking:
>>> ser = serial.Serial('COM3', 38400, timeout=0,
... parity=serial.PARITY_EVEN, rtscts=1)
>>> s = ser.read(100) # read up to one hundred bytes
... # or as much is in the buffer
之后再配置端口
在配置或打开一个串口后,获得该串口的实例:
>>> ser = serial.Serial()
>>> ser.baudrate = 19200
>>> ser.port = 'COM1'
>>> ser
Serial<id=0xa81c10, open=False>(port='COM1', baudrate=19200, bytesize=8, parity='N', stopbits=1, timeout=None, xonxoff=0, rtscts=0)
>>> ser.open()
>>> ser.is_open
True
>>> ser.close()
>>> ser.is_open
False
同样也受到context管理器的支持:
serial.Serial() as ser:
ser.baudrate = 19200
ser.port = 'COM1'
ser.open()
ser.write(b'hello')
Readline
到我们在使用readline()的时候需要小心谨慎。在打开串口时要配置超时时间,否则如果没有新的一行数据输入,他可能会一直等待(原文说的是阻塞,都一样)。readline()依赖于超时时间和EOF引发的中断。如果串口没有正确打开的话,它会抛出一个异常。
可以参考源代码压缩包中或在线的examples文件夹下的例程文件。
注意:Python2.6及其以上版本中,当io模块可用时,EOF不再被readline()支持(也就是说必须依赖超时才能结束readline()的等待)。
EOL
为readline()指定EOL字符或者使用通用的’\n’字符,建议使用io.TextIOWrapper:
import serial
import io
ser = serial.serial_for_url('loop://', timeout=1)
sio = io.TextIOWrapper(io.BufferedRWPair(ser, ser))
sio.write(unicode("hello\n"))
sio.flush() # it is buffering. required to get the data out *now*
hello = sio.readline()
print(hello == unicode("hello\n"))
测试端口
列出端口
python -m serial.tools.list_ports将会打印出当前可用的端口。它也可以加一个正则表达式作为第一个参数,这样的话输出的列表只包含匹配到的端口。
注意:这个枚举不能在所有的操作系统上起作用。他可能没被实现,列出不可用的端口或者缺失了端口的细节描述。(第一个和第三个我还能忍,“列出不可用的端口”这个算BUG么)
访问端口
pySerial包含了一个小型的console(基于名为serial.tools.miniterm的终端程序)。它能使用“python -m serial.tools.miniterm < port_name >”命令启动(使用-h可以列出所有选项)。