python里面使用serial庫來操作串口,serial的使用流程跟平常的類似,也是打開、關閉、讀、寫
創新互聯是一家集網站建設,千陽企業網站建設,千陽品牌網站建設,網站定制,千陽網站建設報價,網絡營銷,網絡優化,千陽網站推廣為一體的創新建站企業,幫助傳統企業提升企業形象加強企業競爭力。可充分滿足這一群體相比中小企業更為豐富、高端、多元的互聯網需求。同時我們時刻保持專業、時尚、前沿,時刻以成就客戶成長自我,堅持不斷學習、思考、沉淀、凈化自己,讓我們為更多的企業打造出實用型網站。
一般就是設置端口,波特率。
使用serial.Serial創建實體的時候會去打開串口,之后可以使用is_open開判斷下是否串口是否打開正常。
使用ser.close即可關閉串口
數據的寫使用ser.write接口,如果寫的是十六進制的數據使用bytearray來定義,如 writebuf = bytearray([0x55, 0xaa, 0x00, 0x01, 0x00, 0x00])
讀數據使用ser.read接口,一般會先使用in_waiting來判斷下是否有數據,然后開始讀
下面舉一個例子,說明下我們在實際的使用情況。
一般會單獨創建一個進程來作為數據的接收,然后再配合上標記位或者信號量來處理邏輯
由于測試工作的需要,在C端產品上經常使用串口進行通信,而測試腳本大部分時候又采用python編寫,于是就不得不了解并熟悉python下的串口通信實現方法了,整理如下以備隨時使用:
一、說明
pyserial封裝了python環境下對串口的訪問,其兼容各種平臺,并有統一的操作接口。通過python屬性訪問串口設置,并可對串口的各種配置參數(如串口名,波特率、停止校驗位、流控、超時等等)做修改,再進行串口通信的類與接口封裝后,非常方便地被調用和移植。
二、模塊安裝
pip insatll pyserial
三、初始化與參數說明
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系統使用COM1口連接串行口ser=serial.Serial("COM1",9600,timeout=0.5)#winsows系統使用COM1口連接串行口ser=serial.Serial("/dev/ttyS1",9600,timeout=0.5)#Linux系統使用COM1口連接串行口
五、串口屬性
ser.name?#串口名稱
ser.port?#端口號
ser.baudrate #波特率
ser.bytesize #字節大小
ser.parity #校驗位N-無校驗,E-偶校驗,O-奇校驗
ser.stopbits #停止位
ser.timeout #讀超時設置
ser.writeTimeout #寫超時
ser.xonxoff #軟件流控
ser.rtscts #硬件流控
ser.dsrdtr #硬件流控
ser.interCharTimeout #字符間隔超時?
六、串口常用方法
isOpen():查看端口是否被打開。
open() :打開端口‘。
close():關閉端口。
read(size=1):從端口讀字節數據。默認1個字節。
read_all():從端口接收全部數據。
write(data):向端口寫數據。
readline():讀一行數據。
readlines():讀多行數據。
in_waiting():返回輸入緩存中的字節數。
out_waiting():返回輸出緩存中的字節數。
flush():等待所有數據寫出。
flushInput():丟棄接收緩存中的所有數據。
flushOutput():終止當前寫操作,并丟棄發送緩存中的數據。
sendBreadk(duration=0.25):發送BREAK條件,并于duration時間之后返回IDLE
setBreak(level=True):根據level設置break條件。
setRTS(level=True):設置請求發送(RTS)的控制信號
setDTR(level=True):設置數據終端準備就緒的控制信號
七、類與接口封裝
import time
import serial
import serial.tools.list_ports
# 串口操作類
class serialCommunication(object):
def __init__(self, port, bps, timeout):# 可配置更多參數
? ? 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:
# 初始化串口,并得到串口對象,根據需要可拓展更多參數
? ? ? ? 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)# 設備名字
? ? print(self.ser.port)# 讀或者寫端口
? ? print(self.ser.baudrate)# 波特率
? ? print(self.ser.bytesize)# 字節大小
? ? print(self.ser.parity)# 校驗位
? ? print(self.ser.stopbits)# 停止位
? ? print(self.ser.timeout)# 讀超時設置
? ? 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()
# 讀取指定大小的數據
# 從串口讀size個字節。如果指定超時,則可能在超時后返回較少的字節;如果沒有指定超時,則會一直等到收完指定的字節數。
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()
# 讀取當前串口緩存中的所有數據
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()
# 讀串口全部數據,注意timeout的設置
# 在設定的timeout時間范圍內,如果讀取的字節數據是有效的(就是非空)那就直接返回,
# 否則一直會等到設定的timeout時間并返回這段時間所讀的全部字節數據。
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()
# 讀一行數據
# 使用readline()時應該注意:打開串口時應該指定超時,否則如果串口沒有收到新行,則會一直等待。
# 如果沒有超時,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()
# 讀多行數據,返回行列表
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()
# 寫數據
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
# 寫行數據,注意參數差異
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))
# 關閉串口
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表示設備名稱
2)端口設置可以被讀入字典,也可從字典加載設置:
getSettingDict():返回當前串口設置的字典
applySettingDict(d):應用字典到串口設置
3)?Readline()是讀一行,以/n結束,要是沒有/n就一直讀,阻塞。注意:打開串口時應該指定超時,否則如果串口沒有收到新行,則會一直等待。
4)serial.read_all 與?serial.read_all()區別
serial.read_all:讀取串口所有的參數信息
serial.read_all():超時時間內從串口讀取的所有數據
5) 異常信息
exception serial.SerialException
exception serial.SerialTimeoutException
1、安裝串口庫
2、采用默認通信參數
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、可以自己設置參數
import timeimport serialser = serial.Serial( #下面這些參數根據情況修改 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()里面的端口號。
標題名稱:python串口讀取函數 python讀取uart串口
瀏覽路徑:http://vcdvsql.cn/article14/doisede.html
成都網站建設公司_創新互聯,為您提供軟件開發、虛擬主機、App設計、響應式網站、網站策劃、關鍵詞優化
聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