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写的一个简单DNS服务器实例
Jun 04 Python
Python聊天室实例程序分享
Jan 05 Python
python XlsxWriter模块创建aexcel表格的实例讲解
May 03 Python
解决nohup重定向python输出到文件不成功的问题
May 11 Python
详解python单元测试框架unittest
Jul 02 Python
Python socket实现的简单通信功能示例
Aug 21 Python
详解python和matlab的优势与区别
Jun 28 Python
手把手教你Python yLab的绘制折线图的画法
Oct 23 Python
使用 tf.nn.dynamic_rnn 展开时间维度方式
Jan 21 Python
python和pywin32实现窗口查找、遍历和点击的示例代码
Apr 01 Python
python 通过pip freeze、dowload打离线包及自动安装的过程详解(适用于保密的离线环境
Dec 14 Python
python 详解turtle画爱心代码
Feb 15 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
数据库的日期格式转换
2006/10/09 PHP
浅析Dos下运行php.exe,出现没有找到php_mbstring.dll 错误的解决方法
2013/06/29 PHP
php实现和c#一致的DES加密解密实例
2017/07/24 PHP
JavaScript对象、属性、事件手册集合方便查询
2010/07/04 Javascript
jQuery 验证插件 Web前端设计模式(asp.net)
2010/10/17 Javascript
jQuery 快速结束当前正在执行的动画
2013/11/20 Javascript
JS判断对象是否存在的10种方法总结
2013/12/23 Javascript
IE与FireFox的JavaScript兼容问题解决办法
2013/12/31 Javascript
前端轻量级MVC框架CanJS详解
2014/09/26 Javascript
JS自动倒计时30秒后按钮才可用(两种场景)
2015/08/31 Javascript
基于javascript实现按圆形排列DIV元素(二)
2016/12/02 Javascript
浅谈Vue的基本应用
2016/12/27 Javascript
javascript实现滑动解锁功能
2017/03/22 Javascript
Vue 表单控件绑定的实现示例
2017/08/11 Javascript
浅谈Vue.js应用的四种AJAX请求数据模式
2017/08/30 Javascript
jQuery替换节点元素的操作方法
2018/03/18 jQuery
对vue下点击事件传参和不传参的区别详解
2018/09/15 Javascript
vue如何实现自定义底部菜单栏
2019/07/01 Javascript
微信小程序如何获取群聊的openGid以及名称详解
2019/07/17 Javascript
如何优雅地在Node应用中进行错误异常处理
2019/11/25 Javascript
vue学习笔记之过滤器的基本使用方法实例分析
2020/02/01 Javascript
基于vue项目设置resolves.alias: '@'路径并适配webstorm
2020/12/02 Vue.js
初步剖析C语言编程中的结构体
2016/01/16 Python
python selenium自动上传有赞单号的操作方法
2018/07/05 Python
浅谈python函数调用返回两个或多个变量的方法
2019/01/23 Python
python 阶乘累加和的实例
2019/02/01 Python
浅谈对pytroch中torch.autograd.backward的思考
2019/12/27 Python
HTML5地理定位与第三方工具百度地图的应用
2016/11/17 HTML / CSS
保安员岗位职责
2013/11/17 职场文书
应届毕业生个人自荐信范文
2013/11/30 职场文书
2014公安机关纪律作风整顿思想汇报
2014/09/13 职场文书
英语辞职信怎么写
2015/02/28 职场文书
2015年出纳年终工作总结
2015/05/14 职场文书
Nginx 反向代理解决跨域问题多种情况分析
2022/01/18 Servers
javascript的var与let,const之间的区别详解
2022/02/18 Javascript
Java时间工具类Date的常用处理方法
2022/05/25 Java/Android