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学习之asyncore模块用法实例教程
Sep 29 Python
Python正则表达式匹配ip地址实例
Oct 09 Python
Python实现把xml或xsl转换为html格式
Apr 08 Python
Python编程之多态用法实例详解
May 19 Python
Python学习小技巧之列表项的排序
May 20 Python
Python数据结构与算法之图的最短路径(Dijkstra算法)完整实例
Dec 12 Python
python学生信息管理系统(完整版)
Apr 05 Python
python3 selenium自动化 下拉框定位的例子
Aug 23 Python
基于python纯函数实现井字棋游戏
May 27 Python
利用Vscode进行Python开发环境配置的步骤
Jun 22 Python
python3 循环读取excel文件并写入json操作
Jul 14 Python
Python Selenium自动化获取页面信息的方法
Aug 31 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
不要轻信 PHP_SELF的安全问题
2009/09/05 PHP
PHP utf-8编码问题,utf8编码,数据库乱码,页面显示输出乱码
2013/04/08 PHP
zf框架的session会话周期及次数限制使用示例
2014/03/13 PHP
Zend Framework实现多服务器共享SESSION数据的方法
2016/03/22 PHP
使用jQuery解决IE与FireFox下createElement方法的差异
2013/11/14 Javascript
jQuery结合AJAX之在页面滚动时从服务器加载数据
2015/06/30 Javascript
基于BootStrap的Metronic框架实现页面链接收藏夹功能按钮移动收藏记录(使用Sortable进行拖动排序)
2016/08/29 Javascript
完美解决js传递参数中加号和&amp;号自动改变的方法
2016/10/11 Javascript
ES6教程之for循环和Map,Set用法分析
2017/04/10 Javascript
20行JS代码实现网页刮刮乐效果
2017/06/23 Javascript
jQuery Datatable 多个查询条件自定义提交事件(推荐)
2017/08/24 jQuery
JavaScript实现换肤功能
2017/09/15 Javascript
打字效果动画的4种实现方法(超简单)
2017/10/18 Javascript
微信小程序提交form操作示例
2018/12/30 Javascript
jQuery移动端跑马灯抽奖特效升级版(抽奖概率固定)实现方法
2019/01/18 jQuery
javascript关于“时间”的一次探索
2019/07/24 Javascript
vue中uni-app 实现小程序登录注册功能
2019/10/12 Javascript
JS实现可视化音频效果的实例代码
2020/01/16 Javascript
jquery实现聊天机器人
2020/02/08 jQuery
element-ui中dialog弹窗关闭按钮失效的解决
2020/09/22 Javascript
Python 多线程实例详解
2017/03/25 Python
浅析python打包工具distutils、setuptools
2018/04/20 Python
PyQt5实现简单数据标注工具
2019/03/18 Python
pyqt5与matplotlib的完美结合实例
2019/06/21 Python
Python学习笔记之Django创建第一个数据库模型的方法
2019/08/07 Python
pytorch 共享参数的示例
2019/08/17 Python
css3打造一款漂亮的卡哇伊按钮
2013/03/20 HTML / CSS
美国面料纺织品商城:Fabric.com
2017/06/28 全球购物
腾讯技术类校园招聘笔试试题
2014/05/06 面试题
2014幼儿园教师师德师风演讲稿
2014/09/10 职场文书
教师工作失职检讨书
2014/09/18 职场文书
英语复习计划
2015/01/19 职场文书
给下属加薪申请报告
2015/05/15 职场文书
2015年大班保育员工作总结
2015/05/18 职场文书
立秋之描写立秋的作文(五年级)
2019/08/08 职场文书
Matplotlib可视化之添加让统计图变得简单易懂的注释
2021/06/11 Python