1. 程式人生 > >不同python版本在使用pyserial的一些使用區別

不同python版本在使用pyserial的一些使用區別

筆者在用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
具體原理筆者也不是很清楚,望前輩賜教