python_serial

serial

python中pyserial模塊使用方法,pyserial模塊封裝了對串口的訪問。python

在支持的平臺上有統一的接口。app

經過python屬性訪問串口設置。測試

支持不一樣的字節大小、中止位、校驗位和流控設置。編碼

能夠有或者沒有接收超時。 spa

相似文件的API,例如read和write,也支持readline等。調試

支持二進制傳輸,沒有null消除,沒有cr-lf轉換。code

使用方法和實例

導入pyserial模塊

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#字符間隔超時

Read

是讀一行,以/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())
相關文章
相關標籤/搜索
本站公眾號
   歡迎關注本站公眾號,獲取更多信息