Python实现串口通信(pyserial)过程解析


Posted in Python onSeptember 25, 2019

pyserial模块封装了对串口的访问,兼容各种平台。

安装

pip insatll pyserial

初始化

简单初始化示例

import serial
ser = serial.Serial('com1', 9600, timeout=1)

所有参数

ser = serial.Serial(
port=None,       # number of device, numbering starts at
# zero. if everything fails, the user
# can specify a device string, note
# that this isn't portable anymore
# if no port is specified an unconfigured
# an closed serial port object is created
baudrate=9600,     # baud rate
bytesize=EIGHTBITS,   # number of databits
parity=PARITY_NONE,   # enable parity checking
stopbits=STOPBITS_ONE, # number of stopbits
timeout=None,      # set a timeout value, None for waiting forever
xonxoff=0,       # enable software flow control
rtscts=0,        # enable RTS/CTS flow control
interCharTimeout=None  # Inter-character timeout, None to disable
)

不同平台下初始化

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("/dev/ttyS1",9600,timeout=0.5)#Linux系统使用com1口连接串行口

serial.Serial类(另外初始化的方法)

class serial.Serial()
{
  def __init__(port=None, baudrate=9600, bytesize=EIGHTBITS,parity=PARITY_NONE, stopbits=STOPBITS_ONE, timeout=None, xonxoff=False, rtscts=False, writeTimeout=None, dsrdtr=False, interCharTimeout=None)
}

ser对象属性

name:设备名字
port:读或者写端口
baudrate:波特率
bytesize:字节大小
parity:校验位
stopbits:停止位
timeout:读超时设置
writeTimeout:写超时
xonxoff:软件流控
rtscts:硬件流控
dsrdtr:硬件流控
interCharTimeout:字符间隔超时

ser对象常用方法

ser.isOpen():查看端口是否被打开。
ser.open() :打开端口‘。
ser.close():关闭端口。
ser.read():从端口读字节数据。默认1个字节。
ser.read_all():从端口接收全部数据。
ser.write("hello"):向端口写数据。
ser.readline():读一行数据。
ser.readlines():读多行数据。
in_waiting():返回接收缓存中的字节数。
flush():等待所有数据写出。
flushInput():丢弃接收缓存中的所有数据。
flushOutput():终止当前写操作,并丢弃发送缓存中的数据。

封装参考

import serial
import serial.tools.list_ports

class Communication():

  #初始化
  def __init__(self,com,bps,timeout):
    self.port = com
    self.bps = bps
    self.timeout =timeout
    global Ret
    try:
      # 打开串口,并得到串口对象
       self.main_engine= serial.Serial(self.port,self.bps,timeout=self.timeout)
      # 判断是否打开成功
       if (self.main_engine.is_open):
        Ret = True
    except Exception as e:
      print("---异常---:", e)

  # 打印设备基本信息
  def Print_Name(self):
    print(self.main_engine.name) #设备名字
    print(self.main_engine.port)#读或者写端口
    print(self.main_engine.baudrate)#波特率
    print(self.main_engine.bytesize)#字节大小
    print(self.main_engine.parity)#校验位
    print(self.main_engine.stopbits)#停止位
    print(self.main_engine.timeout)#读超时设置
    print(self.main_engine.writeTimeout)#写超时
    print(self.main_engine.xonxoff)#软件流控
    print(self.main_engine.rtscts)#软件流控
    print(self.main_engine.dsrdtr)#硬件流控
    print(self.main_engine.interCharTimeout)#字符间隔超时

  #打开串口
  def Open_Engine(self):
    self.main_engine.open()

  #关闭串口
  def Close_Engine(self):
    self.main_engine.close()
    print(self.main_engine.is_open) # 检验串口是否打开

  # 打印可用串口列表
  @staticmethod
  def Print_Used_Com():
    port_list = list(serial.tools.list_ports.comports())
    print(port_list)





  #接收指定大小的数据
  #从串口读size个字节。如果指定超时,则可能在超时后返回较少的字节;如果没有指定超时,则会一直等到收完指定的字节数。
  def Read_Size(self,size):
    return self.main_engine.read(size=size)

  #接收一行数据
  # 使用readline()时应该注意:打开串口时应该指定超时,否则如果串口没有收到新行,则会一直等待。
  # 如果没有超时,readline会报异常。
  def Read_Line(self):
    return self.main_engine.readline()

  #发数据
  def Send_data(self,data):
    self.main_engine.write(data)

  #更多示例
  # self.main_engine.write(chr(0x06).encode("utf-8")) # 十六制发送一个数据
  # print(self.main_engine.read().hex()) # # 十六进制的读取读一个字节
  # print(self.main_engine.read())#读一个字节
  # print(self.main_engine.read(10).decode("gbk"))#读十个字节
  # print(self.main_engine.readline().decode("gbk"))#读一行
  # print(self.main_engine.readlines())#读取多行,返回列表,必须匹配超时(timeout)使用
  # print(self.main_engine.in_waiting)#获取输入缓冲区的剩余字节数
  # print(self.main_engine.out_waiting)#获取输出缓冲区的字节数
  # print(self.main_engine.readall())#读取全部字符。

  #接收数据
  #一个整型数据占两个字节
  #一个字符占一个字节

  def Recive_data(self,way):
    # 循环接收数据,此为死循环,可用线程实现
    print("开始接收数据:")
    while True:
      try:
        # 一个字节一个字节的接收
        if self.main_engine.in_waiting:
          if(way == 0):
            for i in range(self.main_engine.in_waiting):
              print("接收ascii数据:"+str(self.Read_Size(1)))
              data1 = self.Read_Size(1).hex()#转为十六进制
              data2 = int(data1,16)#转为十进制
              if (data2 == "exit"): # 退出标志
                break
              else:
                 print("收到数据十六进制:"+data1+" 收到数据十进制:"+str(data2))
          if(way == 1):
            #整体接收
            # data = self.main_engine.read(self.main_engine.in_waiting).decode("utf-8")#方式一
            data = self.main_engine.read_all()#方式二
            if (data == "exit"): # 退出标志
              break
            else:
               print("接收ascii数据:", data)
      except Exception as e:
        print("异常报错:",e)


