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中通过threading模块定义和调用线程的方法
Jul 12 Python
Python构建网页爬虫原理分析
Dec 19 Python
Python入门必须知道的11个知识点
Mar 21 Python
python实现图片识别汽车功能
Nov 30 Python
python实现二维数组的对角线遍历
Mar 02 Python
Python 的字典(Dict)是如何存储的
Jul 05 Python
对python中UDP,socket的使用详解
Aug 22 Python
python 变量初始化空列表的例子
Nov 28 Python
python不相等的两个字符串的 if 条件判断为True详解
Mar 12 Python
jupyter 中文乱码设置编码格式 避免控制台输出的解决
Apr 20 Python
Python实现爬取网页中动态加载的数据
Aug 17 Python
python gui开发——制作抖音无水印视频下载工具(附源码)
Feb 07 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 CLI实现简单的数据库实时监控调度
2009/07/01 PHP
php获取网页标题和内容函数(不包含html标签)
2014/02/03 PHP
PHP数组排序之sort、asort与ksort用法实例
2014/09/08 PHP
php获取指定范围内最接近数的方法
2015/06/02 PHP
动态表单验证的操作方法和TP框架里面的ajax表单验证
2017/07/19 PHP
php微信开发之关键词回复功能
2018/06/13 PHP
用jscript实现新建和保存一个word文档
2007/06/15 Javascript
FF IE兼容性的修改小结
2009/09/02 Javascript
jquery中使用ajax获取远程页面信息
2011/11/13 Javascript
点击A元素触发B元素的事件在IE8下会识别成A元素
2014/09/04 Javascript
浅析javascript 定时器
2014/12/23 Javascript
实例剖析AngularJS框架中数据的双向绑定运用
2016/03/04 Javascript
vue2+el-menu实现路由跳转及当前项的设置方法实例
2017/11/07 Javascript
node.js中axios使用心得总结
2017/11/29 Javascript
js序列化和反序列化的使用讲解
2019/01/19 Javascript
解决layer弹出层msg的文字不显示的问题
2019/09/11 Javascript
jquery 键盘事件 keypress() keydown() keyup()用法总结
2019/10/23 jQuery
vue element 中的table动态渲染实现(动态表头)
2019/11/21 Javascript
nodejs nedb 封装库与使用方法示例
2020/02/06 NodeJs
js实现弹窗猜数字游戏
2020/11/26 Javascript
Python 的描述符 descriptor详解
2016/02/27 Python
带你了解python装饰器
2017/06/15 Python
解决Python安装cryptography报错问题
2020/09/03 Python
令人啧啧称赞的经理推荐信
2013/11/07 职场文书
自我评价怎么写正确呢?
2013/12/02 职场文书
资产经营总监岗位职责
2013/12/04 职场文书
高中考试作弊检讨书
2014/01/14 职场文书
小学生开学感言
2014/02/28 职场文书
技校毕业生自荐书
2014/05/23 职场文书
婚礼女方父母答谢词
2015/01/04 职场文书
毕业论文致谢格式模板
2015/05/14 职场文书
钓鱼岛事件感想
2015/08/11 职场文书
导游词之河北白洋淀
2020/01/15 职场文书
完美处理python与anaconda环境变量的冲突问题
2021/04/07 Python
详解vue身份认证管理和租户管理
2021/05/25 Vue.js
pandas数值排序的实现实例
2021/07/25 Python