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装饰器使用示例及实际应用例子
Mar 06 Python
详解Python的Flask框架中生成SECRET_KEY密钥的方法
Jun 07 Python
Python实现简单的HttpServer服务器示例
Sep 25 Python
pandas中的DataFrame按指定顺序输出所有列的方法
Apr 10 Python
Python实现字符型图片验证码识别完整过程详解
May 10 Python
Python 元组操作总结
Sep 18 Python
Python操作MySQL数据库实例详解【安装、连接、增删改查等】
Jan 17 Python
pytorch torchvision.ImageFolder的用法介绍
Feb 20 Python
Python处理PDF与CDF实例
Feb 26 Python
keras 两种训练模型方式详解fit和fit_generator(节省内存)
Jul 03 Python
python 5个实用的技巧
Sep 27 Python
Vs Code中8个好用的python 扩展插件
Oct 12 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根据分类合并数组的方法实例详解
2013/11/06 PHP
DEDE实现转跳属性文档在模板上调用出转跳地址
2016/11/04 PHP
使用Zttp简化Guzzle 调用
2017/07/02 PHP
JavaScript arguments 多参传值函数
2010/10/24 Javascript
jquery插件jTimer(jquery定时器)使用方法
2013/12/23 Javascript
jQuery自定义事件的简单实现代码
2014/01/27 Javascript
简单纯js实现点击切换TAB标签实例
2015/08/23 Javascript
史上最全JavaScript数组去重的十种方法(推荐)
2017/08/17 Javascript
vue计算属性时v-for处理数组时遇到的一个bug问题
2018/01/21 Javascript
基于datepicker定义自己的angular时间组件的示例
2018/03/14 Javascript
layer弹出子iframe层父子页面传值的实现方法
2018/11/22 Javascript
angular6的table组件开发的实现示例
2018/12/26 Javascript
js使用cookie实现记住用户名功能示例
2019/06/13 Javascript
Node.js学习之内置模块fs用法示例
2020/01/22 Javascript
JS实现时间校验的代码
2020/05/25 Javascript
Vue路由 重定向和别名的区别说明
2020/09/09 Javascript
[30:00]完美世界DOTA2联赛PWL S2 Rebirth vs LBZS 第二场 11.28
2020/12/01 DOTA
Python中DJANGO简单测试实例
2015/05/11 Python
详解Python的Django框架中的模版相关知识
2015/07/15 Python
Python利用QQ邮箱发送邮件的实现方法(分享)
2017/06/09 Python
Python3.5内置模块之time与datetime模块用法实例分析
2019/04/27 Python
python 弹窗提示警告框MessageBox的实例
2019/06/18 Python
pyqt5 删除layout中的所有widget方法
2019/06/25 Python
简单了解python的break、continue、pass
2019/07/08 Python
tesserocr与pytesseract模块的使用方法解析
2019/08/30 Python
Django对接支付宝实现支付宝充值金币功能示例
2019/12/17 Python
pycharm双击无响应(打不开问题解决办法)
2020/01/10 Python
关于python中的xpath解析定位
2020/03/06 Python
Jmeter HTTPS接口测试证书导入过程图解
2020/07/22 Python
威盛公司软件C++工程师笔试题面试题
2012/07/16 面试题
下面这个程序执行后会有什么错误或者效果
2014/11/03 面试题
令人印象深刻的自荐信
2014/05/25 职场文书
环境科学专业求职信
2014/08/04 职场文书
税务干部群众路线教育实践活动自我剖析材料
2014/09/21 职场文书
大学运动会通讯稿
2015/07/18 职场文书
浅谈css实现背景颜色半透明的两种方法
2021/12/06 HTML / CSS