Communication.Print_Used_Com()
Ret =False #是否创建成功标志

Engine1 = Communication("com12",115200,0.5)
if (Ret):
  Engine1.Recive_data(0)
while(1)
  {
   //发送测试
   uint8_t a = 61;
   delayms(300);
   printf("%c", a);
}
开始接收数据:
接收ascii数据:b'='
收到数据十六进制:3d 收到数据十进制:61

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python的Django框架中的select_related函数对QuerySet 查询的优化
Apr 01 Python
Windows下python2.7.8安装图文教程
May 26 Python
python中set()函数简介及实例解析
Jan 09 Python
python获取url的返回信息方法
Dec 17 Python
python Tcp协议发送和接收信息的例子
Jul 22 Python
python实现操作文件(文件夹)
Oct 31 Python
详解python中docx库的安装过程
Nov 08 Python
Python使用pymysql模块操作mysql增删改查实例分析
Dec 19 Python
解决Keras 与 Tensorflow 版本之间的兼容性问题
Feb 07 Python
python入门之基础语法学习笔记
Feb 08 Python
Python netmiko模块的使用
Feb 14 Python
Python3.7安装PyQt5 运行配置Pycharm的详细教程
Oct 15 Python
Python根据服务获取端口号的方法
Sep 25 #Python
Python提取PDF内容的方法(文本、图像、线条等)
Sep 25 #Python
python使用 request 发送表单数据操作示例
Sep 25 #Python
Python实现PyPDF2处理PDF文件的方法示例
Sep 25 #Python
python mqtt 客户端的实现代码实例
Sep 25 #Python
python实现的登录与提交表单数据功能示例
Sep 25 #Python
python 利用pyttsx3文字转语音过程详解
Sep 25 #Python
You might like
基于ubuntu下nginx+php+mysql安装配置的具体操作步骤
2013/04/28 PHP
PHP中使用SimpleXML检查XML文件结构实例
2015/01/07 PHP
php安装dblib扩展,连接mssql的具体步骤
2017/03/02 PHP
Laravel jwt 多表(多用户端)验证隔离的实现
2019/12/18 PHP
Prototype 学习 Prototype对象
2009/07/12 Javascript
Notify - 基于jquery的消息通知插件
2011/10/18 Javascript
js禁止document element对象选中文本实现代码
2013/03/21 Javascript
JavaScript获取网页中第一个图片id的方法
2015/04/03 Javascript
js关于getImageData跨域问题的解决方法
2016/10/14 Javascript
js中string和number类型互转换技巧(分享)
2016/11/28 Javascript
js实现二级导航功能
2017/03/03 Javascript
详解组件库的webpack构建速度优化
2018/06/18 Javascript
Vue.js项目中管理每个页面的头部标签的两种方法
2018/06/25 Javascript
微信小程序methods中定义的方法互相调用的实例代码
2018/08/07 Javascript
layui 监听表格复选框选中值的方法
2018/08/15 Javascript
Vue中UI组件库之Vuex与虚拟服务器初识
2019/05/07 Javascript
electron实现静默打印的示例代码
2019/08/12 Javascript
在weex中愉快的使用scss的方法步骤
2020/01/02 Javascript
vue treeselect获取当前选中项的label实例
2020/08/31 Javascript
JS实现京东商品分类侧边栏
2020/12/11 Javascript
[01:59][TI9趣味视频] 全明星赛奖励
2019/08/23 DOTA
采用python实现简单QQ单用户机器人的方法
2014/07/03 Python
17个Python小技巧分享
2015/01/23 Python
线程和进程的区别及Python代码实例
2015/02/04 Python
Python 3.x 连接数据库示例(pymysql 方式)
2017/01/19 Python
Python实现Windows和Linux之间互相传输文件(文件夹)的方法
2017/05/08 Python
利用python模拟实现POST请求提交图片的方法
2017/07/25 Python
详解python string类型 bytes类型 bytearray类型
2017/12/16 Python
python查看模块安装位置的方法
2018/10/16 Python
一款纯css3制作的2015年元旦雪人动画特效教程
2014/12/29 HTML / CSS
html5使用Canvas绘图的使用方法
2017/11/21 HTML / CSS
移动HTML5前端框架—MUI的使用
2017/12/18 HTML / CSS
服装厂厂长岗位职责
2013/12/27 职场文书
青年文明号复核材料
2014/02/11 职场文书
2014年度安全生产目标管理责任书
2014/07/25 职场文书
python代码实现备忘录案例讲解
2021/07/26 Python