筆者相信有很多在玩UART的朋友一定也會遇到跟筆者一樣的問題,希望可以同時去存取兩個UART。 但在網路上找到的答案都 ....
先建立一個通用的模板後,名稱為readCom的python file,使用Popen的形式在同一個檔案中做輪循式的呼叫及存取 ...
:readCOM.py
ser1 = serial.Serial(port="COM1",baudrate=9600)
ser2 = serial.Serial(port="COM2",baudrate=9600)
ser1.write('command for reading out device 1')
output1 = ser1.readline()
ser2.write('command for reading out device 2')
# now you have to wait at least 100ms for device 2 to respond
output2 = ser2.readline()
引用自Python Pyserial read data form multiple serial ports at same time - Stackoverflow
但筆者想要的是可以在一個檔案中就做到兩個UART 的存取,瘋狂尋找了各種方案後筆者生出了一個最佳解法,如下:
方法一:
使用pyserial 直接開兩個UART Ports, 將Transmitter/ Receiver 切成兩個class, 分別跑在兩個不同的thread 內 缺點: 就是跑一跑後很容易斷掉,主要原因是I/O阻塞
方法二:
使用pyserial 及aioserial , 各帶入一組UART, 後面則跟方法一樣。 aioserial 其實也是使用其中一個pyserial的版本後再做封裝的一個模組,使用方式基本上是跟pyserial 九成相似的
import serial
import aioserial
p1 = serial.Serial(port=eval(uart1[0]),
baudrate=fCOpt[1],
bytesize=fCOpt[2],
parity=eval(fCOpt[3]),
stopbits=fCOpt[4],
timeout=fCOpt[5],
xonxoff=fCOpt[6][0],
rtscts=fCOpt[6][1],
dsrdtr=fCOpt[6][2])
p2 = aioserial.Serial(port=eval(sGOpt[0]),
baudrate=sGOpt[1],
bytesize=sGOpt[2],
parity=eval(sGOpt[3]),
stopbits=sGOpt[4],
timeout=sGOpt[5],
xonxoff=sGOpt[6][0],
rtscts=sGOpt[6][1],
dsrdtr=sGOpt[6][2])
結論:
這樣就可以簡單達成在同一個檔案內同時開啟兩個UART而不會遇到I/O阻塞的狀況,但p1/ p2的存取還是要使用在不同的thread 中才行。 相關的細節後續會介紹