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. Swift-Realm数据库的使用详解

    Swift-Realm数据库的使用详解 概述 Realm 是一个跨平台的移动数据库引擎,其性能要优于 Core Data 和 FMDB - 移动端数据库性能比较, 我们可以在 Android 端 re ...

  2. Windows 10 MSDN官方原版ISO镜像(简体中文)下载

    http://www.heu8.com/2800.html 硬件要求如下:处理器:1 GHz 或更快的处理器或 SoC RAM:1 GB(32 位)或 2 GB(64 位) 硬盘空间:16 GB(32 ...

  3. C++编程入门题目--No.5

    题目: 输入三个整数x,y,z,请把这三个数由小到大输出. 程序分析: 我们想办法把最小的数放到x上,先将x与y进行比较,如果x>y则将x与y的值进行交换, 然后再用x与z进行比较,如果x> ...

  4. tar命令基本、进阶使用指北

    tar命令基本.进阶使用指北 摘要 打包与压缩是我们在计算机系统日常使用中必备的一个工具,就如我们在使用Windows系统,也需要类似WinRAR的压缩软件来将许多数据.文件打包成一个文件,并压缩其占 ...

  5. unittest(执行用例)

    from selenium import webdriver from time import sleep import unittest#导入unittest库 import HTMLTestRun ...

  6. 4)drf序列化组件 Serializer(偏底层)、ModelSerializer(重点)、ListModelSerializer(辅助群改)

    知识点:Serializer(偏底层).ModelSerializer(重点).ListModelSerializer(辅助群改) 一.Serializer 偏底层 一般不用 理解原理 1.序列化准备 ...

  7. django源码分析——处理请求到wsgi及视图view

    本文环境python3.5.2,django1.10.x系列 根据前上一篇runserver的博文,已经分析了本地调试服务器的大致流程,现在我们来分析一下当runserver运行起来后,django框 ...

  8. tomcat8调优

    a. tomcat的运行原理: 1. Tomcat是运行在JVM中的一个进程.它定义为[中间件],顾名思义,是一个在Java项目与JVM之间的中间容器. 2. Web项目的本质,是一大堆的资源文件和方 ...

  9. 用纯css、JavaScript、jQuery简单的轮播图

    完成一个可以自动切换或点击数字的轮播图 HTML代码只需要一个div 包含着一个图片和一个列表,我们主要的思路就是通过点击相应的数字,改变图片的 路径. 有4张图片都在img文件夹里,名称为  img ...

  10. P2432 zxbsmk爱查错

    描述:https://www.luogu.com.cn/problem/P2432 给你一个主串以及若干个子串,求最少需要删除几个字母,使得主串能由一些子串组成. dp [ i ] 表示前 i 个字符 ...