不同python版本在使用pyserial的一些使用區別
阿新 • • 發佈:2019-02-17
筆者在用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
具體原理筆者也不是很清楚,望前輩賜教