Python Serial串口基本操作(收发数据)


Posted in Python onNovember 06, 2020

1、需要模块以及测试工具

模块名:pyserial

使用命令下载:python -m pip install pyserial

串口调试工具:sscom5.13.1.exe

2、导入模块

import serial

3、打开串口

直接通过new一个Serial()的实例即可打开

返回实例

# encoding=utf-8
import serial
if __name__ == '__main__':
  com = serial.Serial('COM3', 115200)
  print com

运行结果

Serial<id=0x3518940, open=True>(port='COM3', baudrate=115200, bytesize=8, parity='N', stopbits=1, timeout=None, xonxoff=False, rtscts=False, dsrdtr=False)

4、发送数据

函数名write()

返回值为发送成功的字节数

# encoding=utf-8
import serial
if __name__ == '__main__':
  com = serial.Serial('COM3', 115200)
  success_bytes = com.write('This is data for test')
  print success_bytes

运行结果

21

串口工具界面

Python Serial串口基本操作(收发数据)

5、接收数据(接收固定长度数据)

函数名为read(size=1)

接收size单位的字符,是阻塞的,不接收到就一直等待接收,除非设置了超时时间(未设置该示例)

# encoding=utf-8
import serial
if __name__ == '__main__':
  com = serial.Serial('COM3', 115200)
  data = com.read(10)
  print data

运行结果

123456789a

串口工具界面

Python Serial串口基本操作(收发数据)

6、接收数据(超时时间内一直接收)

函数名为read(size=1)

参数为接收的长度,默认为1,一般传入inWaiting(),它表示监测接收的字符串长度

配合While可以一直接收

# encoding=utf-8
import serial
import time

if __name__ == '__main__':
  com = serial.Serial('COM3', 115200)
  over_time = 30
  start_time = time.time()
  while True:
    end_time = time.time()
    if end_time - start_time < over_time:
      data = com.read(com.inWaiting())
      data = str(data)
      if data != '':
        print data

运行结果

111
222
aaa
bbb
1a2b3c4d

串口工具界面

Python Serial串口基本操作(收发数据)

7、封装为类

# -*- encoding=utf-8 -*-
import serial
import time

import WriteLog


class COM:
  def __init__(self, port, baud):
    self.port = port
    self.baud = int(baud)
    self.open_com = None
    self.log = WriteLog.WriteLog('ITC_LOG.LOG')
    self.get_data_flag = True
    self.real_time_data = ''

  # return real time data form com
  def get_real_time_data(self):
    return self.real_time_data

  def clear_real_time_data(self):
    self.real_time_data = ''

  # set flag to receive data or not
  def set_get_data_flag(self, get_data_flag):
    self.get_data_flag = get_data_flag

  def open(self):
    try:
      self.open_com = serial.Serial(self.port, self.baud)
    except Exception as e:
      self.log.error('Open com fail:{}/{}'.format(self.port, self.baud))
      self.log.error('Exception:{}'.format(e))

  def close(self):
    if self.open_com is not None and self.open_com.isOpen:
      self.open_com.close()

  def send_data(self, data):
    if self.open_com is None:
      self.open()
    success_bytes = self.open_com.write(data.encode('UTF-8'))
    return success_bytes

  def get_data(self, over_time=30):
    all_data = ''
    if self.open_com is None:
      self.open()
    start_time = time.time()
    while True:
      end_time = time.time()
      if end_time - start_time < over_time and self.get_data_flag:
        data = self.open_com.read(self.open_com.inWaiting())
        # data = self.open_com.read() # read 1 size
        data = str(data)
        if data != '':
          self.log.info('Get data is:{}'.format(data))
          all_data = all_data + data
          print data
          self.real_time_data = all_data
      else:
        self.set_get_data_flag(True)
        break
    return all_data
if __name__ == '__main__':
  pass
  com = COM('com3', 115200)
  # com.open()
  print com.send_data('data')
  com.get_data(50)
  com.close()

8、对于一次函数说明(百度看到,并未测试)

readall():读取全部字符,是阻塞的,除非接收的字符串以EOF结尾或者超出缓冲区,否则函数不会返回。一般要结合超时设置,设置串口的timeout参数

