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()都需要设置超时时间

 import serial
import serial.tools.list_ports #测试调试输出开关,正式发布需调整为False
mytest = True
#mytest = False '''
** Descriptions: 获取串口
** Parameters: void 无
** Returned value: list - port_serial串口列表
** Created By: yanerfree
** Created on: 2018年9月25日
** Remarks:
'''
def getPort():
port_serial=[]#返回串口列表
port_list = list(serial.tools.list_ports.comports()) if len(port_list) <= 0:
print("The Serial port can't find!")
else:
#if(mytest):print("port_list: ",port_list)
for port in port_list:
#if(mytest):print("port: ",port)
port_serial.append(str(port).split(' ')[0])
# if(mytest):print("port_serial: ",port_serial) return(port_serial) '''
** Descriptions: 发送串口数据
** Parameters:
** Returned value:
** Created By: yanerfree
** Created on: 2018年10月16日
** Remarks:以二进制读取
'''
def send_data(serial_port="COM6", baudrate=115200, bytesize=8,
parity=serial.PARITY_NONE,stopbit=1,
timeout=5, filename="F:\test.txt"):
serial_port_1 = serial_port
baudrate_1 = int(baudrate)
bytesize_1 = int(bytesize)
parity_1 = parity[:1]
stopbit_1 = int(stopbit)
timeout_1 = timeout
filename_1 = filename
print(serial_port_1,baudrate_1,bytesize_1,parity_1,stopbit_1,timeout_1,filename_1)
try:
print("初始化串口")
# ser_port = serial.Serial("COM6",115200,timeout=1.5,parity=serial.PARITY_NONE,
# stopbits=serial.STOPBITS_ONE,
# bytesize=serial.EIGHTBITS)
ser_port = serial.Serial(serial_port_1, baudrate_1,bytesize_1,parity_1,stopbit_1, timeout_1)
print("串口是否打开:",ser_port.isOpen())
if not ser_port.isOpen():
ser_port.open()
print("串口是否打开:",ser_port.isOpen()) f = open(filename_1,'rb')#打开或者新建一个文件
i=0
while 1:
i = i + 1
print("读取文 件第 %d 行"%i)
#fileData=f.readline().strip('\n').encode(encoding='utf_8')#编码转换成字节发送
fileData=f.readline().strip(b'\n')
fileData=fileData.strip(b'\r')
if fileData==b'':
break
#fileData_1=(fileData+'SDSA\r\n'.encode(encoding='utf_8'))
fileData_1=(fileData+b'SDSA\r\n')
print("发送数据为:",fileData_1)
ser_port.write(fileData_1)
#print("fileData[-11:]",fileData[-11:])
if fileData[-11:]==b'***[END]***':
#if fileData[-11:]=='***[END]***':
print("检测到文件结束符,退出")
break;
print("等待2s")
time.sleep(2)
except Exception:
print("发送脚本失败")
finally:
f.close()
ser_port.close() '''
** Descriptions: 获取串口数据
** Parameters:
** Returned value:
** Created By: yanerfree
** Created on: 2018年10月17日
** Remarks:二进制保存
'''
def receive_data(serial_port="COM6", baudrate=115200, bytesize=8,
parity=serial.PARITY_NONE,stopbit=1,
timeout=5,filename="F:\test.txt"):
serial_port_1 = serial_port
baudrate_1 = int(baudrate)
bytesize_1 = int(bytesize)
parity_1 = parity[:1]
stopbit_1 = int(stopbit)
timeout_1 = timeout
filename_1 = filename
print(serial_port_1,baudrate_1,bytesize_1,parity_1,stopbit_1,timeout_1,filename_1)
try:
print("初始化串口")
#ser_port = serial.Serial(serial_port, baudrate,bytesize,parity,stopbit, timeout)
ser_port = serial.Serial(serial_port_1, baudrate_1,bytesize_1,parity_1,stopbit_1, timeout_1)
print("串口是否打开:",ser_port.isOpen())
if not ser_port.isOpen():
ser_port.open()
print("串口是否打开:",ser_port.isOpen()) #f = open(filename_1,'w',encoding='utf-8')#打开或者新建一个文件
f = open(filename_1,'wb')#以二进制打开或创建一个文件 while True:
fileData=ser_port.readline()
if(len(fileData)==0 or fileData[-6:]!=b'SDSA\r\n'):
continue;
print("接收到的数据:",fileData)
fileData1=fileData.split(b'SDSA\r\n')[0]
fileData2=fileData1+b'\n'#'0X0D'
filedata_str=fileData1.decode(encoding='utf_8')
content = filedata_str + '\n'
print("保存的数据为:",fileData2)
#saveFile(filename_1,fileData1)
f.write(fileData2)
if filedata_str[-11:]=='***[END]***':
break;
sleep(1)
except Exception:
print("获取脚本失败")
finally:
f.close()
ser_port.close()
if mytest: print("串口是否打开:",ser_port.isOpen())

python_serial的更多相关文章

随机推荐

  1. JS实现元素的全屏、退出全屏功能

     在实际开发中,我们很可能需要实现某一元素的全屏和退出全屏功能,如canvas.所幸的是,js提供了相关api用来处理这一问题,只需简单的调用requestFullScreen.exitFullScr ...

  2. 整整 Java 线程池

    为什么用线程池 用官方文档来说,线程池解决了两个问题: 一是在执行大量的异步任务时,因为线程池减少了任务开始前的准备工作,如频繁创建线程,启动线程等工作,提升了性能表现:二是提供了一种绑定资源和管理资 ...

  3. time wait 整理

    目录 状态转换图 1.谁会进入time wait状态: 主动发起断开连接的一方调用close()函数发送FIN并进入FIN WAIT 1状态,当收到对面反馈的ack之后会进入FIN WAIT2状态.之 ...

  4. 手把手教你用Node.js爬虫爬取网站数据

    个人网站 https://iiter.cn 程序员导航站 开业啦,欢迎各位观众姥爷赏脸参观,如有意见或建议希望能够不吝赐教! 开始之前请先确保自己安装了Node.js环境,还没有安装的的童鞋请自行百度 ...

  5. 2019 ICPC 银川网络赛 H. Fight Against Monsters

    It is my great honour to introduce myself to you here. My name is Aloysius Benjy Cobweb Dartagnan Eg ...

  6. python(random 模块)

     一.Random 模块 注意:random() 是不能直接访问的,需要导入 random 模块,然后通过 random 静态对象调用该方法. 1.random.random() 返回随机生成的一个 ...

  7. DataHub——实时数据治理平台

    DataHub 首先,阿里云也有一款名为DataHub的产品,是一个流式处理平台,本文所述DataHub与其无关. 数据治理是大佬们最近谈的一个火热的话题.不管国家层面,还是企业层面现在对这个问题是越 ...

  8. 【Spark】一起了解一下大数据必不可少的Spark吧!

    目录 Spark概述 官网 Spark是什么? 特点 Spark架构模块 主要架构模块 Spark Core Spark SQL Spark Streaming MLlib GraghX 集群管理器 ...

  9. 【Kafka】Kafka简单介绍

    目录 基本介绍 概述 优点 主要应用场景 Kafka的架构 四大核心API 架构内部细节 基本介绍 概述 Kafka官网网站:http://kafka.apache.org/ Kafka是由Apach ...

  10. 【Hadoop离线基础总结】hive的窗口函数

    hive的窗口函数 概述 hive中一般求取TopN时就需要用到窗口函数 专业窗口函数一般有三个 rank() over dense rank() over row_number() over 实例 ...