python中pyserial模塊使用方法,pyserial模塊封裝了對串口的訪問。python
在支持的平臺上有統一的接口。app
經過python屬性訪問串口設置。測試
支持不一樣的字節大小、中止位、校驗位和流控設置。編碼
能夠有或者沒有接收超時。 spa
相似文件的API,例如read和write,也支持readline等。調試
支持二進制傳輸,沒有null消除,沒有cr-lf轉換。code
import serialblog
// 打開串口0, 9600,8N1,鏈接超時0.5秒接口
import serialip
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("com1",9600,timeout=0.5)#Linux系統使用com1口鏈接串行口
print ser.name#打印設備名稱
print ser.port#打印設備名
ser.open() #打開端口
s = ser.read(10)#從端口讀10個字節
ser.write("hello")#向端口些數據
ser.close()#關閉端口
data = ser.read(20)#是讀20個字符
data = ser.readline() #是讀一行,以/n結束,要是沒有/n就一直讀,阻塞。
data = ser.readlines()和ser.xreadlines()#都須要設置超時時間
ser.baudrate = 9600 #設置波特率
ser.isOpen() #看看這個串口是否已經被打開
串行口的屬性:
name:設備名字
portstr:已廢棄,用name代替
port:讀或者寫端口
baudrate:波特率
bytesize:字節大小
parity:校驗位
stopbits:中止位
timeout:讀超時設置
writeTimeout:寫超時
xonxoff:軟件流控
rtscts:硬件流控
dsrdtr:硬件流控
interCharTimeout:字符間隔超時
ser=serial.Serial("/dev/ttyAMA0",9600,timeout=0.5)
ser.open()
print ser.name
print ser.port
print ser.baudrate#波特率
print ser.bytesize#字節大小
print ser.parity#校驗位N-無校驗,E-偶校驗,O-奇校驗
print ser.stopbits#中止位
print ser.timeout#讀超時設置
print ser.writeTimeout#寫超時
print ser.xonxoff#軟件流控
print ser.rtscts#硬件流控
print ser.dsrdtr#硬件流控
print ser.interCharTimeout#字符間隔超時
ser.close()
須要用的常量
bytesize:FIVE BITS、SIXBITS、SEVENBITS、EIGHTBITS
parity: PARITY_NONE, PARITY_EVEN, PARITY_ODD, PARITY_MARK, PARITY_SPACE
stopbits: STOPBITS_ONE, STOPBITS_ONE_POINT_FIVE, STOPBITS_TWO
異常:
ValueError:參數錯誤
SerialException:找不到設備或不能配置
ser.baudrate=9600#設置波特率
ser.bytesize=8#字節大小
ser.bytesize=serial.EiGHTBITS#8位數據位
ser.parity=serial.PARITY_EVEN#偶校驗
ser.parity=serial.PARITY_NONE#無校驗
ser.parity=serial.PARITY_ODD#奇校驗
ser.stopbits=1#中止位
ser.timeout=0.5#讀超時設置
ser.writeTimeout=0.5#寫超時
ser.xonxoff#軟件流控
ser.rtscts#硬件流控
ser.dsrdtr#硬件流控
ser.interCharTimeout#字符間隔超時
是讀一行,以/n結束,要是沒有/n就一直讀,阻塞。
使用readline()時應該注意:打開串口時應該指定超時,不然若是串口沒有收到新行,則會一直等待。若是沒有超時,readline會報異常。
其中,read(value)方法的參數value爲須要讀取的字符長度。 若是想要所有讀取,提供兩個方法:
inWaiting:監測接收字符。
inWaitting返回接收字符串的長度值,而後把這個值賦給read作參數。
data =readall()::讀取所有字符。
data = ser.read()能夠讀一個字符
data = ser.read(20) 是讀20個字符
data = ser.readline() 是讀一行,以/n結束,要是沒有/n就一直讀,阻塞。
data = ser.readlines()和ser.xreadlines()都須要設置超時時間
1 import serial 2 import serial.tools.list_ports 3 4 5 #測試調試輸出開關,正式發佈需調整爲False 6 mytest = True 7 #mytest = False 8 9 ''' 10 ** Descriptions: 獲取串口 11 ** Parameters: void 無 12 ** Returned value: list - port_serial串口列表 13 ** Created By: yanerfree 14 ** Created on: 2018年9月25日 15 ** Remarks: 16 ''' 17 def getPort(): 18 port_serial=[]#返回串口列表 19 port_list = list(serial.tools.list_ports.comports()) 20 21 if len(port_list) <= 0: 22 print("The Serial port can't find!") 23 else: 24 #if(mytest):print("port_list: ",port_list) 25 for port in port_list: 26 #if(mytest):print("port: ",port) 27 port_serial.append(str(port).split(' ')[0]) 28 # if(mytest):print("port_serial: ",port_serial) 29 30 return(port_serial) 31 32 ''' 33 ** Descriptions: 發送串口數據 34 ** Parameters: 35 ** Returned value: 36 ** Created By: yanerfree 37 ** Created on: 2018年10月16日 38 ** Remarks:以二進制讀取 39 ''' 40 def send_data(serial_port="COM6", baudrate=115200, bytesize=8, 41 parity=serial.PARITY_NONE,stopbit=1, 42 timeout=5, filename="F:\test.txt"): 43 serial_port_1 = serial_port 44 baudrate_1 = int(baudrate) 45 bytesize_1 = int(bytesize) 46 parity_1 = parity[:1] 47 stopbit_1 = int(stopbit) 48 timeout_1 = timeout 49 filename_1 = filename 50 print(serial_port_1,baudrate_1,bytesize_1,parity_1,stopbit_1,timeout_1,filename_1) 51 try: 52 print("初始化串口") 53 # ser_port = serial.Serial("COM6",115200,timeout=1.5,parity=serial.PARITY_NONE, 54 # stopbits=serial.STOPBITS_ONE, 55 # bytesize=serial.EIGHTBITS) 56 ser_port = serial.Serial(serial_port_1, baudrate_1,bytesize_1,parity_1,stopbit_1, timeout_1) 57 print("串口是否打開:",ser_port.isOpen()) 58 if not ser_port.isOpen(): 59 ser_port.open() 60 print("串口是否打開:",ser_port.isOpen()) 61 62 f = open(filename_1,'rb')#打開或者新建一個文件 63 i=0 64 while 1: 65 i = i + 1 66 print("讀取文 件第 %d 行"%i) 67 #fileData=f.readline().strip('\n').encode(encoding='utf_8')#編碼轉換成字節發送 68 fileData=f.readline().strip(b'\n') 69 fileData=fileData.strip(b'\r') 70 if fileData==b'': 71 break 72 #fileData_1=(fileData+'SDSA\r\n'.encode(encoding='utf_8')) 73 fileData_1=(fileData+b'SDSA\r\n') 74 print("發送數據爲:",fileData_1) 75 ser_port.write(fileData_1) 76 #print("fileData[-11:]",fileData[-11:]) 77 if fileData[-11:]==b'***[END]***': 78 #if fileData[-11:]=='***[END]***': 79 print("檢測到文件結束符,退出") 80 break; 81 print("等待2s") 82 time.sleep(2) 83 except Exception: 84 print("發送腳本失敗") 85 finally: 86 f.close() 87 ser_port.close() 88 89 90 ''' 91 ** Descriptions: 獲取串口數據 92 ** Parameters: 93 ** Returned value: 94 ** Created By: yanerfree 95 ** Created on: 2018年10月17日 96 ** Remarks:二進制保存 97 ''' 98 def receive_data(serial_port="COM6", baudrate=115200, bytesize=8, 99 parity=serial.PARITY_NONE,stopbit=1, 100 timeout=5,filename="F:\test.txt"): 101 serial_port_1 = serial_port 102 baudrate_1 = int(baudrate) 103 bytesize_1 = int(bytesize) 104 parity_1 = parity[:1] 105 stopbit_1 = int(stopbit) 106 timeout_1 = timeout 107 filename_1 = filename 108 print(serial_port_1,baudrate_1,bytesize_1,parity_1,stopbit_1,timeout_1,filename_1) 109 try: 110 print("初始化串口") 111 #ser_port = serial.Serial(serial_port, baudrate,bytesize,parity,stopbit, timeout) 112 ser_port = serial.Serial(serial_port_1, baudrate_1,bytesize_1,parity_1,stopbit_1, timeout_1) 113 print("串口是否打開:",ser_port.isOpen()) 114 if not ser_port.isOpen(): 115 ser_port.open() 116 print("串口是否打開:",ser_port.isOpen()) 117 118 #f = open(filename_1,'w',encoding='utf-8')#打開或者新建一個文件 119 f = open(filename_1,'wb')#以二進制打開或建立一個文件 120 121 while True: 122 fileData=ser_port.readline() 123 if(len(fileData)==0 or fileData[-6:]!=b'SDSA\r\n'): 124 continue; 125 print("接收到的數據:",fileData) 126 fileData1=fileData.split(b'SDSA\r\n')[0] 127 fileData2=fileData1+b'\n'#'0X0D' 128 filedata_str=fileData1.decode(encoding='utf_8') 129 content = filedata_str + '\n' 130 print("保存的數據爲:",fileData2) 131 #saveFile(filename_1,fileData1) 132 f.write(fileData2) 133 if filedata_str[-11:]=='***[END]***': 134 break; 135 sleep(1) 136 except Exception: 137 print("獲取腳本失敗") 138 finally: 139 f.close() 140 ser_port.close() 141 if mytest: print("串口是否打開:",ser_port.isOpen())