不同python版本在使用pyserial的一些使用区别

xiaoxiao2021-02-28  59

笔者在用pyserial打开虚拟串口时出现了一些问题,最后发现是python版本的问题,现将几种情况总结如下 1.实际串口

#查询串口号 geek@geek-Lenovo-G40-70:~/Documents/RaspberryPi$ dmesg | grep ttyUSB* [ 1642.241139] usb 2-2: ch341-uart converter now attached to ttyUSB0

如果用的是python2.7.9的话要这样写:

[python2.7.9] #!/usr/bin/python import os,serial #打开串口 ser=serial.Serial("/dev/ttyUSB0") #写入 ser.write("nani?")

运行正常不报错。

如果用的是python3.5的话要这样写:

[python3.5] #!/usr/bin/python3 import os,serial #打开串口 ser=serial.Serial("/dev/ttyUSB0") #写入.注意要加encode(),否则报错 ser.write("nani?".encode())

运行正常不报错。

如果不加encode()的话会报错如下:

Traceback (most recent call last): File "testSingleCom.py", line 8, in <module> ser.write("nani?") File "/home/geek/.local/lib/python3.5/site-packages/serial/serialposix.py", line 529, in write d = to_bytes(data) File "/home/geek/.local/lib/python3.5/site-packages/serial/serialutil.py", line 63, in to_bytes raise TypeError('unicode strings are not supported, please encode to bytes: {!r}'.format(seq)) TypeError: unicode strings are not supported, please encode to bytes: 'nani?'

2.虚拟串口 如果是python2.7.9的话要这样写:

[python] import os, pty, serial #创建一个虚拟串口 master, slave = pty.openpty() s_name = os.ttyname(slave) #连接该虚拟串口 ser = serial.Serial(s_name, rtscts=True,dsrdtr=True) #写入 ser.write("nani?")

运行正常不报错。

如果写成ser = serial.Serial(s_name),则会报错

Traceback (most recent call last): File "testSingleCom.py", line 4, in <module> ser = serial.Serial(s_name ) File "/usr/lib/python2.7/dist-packages/serial/serialutil.py", line 180, in __init__ self.open() File "/usr/lib/python2.7/dist-packages/serial/serialposix.py", line 311, in open self._update_dtr_state() File "/usr/lib/python2.7/dist-packages/serial/serialposix.py", line 605, in _update_dtr_state fcntl.ioctl(self.fd, TIOCMBIS, TIOCM_DTR_str) IOError: [Errno 22] Invalid argument

如果是python3.5的话要这样写:

import os, pty, serial #创建一个虚拟串口 master, slave = pty.openpty() s_name = os.ttyname(slave) #连接该虚拟串口 ser = serial.Serial(s_name) #或者这样也行 #ser = serial.Serial(s_name, rtscts=True,dsrdtr=True) #写入 ser.write("nani?".encode())

运行正常不报错。

总结: 1.python3.5的write函数要encode,pyhon2.7不用 2.python2.7如果要连接虚拟串口,要加rtscts=True,dsrdtr=True 具体原理笔者也不是很清楚,望前辈赐教

转载请注明原文地址: https://www.6miu.com/read-82642.html

最新回复(0)