Python非常適合寫一些測試的腳本,如快速的串口通信測試等。如果使用VC++ QT開發,可能用時較多,使用python,如果掌握使用方法,可以直接讀寫測試,配合設備或是串口助手,很快驗證與實現。
公司主營業務:成都網站設計、網站建設、外貿網站建設、移動網站開發等業務。幫助企業客戶真正實現互聯網宣傳,提高企業的競爭能力。創新互聯建站是一支青春激揚、勤奮敬業、活力青春激揚、勤奮敬業、活力澎湃、和諧高效的團隊。公司秉承以“開放、自由、嚴謹、自律”為核心的企業文化,感謝他們對我們的高要求,感謝他們從不同領域給我們帶來的挑戰,讓我們激情的團隊有機會用頭腦與智慧不斷的給客戶帶來驚喜。創新互聯建站推出三水免費做網站回饋大家。
Python有沒有現成的串口API直接調用呢?經過實踐驗證,需要安裝一個叫 Pyserial的組件即可。這個可以在github上下載。
在windows 7 64bit 上可以使用嗎?當然可以使用,我安裝的python3.5為64位的。把下載后的文件,其中有一個serial的文件夾,拷貝到python35安裝路徑, C:\Python35\Lib\site-packages\serial
網上可以搜一下windows的安裝包,安裝完也是:C:\Python35\Lib\site-packages\serial ,可以用最新的版本,替換即可。
測試的方法:在python IDE里測試:
import serial
這里如果報錯,是python版本與pyserial版本沒有配合好。如果正常,不返回,即可以導入serial模塊。
ser=serial.Serial("COM5",115200)
這里為COM5,115200的波特率。如果打不開,請檢查安裝環境。
ser.write('hello,serial test'.encode())
17
發送測試(如果返回字節數,說明返回成功),這里需要轉換一個編碼為字節。
以上測試,可以使用現在的設備或是串口助手,如安裝Virtual Serial Port Driver 7.2 虛擬串口軟件,設置一對串口,進行自發自收的測試。
print(ser.readline())
b'abcdefg\r\n'
這里是串口接收,有接收的超時。設備或是串口助手發送一個字符串,以回車換行結束,這里就可以收到打印出來。
也可以用ser.read(),這里只接收一個字符來實現。
上面已經實現了基本的串口操作。
關閉串口為:
ser.close()
如果使用python,一般寫個py文件,就像windows bat 批處理一樣,這是python強大的地方。如果寫一個py腳本呢?其實只要把上面的命令,一條條寫下來,就是一個腳本,測試如下:
import serialser=serial.Serial("COM5",115200,timeout=0.5)for i in range(0,100-1):ser.write('hello\r\n'.encode())print(ser.readline());ser.close()
python提供了豐富的module 對串口的操作同樣有對應的module:serial
環境:python3.5 藍牙模塊:HC-05 波特率38400
首先導入serial模塊(通過pip install serial 安裝)
獲取串口ser 通過serial.Serial(地址,波特率,超時時間)
創建線程監聽串口數據
使用 ser.in_waiting() 獲知數據量 這個函數返回當前串口收到的數據長度
收取數據后進行詳細操作
使用 pyserial 就可以處理串口通信,這個包是跨平臺的。
示例程序在這里:
import?serial
#?創建serial實例
serialport?=?serial.Serial()
serialport.port?=?'COM1'
serialport.baudrate?=?9600
serialport.parity?=?'N'
serialport.bytesize?=?8
serialport.stopbits?=?1
serialport.timeout?=?0.6
try:
serialport.open()
serialport.setDTR(True)
serialport.setRTS(True)
except?Exception,?ex:
print?ex
#?發送數據
serialport.write(raw_data)
#?根據項目要求,可以開一個線程掃描接收數據
python里面使用serial庫來操作串口,serial的使用流程跟平常的類似,也是打開、關閉、讀、寫
一般就是設置端口,波特率。
使用serial.Serial創建實體的時候會去打開串口,之后可以使用is_open開判斷下是否串口是否打開正常。
使用ser.close即可關閉串口
數據的寫使用ser.write接口,如果寫的是十六進制的數據使用bytearray來定義,如 writebuf = bytearray([0x55, 0xaa, 0x00, 0x01, 0x00, 0x00])
讀數據使用ser.read接口,一般會先使用in_waiting來判斷下是否有數據,然后開始讀
下面舉一個例子,說明下我們在實際的使用情況。
一般會單獨創建一個進程來作為數據的接收,然后再配合上標記位或者信號量來處理邏輯
下載 pyserial包
def OpenCom(self,*args): #設置端口和波特率 selComPort =‘com2’ #波特率 selBaudRate =9600 #奇偶校驗 selParity = 'N' try: if(not self.mySerial): self.mySerial = serial.Serial(port=selComPort, baudrate=selBaudRate,bytesize=8,parity=selParity,stopbits=1,timeout=5) else: if(self.mySerial.isOpen()): self.mySerial.close() self.mySerial = serial.Serial(port=selComPort, baudrate=selBaudRate, bytesize=8, parity=selParity, stopbits=1, timeout=5) self.lblInfo['text'] = '打開成功!' except Exception as ex: self.lblInfo['text'] = '打開失敗!'
#使用com口發送modbus協議給終端設備。
def btnEmId_Click(self):
barray = bytearray([0x05, 0x03, 0xA#, 0x54, 0x00, 0x08])
vOldEmId = self.txbOldEmId.get()
vNewEmId = self.txbNewEmId.get()
barray[0] = int(vOldEmId)
barray[5] = int(vNewEmId)
#crc校驗
strInput = utils.crc16_append(barray)
print(barray)
n = self.mySerial.write(barray)
if(n 0):
str = self.mySerial.readall()
self.lblInfo['text'] = 'success!'
# for s in str:
# print (hex(s))
else:
self.lblInfo['text'] = 'error!'
用ser.isOpen()查看返回False,說明ser.close()起作用了啊。用管理員身份打開cmd,再執行腳本試試?
名稱欄目:python串口函數 python控制串口
本文來源:http://m.kartarina.com/article42/hgjehc.html
成都網站建設公司_創新互聯,為您提供用戶體驗、建站公司、營銷型網站建設、外貿網站建設、云服務器、服務器托管
聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