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 相关文章推荐
go和python调用其它程序并得到程序输出
Feb 10 Python
Python入门篇之正则表达式
Oct 20 Python
Python去除列表中重复元素的方法
Mar 20 Python
利用Python的Django框架生成PDF文件的教程
Jul 22 Python
python实现教务管理系统
Mar 12 Python
用Python PIL实现几个简单的图片特效
Jan 18 Python
Django框架视图函数设计示例
Jul 29 Python
通过python检测字符串的字母
Feb 18 Python
Python 格式化打印json数据方法(展开状态)
Feb 27 Python
对Matlab中共轭、转置和共轭装置的区别说明
May 11 Python
python设置表格边框的具体方法
Jul 17 Python
python线程里哪种模块比较适合
Aug 02 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快递单号查询接口使用示例
2014/05/05 PHP
跟我学Laravel之安装Laravel
2014/10/15 PHP
php获取本机真实IP地址实例代码
2016/03/31 PHP
laravel 框架结合关联查询 when()用法分析
2019/11/22 PHP
php 使用ActiveMQ发送消息,与处理消息操作示例
2020/02/23 PHP
Javascript 更新 JavaScript 数组的 uniq 方法
2008/01/23 Javascript
js 获取浏览器高度和宽度值(多浏览器)
2009/09/02 Javascript
完美解决AJAX跨域问题
2013/11/01 Javascript
JavaScript通过元素的ID和name设置样式
2014/07/08 Javascript
jQuery中ajax的load()方法用法实例
2014/12/26 Javascript
JS实现很酷的水波文字特效实例
2015/02/26 Javascript
基于JS实现简单的样式切换效果代码
2015/09/04 Javascript
如何利用AngularJS打造一款简单Web应用
2015/12/05 Javascript
jquery层级选择器的实现(匹配后代元素div)
2016/09/05 Javascript
Angular的模块化(代码分享)
2016/12/26 Javascript
jQuery Validate表单验证插件的基本使用方法及功能拓展
2017/01/04 Javascript
JS二级菜单不同实现方法分析【4种方法】
2018/12/21 Javascript
微信小程序获取当前位置和城市名
2019/11/13 Javascript
js实现日历
2020/11/07 Javascript
Python中为feedparser设置超时时间避免堵塞
2014/09/28 Python
python中list循环语句用法实例
2014/11/10 Python
用Python编写一个简单的CS架构后门的方法
2018/11/20 Python
python+selenium实现自动抢票功能实例代码
2018/11/23 Python
浅谈Python接口对json串的处理方法
2018/12/19 Python
python 使用正则表达式按照多个空格分割字符的实例
2018/12/20 Python
Keras Convolution1D与Convolution2D区别说明
2020/05/22 Python
pycharm如何使用anaconda中的各种包(操作步骤)
2020/07/31 Python
python操作ini类型配置文件的实例教程
2020/10/30 Python
技术总监个人的自我评价范文
2013/12/18 职场文书
本科生自荐信
2014/06/18 职场文书
学校感恩节活动策划方案
2014/10/06 职场文书
医德医风个人工作总结2014
2014/11/14 职场文书
2015教师年度考核评语
2015/03/25 职场文书
公司开会通知
2015/04/20 职场文书
《世界多美呀》教学反思
2016/02/22 职场文书
JS实现数组去重的11种方法总结
2022/04/04 Javascript