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处理PHP数组文本文件实例
Sep 18 Python
Python实现XML文件解析的示例代码
Feb 05 Python
使用Python对微信好友进行数据分析
Jun 27 Python
详解python3 + Scrapy爬虫学习之创建项目
Apr 12 Python
Django框架搭建的简易图书信息网站案例
May 25 Python
pandas dataframe的合并实现(append, merge, concat)
Jun 24 Python
Python3中的最大整数和最大浮点数实例
Jul 09 Python
Python的条件锁与事件共享详解
Sep 12 Python
使用NumPy读取MNIST数据的实现代码示例
Nov 20 Python
python 类之间的参数传递方式
Dec 20 Python
在django中使用post方法时,需要增加csrftoken的例子
Mar 13 Python
Pymysql实现往表中插入数据过程解析
Jun 02 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
2020年4月新番动漫目录 官方宣布4月播出的作品一览
2020/03/08 日漫
php 将bmp图片转为jpg等其他任意格式的图片
2009/06/29 PHP
PHP遍历数组的几种方法
2012/03/22 PHP
codeigniter发送邮件并打印调试信息的方法
2015/03/21 PHP
用ASP将SQL搜索出来的内容导出为TXT的代码
2007/07/27 Javascript
关于window.pageYOffset和document.documentElement.scrollTop
2011/04/05 Javascript
解决extjs grid 不随窗口大小自适应的改变问题
2014/01/26 Javascript
JS选中checkbox后获取table内一行TD所有数据的方法
2015/07/01 Javascript
基于vue的下拉刷新指令和滚动刷新指令
2016/12/23 Javascript
Javascript中document.referrer隐藏来源的方法
2017/01/16 Javascript
AngularJS之自定义服务详解(factory、service、provider)
2017/04/14 Javascript
浅谈webpack对样式的处理
2018/01/05 Javascript
JavaScript监听一个DOM元素大小变化
2020/04/26 Javascript
Array.filter中如何正确使用Async
2020/11/04 Javascript
[08:04]TI4西雅图DOTA2前线报道 海涛探访各路人马
2014/07/09 DOTA
定制FileField中的上传文件名称实例
2017/08/23 Python
python的文件操作方法汇总
2017/11/10 Python
浅谈Django学习migrate和makemigrations的差别
2018/01/18 Python
快速排序的四种python实现(推荐)
2019/04/03 Python
如何基于Python创建目录文件夹
2019/12/31 Python
Python编写memcached启动脚本代码实例
2020/08/14 Python
Python pathlib模块使用方法及实例解析
2020/10/05 Python
canvas基础之图形验证码的示例
2018/01/02 HTML / CSS
LODI女鞋在线商店:阿利坎特的鞋类品牌
2019/02/15 全球购物
英国家居用品和床上用品零售商:P&B Home
2020/01/16 全球购物
抽象类和接口的区别
2012/09/19 面试题
新闻学专业应届生求职信
2013/11/08 职场文书
关于抽烟的检讨书
2014/02/25 职场文书
《春晓》教学反思
2014/04/20 职场文书
幼儿园中班区域活动总结
2014/07/09 职场文书
办理房产证委托书
2014/09/18 职场文书
企业宣传稿范文
2015/07/23 职场文书
2015年团委副书记工作总结
2015/07/23 职场文书
趣味运动会口号
2015/12/24 职场文书
在Windows Server 2012上安装 .NET Framework 3.5 所遇到的问题
2022/04/29 Servers
讲解Python实例练习逆序输出字符串
2022/05/06 Python