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定时器使用示例分享
Feb 16 Python
Python通过正则表达式选取callback的方法
Jul 18 Python
详解python eval函数的妙用
Nov 16 Python
python八大排序算法速度实例对比
Dec 06 Python
python如何去除字符串中不想要的字符
Jul 05 Python
opencv改变imshow窗口大小,窗口位置的方法
Apr 02 Python
Python实现的远程文件自动打包并下载功能示例
Jul 12 Python
Python调用scp向服务器上传文件示例
Dec 22 Python
PyTorch实现ResNet50、ResNet101和ResNet152示例
Jan 14 Python
有趣的Python图片制作之如何用QQ好友头像拼接出里昂
Apr 22 Python
Python3 + Appium + 安卓模拟器实现APP自动化测试并生成测试报告
Jan 27 Python
如何在Python项目中引入日志
May 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实现对文本数据库的常用操作方法实例演示
2014/07/04 PHP
js 判断checkbox是否选中的操作方法
2012/11/09 Javascript
简洁Ajax函数处理(示例代码)
2013/11/15 Javascript
日常收集整理的JavaScript常用函数方法
2015/12/10 Javascript
jQuery+formdata实现上传进度特效遇到的问题
2016/02/24 Javascript
js实现页面a向页面b传参的方法
2016/05/29 Javascript
ES6 Promise对象概念与用法分析
2017/04/01 Javascript
详解nodeJS之路径PATH模块
2017/05/31 NodeJs
Webpack如何引入bootstrap的方法
2017/06/17 Javascript
JS实现移动端判断上拉和下滑功能
2017/08/07 Javascript
BootstrapTable加载按钮功能实例代码详解
2017/09/22 Javascript
JavaScript实现的鼠标跟随特效示例【2则实例】
2018/12/22 Javascript
详解Vue前端对axios的封装和使用
2019/04/01 Javascript
Vue组件系列开发之模态框
2019/04/18 Javascript
extjs图形绘制之饼图实现方法分析
2020/03/06 Javascript
Laravel 如何在blade文件中使用Vue组件的示例代码
2020/06/28 Javascript
[05:31]DOTA2英雄梦之声_第08期_莉娜
2014/06/23 DOTA
使用Python标准库中的wave模块绘制乐谱的简单教程
2015/03/30 Python
详解Python开发中如何使用Hook技巧
2017/11/01 Python
Python实现找出数组中第2大数字的方法示例
2018/03/26 Python
python 简单照相机调用系统摄像头实现方法 pygame
2018/08/03 Python
解决python通过cx_Oracle模块连接Oracle乱码的问题
2018/10/18 Python
Laravel+Dingo/Api 自定义响应的实现
2019/02/17 Python
Selenium常见异常解析及解决方案示范
2020/04/10 Python
python函数调用,循环,列表复制实例
2020/05/03 Python
HTML5 source标签:媒介元素定义媒介资源
2018/01/29 HTML / CSS
英国网络托管和域名领导者:Web Hosting UK
2017/10/15 全球购物
Electric官网:美国高级眼镜和配件品牌
2020/06/04 全球购物
Oracle的内存结构(Memory structures)
2015/06/10 面试题
毕业生动漫设计求职信
2013/10/11 职场文书
小车司机岗位职责
2013/11/25 职场文书
超市中秋节活动方案
2014/02/12 职场文书
酒店保安领班职务说明书
2014/03/04 职场文书
退休教师欢送会主持词
2014/03/31 职场文书
交通事故委托书范本(2篇)
2014/09/21 职场文书
Android Rxjava3 使用场景详解
2022/04/07 Java/Android