笔者在用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 具体原理笔者也不是很清楚,望前辈赐教
