5.20 與串行端口的數據通信

2018-02-24 15:26 更新

問題

你想通過串行端口讀寫數據,典型場景就是和一些硬件設備打交道(比如一個機器人或傳感器)。

解決方案

盡管你可以通過使用Python內置的I/O模塊來完成這個任務,但對于串行通信最好的選擇是使用pySerial包 [http://pyserial.sourceforge.net/] 。這個包的使用非常簡單,先安裝pySerial,使用類似下面這樣的代碼就能很容易的打開一個串行端口:

import serial
ser = serial.Serial('/dev/tty.usbmodem641', # Device name varies
                    baudrate=9600,
                    bytesize=8,
                    parity='N',
                    stopbits=1)

設備名對于不同的設備和操作系統(tǒng)是不一樣的。比如,在Windows系統(tǒng)上,你可以使用0, 1等表示的一個設備來打開通信端口”COM0”和”COM1”。一旦端口打開,那就可以使用 read(),readline()write() 函數讀寫數據了。例如:

ser.write(b'G1 X50 Y50\r\n')
resp = ser.readline()

大多數情況下,簡單的串口通信從此變得十分簡單。

討論

盡管表面上看起來很簡單,其實串口通信有時候也是挺麻煩的。推薦你使用第三方包如 pySerial 的一個原因是它提供了對高級特性的支持(比如超時,控制流,緩沖區(qū)刷新,握手協(xié)議等等)。舉個例子,如果你想啟用 RTS-CTS 握手協(xié)議,你只需要給 Serial() 傳遞一個 rtscts=True 的參數即可。其官方文檔非常完善,因此我在這里極力推薦這個包。

時刻記住所有涉及到串口的I/O都是二進制模式的。因此,確保你的代碼使用的是字節(jié)而不是文本(或有時候執(zhí)行文本的編碼/解碼操作)。另外當你需要創(chuàng)建二進制編碼的指令或數據包的時候,struct 模塊也是非常有用的。

以上內容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號