Python串口模块pySerial - 简短的介绍

时间:2022-07-01 17:46:22

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可以列出所有选项)。