python serial_python_serial

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 importserial2 importserial.tools.list_ports3

4

5 #测试调试输出开关,正式发布需调整为False

6 mytest =True7 #mytest = False

8

9 '''

10 ** Descriptions: 获取串口11 ** Parameters: void 无12 ** Returned value: list - port_serial串口列表13 ** Created By: yanerfree14 ** Created on: 2018年9月25日15 ** Remarks:16 '''

17 defgetPort():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 inport_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: yanerfree37 ** 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_port44 baudrate_1 =int(baudrate)45 bytesize_1 =int(bytesize)46 parity_1 = parity[:1]47 stopbit_1 =int(stopbit)48 timeout_1 =timeout49 filename_1 =filename50 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 notser_port.isOpen():59 ser_port.open()60 print("串口是否打开:",ser_port.isOpen())61

62 f = open(filename_1,'rb')#打开或者新建一个文件

63 i=064 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 exceptException:84 print("发送脚本失败")85 finally:86 f.close()87 ser_port.close()88

89

90 '''

91 ** Descriptions: 获取串口数据92 ** Parameters:93 ** Returned value:94 ** Created By: yanerfree95 ** 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_port102 baudrate_1 =int(baudrate)103 bytesize_1 =int(bytesize)104 parity_1 = parity[:1]105 stopbit_1 =int(stopbit)106 timeout_1 =timeout107 filename_1 =filename108 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 notser_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 exceptException:137 print("获取脚本失败")138 finally:139 f.close()140 ser_port.close()141 if mytest: print("串口是否打开:",ser_port.isOpen())

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值