serial
python中pyserial模块使用方法,pyserial模块封装了对串口的访问。
在支持的平台上有统一的接口。
通过python属性访问串口设置。
支持不同的字节大小、停止位、校验位和流控设置。
可以有或者没有接收超时。
类似文件的API,例如read和write,也支持readline等。
支持二进制传输,没有null消除,没有cr-lf转换。
使用方法和实例
导入pyserial模块
import serial
打开串行口
// 打开串口0, 9600,8N1,连接超时0.5秒
import 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("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: est.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(' ').encode(encoding='utf_8')#编码转换成字节发送 68 fileData=f.readline().strip(b' ') 69 fileData=fileData.strip(b' ') 70 if fileData==b'': 71 break 72 #fileData_1=(fileData+'SDSA '.encode(encoding='utf_8')) 73 fileData_1=(fileData+b'SDSA ') 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: est.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 '): 124 continue; 125 print("接收到的数据:",fileData) 126 fileData1=fileData.split(b'SDSA ')[0] 127 fileData2=fileData1+b' '#'0X0D' 128 filedata_str=fileData1.decode(encoding='utf_8') 129 content = filedata_str + ' ' 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())