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 Web服务器Tornado使用小结
May 06 Python
Python3实现带附件的定时发送邮件功能
Dec 22 Python
用Python+OpenCV对比图像质量的几种方法
Jul 15 Python
python3.6中@property装饰器的使用方法示例
Aug 17 Python
python程序 线程队列queue使用方法解析
Sep 23 Python
简单了解python字符串前面加r,u的含义
Dec 26 Python
python 已知一个字符,在一个list中找出近似值或相似值实现模糊匹配
Feb 29 Python
python中sklearn的pipeline模块实例详解
May 21 Python
Python获取excel内容及相关操作代码实例
Aug 10 Python
详解Anaconda 的安装教程
Sep 23 Python
Kmeans均值聚类算法原理以及Python如何实现
Sep 26 Python
Python自动化测试PO模型封装过程详解
Jun 22 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
php从数组中随机抽取一些元素的代码
2012/11/05 PHP
PHP连接MySQL查询结果中文显示乱码解决方法
2013/10/25 PHP
PHP基本语法实例总结
2016/09/09 PHP
JS防止用户多次提交的简单代码
2013/08/01 Javascript
javascript内存管理详细解析
2013/11/11 Javascript
javascript模拟命名空间
2015/04/17 Javascript
学习JavaScript设计模式(接口)
2015/11/26 Javascript
javascript 继承学习心得总结
2016/03/17 Javascript
JS解决iframe之间通信和自适应高度的问题
2016/08/24 Javascript
关于Node.js中Buffer的一些你可能不知道的用法
2017/03/28 Javascript
laravel5.4+vue+element简单搭建的示例代码
2017/08/29 Javascript
JavaScript实现简单生成随机颜色的方法
2017/09/21 Javascript
动态统计当前输入内容的字节、字符数的实例详解
2017/10/27 Javascript
vue-cli 打包后提交到线上出现 "Uncaught SyntaxError:Unexpected token" 报错
2018/11/06 Javascript
浅谈Vue开发人员的7个最好的VSCode扩展
2021/01/20 Vue.js
python中self原理实例分析
2015/04/30 Python
Python设计模式编程中Adapter适配器模式的使用实例
2016/03/02 Python
Python 比较两个数组的元素的异同方法
2017/08/17 Python
python爬虫 正则表达式使用技巧及爬取个人博客的实例讲解
2017/10/20 Python
Python 字符串换行的多种方式
2018/09/06 Python
python3+PyQt5 使用三种不同的简便项窗口部件显示数据的方法
2019/06/17 Python
Django 开发环境配置过程详解
2019/07/18 Python
python super函数使用方法详解
2020/02/14 Python
python 计算概率密度、累计分布、逆函数的例子
2020/02/25 Python
python实现快递价格查询系统
2020/03/03 Python
python3.6使用SMTP协议发送邮件
2020/05/20 Python
Opencv求取连通区域重心实例
2020/06/04 Python
关于python tushare Tkinter构建的简单股票可视化查询系统(Beta v0.13)
2020/10/19 Python
KOHLER科勒美国官网:国际著名卫浴橱柜领先品牌
2020/06/27 全球购物
优质飞蝇钓和渔具:RiverBum
2020/05/10 全球购物
2014年控辍保学工作总结
2014/12/08 职场文书
2015年党员个人自我评价
2015/03/03 职场文书
2015年学生资助工作总结
2015/05/25 职场文书
预备党员入党感言
2015/08/01 职场文书
《最后一头战象》读后感:动物也有感情
2020/01/02 职场文书
Python包管理工具pip的15 个使用小技巧
2021/05/17 Python