Readline():读取一行,以/n结束,要是没有/n就一直读,阻塞。

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

Python 相关文章推荐
Python中装饰器兼容加括号和不加括号的写法详解
Jul 05 Python
分享给Python新手们的几道简单练习题
Sep 21 Python
Python基于win32ui模块创建弹出式菜单示例
May 09 Python
学生信息管理系统Python面向对象版
Jan 30 Python
Python使用sklearn库实现的各种分类算法简单应用小结
Jul 04 Python
解决Django Static内容不能加载显示的问题
Jul 28 Python
django创建最简单HTML页面跳转方法
Aug 16 Python
PyTorch中反卷积的用法详解
Dec 30 Python
Windows下实现将Pascal VOC转化为TFRecords
Feb 17 Python
Python中使用threading.Event协调线程的运行详解
May 02 Python
python实现简易名片管理系统
Apr 11 Python
深入理解python多线程编程
Apr 18 Python
python基于exchange函数发送邮件过程详解
Nov 06 #Python
Python Unittest原理及基本使用方法
Nov 06 #Python
python中的yield from语法快速学习
Nov 06 #Python
Python通过字典映射函数实现switch
Nov 06 #Python
Python使用grequests并发发送请求的示例
Nov 05 #Python
Python 实现图片转字符画的示例(静态图片,gif皆可)
Nov 05 #Python
Python中常用的os操作汇总
Nov 05 #Python
You might like
农民C键的运用技巧
2020/03/04 星际争霸
php 格式化数字的时候注意数字的范围
2010/04/13 PHP
CI框架实现框架前后端分离的方法详解
2016/12/30 PHP
PHP __call()方法实现委托示例
2019/05/20 PHP
Thinkphp5框架简单实现钩子(Hook)行为的方法示例
2019/09/03 PHP
学习YUI.Ext 第三天
2007/03/10 Javascript
javascript中获取选中对象的类型
2007/04/02 Javascript
通用JS事件写法实现代码
2009/01/07 Javascript
如何在一个页面显示多个百度地图
2013/04/07 Javascript
js控制文本框只输入数字和小数点的方法
2015/03/10 Javascript
JSON字符串转JSON对象
2015/07/31 Javascript
js实现超酷的照片墙展示效果图附源码下载
2015/10/08 Javascript
js编写贪吃蛇的小游戏
2020/08/24 Javascript
全屏js头像上传插件源码高清版
2016/03/29 Javascript
[原创]Bootstrap 中下拉菜单修改成鼠标悬停直接显示
2016/04/14 Javascript
AngularJS实现分页显示数据库信息
2016/07/01 Javascript
轻松掌握JavaScript装饰者模式
2016/08/27 Javascript
Javascript获取图片原始宽度和高度的方法详解
2016/09/20 Javascript
js HTML5多媒体影音播放
2016/10/17 Javascript
jQuery动态创建元素以及追加节点的实现方法
2016/10/20 Javascript
jquery css实现邮箱自动补全
2016/11/14 Javascript
js封装成插件_Canvas统计图插件编写实例
2017/09/12 Javascript
react写一个select组件的实现代码
2019/04/03 Javascript
解决VUE 在IE下出现ReferenceError: Promise未定义的问题
2020/11/07 Javascript
python登陆asp网站页面的实现代码
2015/01/14 Python
Python使用dis模块把Python反编译为字节码的用法详解
2016/06/14 Python
Python提取Linux内核源代码的目录结构实现方法
2016/06/24 Python
基于python+selenium自动健康打卡的实现代码
2021/01/13 Python
sklearn中的交叉验证的实现(Cross-Validation)
2021/02/22 Python
HTML5 Canvas 旋转风车绘制
2017/08/18 HTML / CSS
Anya Hindmarch官网:奢侈设计师手袋及配饰
2018/11/15 全球购物
StubHub中国:购买和出售全球活动门票
2020/01/01 全球购物
腾讯技术类校园招聘笔试试题
2014/05/06 面试题
2016机关干部作风建设心得体会
2016/01/21 职场文书
2019如何书写演讲稿?
2019/07/01 职场文书
Python标准库之typing的用法(类型标注)
2021/06/02 Python