纯手工打造UART间的资料清洗工具II - 在一个档案中同时存取两个UART的方法

笔者相信有很多在玩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 中才行。 相关的细节後续会介绍


<<:  [Day14] 传值或传址(上)

>>:  Dungeon Mizarka 017

Day14 - Shioaji X Backtesting -回测框架搭配API历史资料

Hi,介绍了api的各种函数後,相信读者一定很好奇,有了这些资料之後要怎麽回测啊? 毕竟在开始实单做...

[Day 21] 使用 Coroutine SendChannel 处理非同步工作

系统除了即时接受及回应使用者请求,也需要执行各种非同步工作,例如背景排程及寄送讯息通知…等。在实作上...

《赖田捕手:追加篇》第 32 天:快速回覆 QuickReply 介绍

第 32 天:快速回覆 QuickReply 介绍 对其他人来说也许没什麽,但对他而言这可真是不容易...

Day17-Webhook 实作(六)LINEBot 之 MessageBuilder(IV)

大家好~ 今天来实作如何用 Flex Message 回覆讯息吧! 那麽关於 Flex Messag...

Day 25 - redux-saga 文件范例

Q_Q 没学完啦 Redux-saga 范例 import { createStore, appl...