iT邦幫忙

2021 iThome 鐵人賽

DAY 14
0
Software Development

Python GUI 專案設計模式及好用的開發技巧系列 第 15

純手工打造UART間的資料清洗工具II - 在一個檔案中同時存取兩個UART的方法

  • 分享至 

  • xImage
  •  

筆者相信有很多在玩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 中才行。 相關的細節後續會介紹


上一篇
好用的Decorator 如何在class中使用?
下一篇
不要再用print來debug 了 ...
系列文
Python GUI 專案設計模式及好用的開發技巧31
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言