5.20 與串行端口的數(shù)據(jù)通信

2018-02-24 15:26 更新

問(wèn)題

你想通過(guò)串行端口讀寫數(shù)據(jù),典型場(chǎng)景就是和一些硬件設(shè)備打交道(比如一個(gè)機(jī)器人或傳感器)。

解決方案

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

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

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

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

大多數(shù)情況下,簡(jiǎn)單的串口通信從此變得十分簡(jiǎn)單。

討論

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

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

以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)