python提供了豐富的module 對串口的操作同樣有對應(yīng)的module:serial

創(chuàng)新互聯(lián)公司基于成都重慶香港及美國等地區(qū)分布式IDC機房數(shù)據(jù)中心構(gòu)建的電信大帶寬,聯(lián)通大帶寬,移動大帶寬,多線BGP大帶寬租用,是為眾多客戶提供專業(yè)服務(wù)器托管報價,主機托管價格性價比高,為金融證券行業(yè)服務(wù)器機柜租賃,ai人工智能服務(wù)器托管提供bgp線路100M獨享,G口帶寬及機柜租用的專業(yè)成都idc公司。
環(huán)境:python3.5 藍(lán)牙模塊:HC-05 波特率38400
首先導(dǎo)入serial模塊(通過pip install serial 安裝)
獲取串口ser 通過serial.Serial(地址,波特率,超時時間)
創(chuàng)建線程監(jiān)聽串口數(shù)據(jù)
使用 ser.in_waiting() 獲知數(shù)據(jù)量 這個函數(shù)返回當(dāng)前串口收到的數(shù)據(jù)長度
收取數(shù)據(jù)后進行詳細(xì)操作
1、安裝串口庫
2、采用默認(rèn)通信參數(shù)
import serial
t = serial.Serial('com1',9600)
n = t.write('you are my world')print t.portstrprint n
str = t.read(n)print str
3、可以自己設(shè)置參數(shù)
import timeimport serialser = serial.Serial( #下面這些參數(shù)根據(jù)情況修改 port='COM1', baudrate=9600, parity=serial.PARITY_ODD, stopbits=serial.STOPBITS_TWO, bytesize=serial.SEVENBITS)data = ''while ser.inWaiting() 0: data += ser.read(1)if data != '': print data
注意:Python與多個串口通信的時候,要確定端口號。如果有時間的話,可以自己寫一個查詢所有端口的信息,不想這么麻煩的話,下載個串口助手,自己看端口信息,在py文件中修改serial.Serial()里面的端口號。
由于測試工作的需要,在C端產(chǎn)品上經(jīng)常使用串口進行通信,而測試腳本大部分時候又采用python編寫,于是就不得不了解并熟悉python下的串口通信實現(xiàn)方法了,整理如下以備隨時使用:
一、說明
pyserial封裝了python環(huán)境下對串口的訪問,其兼容各種平臺,并有統(tǒng)一的操作接口。通過python屬性訪問串口設(shè)置,并可對串口的各種配置參數(shù)(如串口名,波特率、停止校驗位、流控、超時等等)做修改,再進行串口通信的類與接口封裝后,非常方便地被調(diào)用和移植。
二、模塊安裝
pip insatll pyserial
三、初始化與參數(shù)說明
import serial
ser = serial.Serial('COM3', 115200, timeout=0.5, ....................)
下面看看 serial.Serial 原生類
四、不同平臺下初始化
ser=serial.Serial("/dev/ttyUSB0",9600,timeout=0.5)#使用USB連接串行口ser=serial.Serial("/dev/ttyAMA0",9600,timeout=0.5)#使用樹莓派的GPIO口連接串行口ser=serial.Serial(1,9600,timeout=0.5)#winsows系統(tǒng)使用COM1口連接串行口ser=serial.Serial("COM1",9600,timeout=0.5)#winsows系統(tǒng)使用COM1口連接串行口ser=serial.Serial("/dev/ttyS1",9600,timeout=0.5)#Linux系統(tǒng)使用COM1口連接串行口
五、串口屬性
ser.name?#串口名稱
ser.port?#端口號
ser.baudrate #波特率
ser.bytesize #字節(jié)大小
ser.parity #校驗位N-無校驗,E-偶校驗,O-奇校驗
ser.stopbits #停止位
ser.timeout #讀超時設(shè)置
ser.writeTimeout #寫超時
ser.xonxoff #軟件流控
ser.rtscts #硬件流控
ser.dsrdtr #硬件流控
ser.interCharTimeout #字符間隔超時?
六、串口常用方法
isOpen():查看端口是否被打開。
open() :打開端口‘。
close():關(guān)閉端口。
read(size=1):從端口讀字節(jié)數(shù)據(jù)。默認(rèn)1個字節(jié)。
read_all():從端口接收全部數(shù)據(jù)。
write(data):向端口寫數(shù)據(jù)。
readline():讀一行數(shù)據(jù)。
readlines():讀多行數(shù)據(jù)。
in_waiting():返回輸入緩存中的字節(jié)數(shù)。
out_waiting():返回輸出緩存中的字節(jié)數(shù)。
flush():等待所有數(shù)據(jù)寫出。
flushInput():丟棄接收緩存中的所有數(shù)據(jù)。
flushOutput():終止當(dāng)前寫操作,并丟棄發(fā)送緩存中的數(shù)據(jù)。
sendBreadk(duration=0.25):發(fā)送BREAK條件,并于duration時間之后返回IDLE
setBreak(level=True):根據(jù)level設(shè)置break條件。
setRTS(level=True):設(shè)置請求發(fā)送(RTS)的控制信號
setDTR(level=True):設(shè)置數(shù)據(jù)終端準(zhǔn)備就緒的控制信號
七、類與接口封裝
import time
import serial
import serial.tools.list_ports
# 串口操作類
class serialCommunication(object):
def __init__(self, port, bps, timeout):# 可配置更多參數(shù)
? ? port_list =self.show_usable_com()
if len(port_list) 0:
if portnot in port_list:
self.port = port_list[0]
else:
self.port = port
else:
print("no usable serial, please plugin your serial board")
return
? ? self.bps = bps
self.timeout = timeout
try:
# 初始化串口,并得到串口對象,根據(jù)需要可拓展更多參數(shù)
? ? ? ? self.ser = serial.Serial(self.port, self.bps, 8, 'N', 1, timeout=self.timeout, write_timeout=self.timeout)
except Exception as e:# 拋出異常
? ? ? ? print("Exception={}".format(e))
# 顯示可用串口列表
@staticmethod
def show_usable_com():
serialport_list = []
portInfo_list =list(serial.tools.list_ports.comports())
if len(portInfo_list) =0:
print("can not find any serial port!")
else:
print(portInfo_list)
for i in range(len(portInfo_list)):
plist =list(portInfo_list[i])
print(plist)
serialport_list.append(plist[0])
print(serialport_list)
return serialport_list
# 輸出串口基本信息
def serial_infor(self):
print(self.ser.name)# 設(shè)備名字
? ? print(self.ser.port)# 讀或者寫端口
? ? print(self.ser.baudrate)# 波特率
? ? print(self.ser.bytesize)# 字節(jié)大小
? ? print(self.ser.parity)# 校驗位
? ? print(self.ser.stopbits)# 停止位
? ? print(self.ser.timeout)# 讀超時設(shè)置
? ? print(self.ser.writeTimeout)# 寫超時
? ? print(self.ser.xonxoff)# 軟件流控
? ? print(self.ser.rtscts)# 軟件流控
? ? print(self.ser.dsrdtr)# 硬件流控
? ? print(self.ser.interCharTimeout)# 字符間隔超時
# 打開串口
def serial_open(self):
try:
if not self.ser.isOpen():
self.ser.open()
except Exception as e:# 拋出異常
? ? ????print("serial_open Exception={}".format(e))
self.ser.close()
# 讀取指定大小的數(shù)據(jù)
# 從串口讀size個字節(jié)。如果指定超時,則可能在超時后返回較少的字節(jié);如果沒有指定超時,則會一直等到收完指定的字節(jié)數(shù)。
def serial_read_with_size(self, size):
try:
self.serial_open()
return self.ser.read(size).decode("utf-8")
except Exception as e:
print("serial_read_all Exception={}".format(e))
self.ser.close()
# 讀取當(dāng)前串口緩存中的所有數(shù)據(jù)
def serial_read_data(self):
try:
self.serial_open()
datalen =self.ser.inWaiting()
? ? ? ? if datalen ==0:
return None
? ? ? ? return self.ser.read(datalen).decode("utf-8")
except Exception as e:
print("serial_read_data Exception={}".format(e))
self.ser.close()
# 讀串口全部數(shù)據(jù),注意timeout的設(shè)置
# 在設(shè)定的timeout時間范圍內(nèi),如果讀取的字節(jié)數(shù)據(jù)是有效的(就是非空)那就直接返回,
# 否則一直會等到設(shè)定的timeout時間并返回這段時間所讀的全部字節(jié)數(shù)據(jù)。
def serial_read_all(self):
try:
self.serial_open()
return self.ser.read_all().decode("utf-8")
except Exception as e:
print("serial_read_all Exception={}".format(e))
self.ser.close()
# 讀一行數(shù)據(jù)
# 使用readline()時應(yīng)該注意:打開串口時應(yīng)該指定超時,否則如果串口沒有收到新行,則會一直等待。
# 如果沒有超時,readline會報異常。
def serial_read_line(self):
try:
self.serial_open()
return self.ser.readline().decode("utf-8")
except Exception as e:
print("serial_read_line Exception={}".format(e))
? ? ? ? self.ser.close()
# 讀多行數(shù)據(jù),返回行列表
def serial_read_lines(self):
try:
self.serial_open()
return self.ser.readlines().decode("utf-8")
except Exception as e:
print("serial_read_lines Exception={}".format(e))
self.ser.close()
# 寫數(shù)據(jù)
def serial_write_data(self, data):
try:
self.serial_open()
self.ser.flushOutput()
data_len =self.ser.write(data.encode('utf-8'))
return data_len
except Exception as e:
print("serial_write_data Exception={}".format(e))
return 0
# 寫行數(shù)據(jù),注意參數(shù)差異
def serial_write_lines(self, lines):
self.ser.writelines(lines)
# 清除串口緩存
def serial_clean(self):
try:
if self.ser.isOpen():
self.ser.flush()
except Exception as e:
print("serial_clean Exception={}".format(e))
# 關(guān)閉串口
def serial_close(self):
try:
if self.ser.isOpen():
self.ser.close()
except Exception as e:
print("serial_clean Exception={}".format(e))
if __name__ =='__main__':
testSerial = serialCommunication("COM10", 1500000, 0.5)
testSerial.serial_open()
testSerial.serial_infor()
testSerial.serial_write_data("ifconfig eth0\n")
time.sleep(0.1)
data = testSerial.serial_read_all()
print(data)
testSerial.serial_close()
八、其他
1)ser.VERSION表示pyserial版本;?另外,ser.name表示設(shè)備名稱
2)端口設(shè)置可以被讀入字典,也可從字典加載設(shè)置:
getSettingDict():返回當(dāng)前串口設(shè)置的字典
applySettingDict(d):應(yīng)用字典到串口設(shè)置
3)?Readline()是讀一行,以/n結(jié)束,要是沒有/n就一直讀,阻塞。注意:打開串口時應(yīng)該指定超時,否則如果串口沒有收到新行,則會一直等待。
4)serial.read_all 與?serial.read_all()區(qū)別
serial.read_all:讀取串口所有的參數(shù)信息
serial.read_all():超時時間內(nèi)從串口讀取的所有數(shù)據(jù)
5) 異常信息
exception serial.SerialException
exception serial.SerialTimeoutException
分享名稱:Python讀取串口函數(shù) python調(diào)用串口通信
路徑分享:http://chinadenli.net/article0/hghpio.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供外貿(mào)建站、網(wǎng)站設(shè)計、網(wǎng)頁設(shè)計公司、、小程序開發(fā)、網(wǎng)站營銷
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)