#PYTHON3 #PySide2 #GIVE AWAY #TUTORIAL

Give Away #1: pySerial 大補貼

四條線交織成的良好溝通

DekBan
Bucketing

--

Photo by Mika Baumeister on Unsplash

當我們在跟一些開發版溝通時,會面臨系統尚未開發完整的情況,或是根本就沒有Display的輸出界面,畢竟圖形化介面相當消耗資源也需要很多driver支援。 這時候最常見的就是古早味的黑白Console介面,而它的output介面想當然爾也是非常古老的介面 — RS232、Serial、Comport ,不管你怎麼稱呼他就是個4條線組合成的經典黑白畫面。

Intro

Hardware

4條線,到底是哪4條呢?

  • Tx : 輸出訊號線,另一端的人使用Rx接收
  • Rx: 輸入接收訊號源,接受另一端的Tx輸出
  • Power: 電電電 電死尼,通常有3.3V 及 5V 兩種,有時不需要接
  • Ground: 接地線

非常淺顯易懂,是吧?

Protocol

Serial 通常稱為通用連接埠,主要的通訊協定就是RS-232,是非常廣泛使用於外部設備連接,USB呢就是其延伸進化而來的,所以USB都可以拿來當成RS-232使用。 (詳細請詳閱 : Wiki )

About pySerial

pySerial是python在控制serial port中最多人使用的一個open source,linux中的miniterm 就是由這個模組撰寫而成(雖然很難用)。

如果,使用原生Qt開發就會發現,我們可以使用QSerialPort這個套件直接實作RS232的溝通,超級方便。 Linux中的圖形化軟體CuteCom就是Qt4撰寫成的,可惜的是PySide2並沒有將這個library給實作進來。
換言之,必須使用python來重新實作這個API才能透過RS232做溝通,而pySerial就是大神實作造福大眾的open source。

Install

pip3 install pySerial

Serial Attribute

了解pySerial後,我們要來介紹一下serial port在設定、初始化時會遇到的幾個參數。 基本上,不管你用哪種語言、哪個API,這些屬性參數都是必要的

看得眼花撩亂呢…不怕!雖然有很多選項,但在使用上很多值都是默認的。

基本上,我們需要在意的只有Port 還有 Baudrate,其中Baudrate常用的就是慢速的9600以及高速的115200,尤以115200最為常用。

Port 即是系統所認到的實體Port名稱,Win中可以在硬體管理員下看到,可能是COM1、COM3之類的,Linux系統則會被掛載到/dev之下,名稱是 ttySx 或是 ttyUSBx等等。

DekBanSerial!

說了一堆廢話,大家其實只想看give away對吧!

pySeiral這個套件雖然好用,但懶人如我還是覺得太manual了一點,因此開發了 DekBanSerial這個module,將pySerial再次包裝成我喜歡的樣子( ≧Д≦)

Usage

使用上非常簡單,我們直接舉例子吧!

  • 列出可用的serial 設備
from communications.db_serial import Serialfor port in Serial.list_ports():
print(port.name)
  • 宣告並使用,就兩行!
qserial = Serial("/dev/ttyS0", 115200)
qserail.open()
  • 寫資料
# write data
qserial.write("This is serail data")
  • 讀取資料

RS232的資料讀取有兩種模式,我稱其為 主動式 以及 被動式 的讀取。

寫過Qt 的開發者會知道QSerialPort中有個signal稱為 readyRead(),其會在接收到訊息時被觸發,使用者則撰寫一個handler的Slot與其串接,並使用 readAllreadLineread 等方式讀取。 這就是 被動式讀取。
主動式讀取呢,則是我們知道buffer中有東西時,主動去下 read方法去讀資料。

PySerial中是沒有 readyRead的訊號槽的,不過別擔心!都幫各位實作好啦!

主動式讀取

timeout = 10
data = qserail.read()
# 如果要讀到某個關鍵字才停止,可以用
data = qserial.read_until('EOF', timeout=100)
# 如果要執行命令 並收取 單行 回應,像是下command一樣的話 你可以...
data = qserial.query('uname -a', timeout=5);
# 如果下了指令,要一直讀、讀到某個結尾才結束的話
data = qserial.query_until('ifconfig', 'enp2s0',timeout=10);
# 還有! 想要讀取多個 停止關鍵字的話也可以!
key_words = ['enp2s0', 'enp1s0']
qserail.write('ifconfig')
data = read_untils(key_words)

被動式讀取

被動式讀取,我們要在宣告Serial時,給予其handler的function,用於接收read回來的資料。

class QSerial(QtCore.QObject):
ready_read = QtCore.Signal(str)
signal = QSerail()@QtCore.Slot()
def handler(data):
print(data)
qserail = Serial('/dev/ttyS1', '115200',
read_handler=signal.ready_read.emit)
signal.ready_read.connect(handler)

這樣就結束啦!是不是很簡單呢?

🎊 Give Away

DekBan Comport Demo

本篇將提供簡易、類似cutecom的小程式,通常DekBan我都拿來做debug使用,各位也可以試試看唷!
PS. SerialPort 參數設定介面是QTreeWidget製作而成的模組唷! 可以直接import到UI中

Source Code

完整代碼請看 : DekBanComport

結論

雖然serial port在現在大web時代非常少人用了,不過半導體、系統廠面對開發板、自動化生產還是很常使用到RS232這種溝通介面,希望這次的禮包有幫助到大家囉!

我是夜海中的宅男DekBan,我們下次見,see ya next night.

--

--

DekBan
Bucketing

เด็กบ้าน | 🌃夜裡溜搭的宅男,漂泊於月色鋪成的海