嵌入式硬件篇---OpenMV串口流和缓冲区

ops/2025/2/11 18:43:43/

文章目录

  • 前言
  • 流和缓冲区
    • 1. 流(Stream)的含义
    • 2. 缓冲区(Buffer)的含义
    • 3. 流与缓冲区的协同工作
      • 数据发送流程
      • 数据接收流程
    • 4. 缓冲区管理的关键方法
      • 发送缓冲区管理
      • 接收缓冲区管理
      • 示例代码
    • 5. 流控制与缓冲区溢出预防
    • 6. 实际应用场景
      • 场景1:实时传感器数据传输
        • 需求
        • 实现
      • 场景2:高速图像传输
        • 需求
    • 总结
  • 总结


前言

以上就是今天要讲的内容,本文简单介绍了OpenMV的串口流和缓冲区


流和缓冲区

1. 流(Stream)的含义

定义

流 是一种抽象的数据传输模型,代表连续的数据流动。在UART通信中,数据通过串行接口字节流的形式逐位发送或接收

流强调数据的顺序性和连续性,类似于水流,数据按发送顺序依次到达接收端。

OpenMV_25">在OpenMV中的体现

  1. 发送流:通过UART的write()方法发送数据时,数据以流的形式逐字节传输。
python">uart.write(b'Hello World')  # 发送字节流
  1. 接收流:通过read()方法读取数据时,按接收顺序逐个字节处理
python">data = uart.read(10)  # 读取10个字节的流数据
  1. 特点
    异步传输:数据发送和接收不需要严格的时钟同步,仅依赖波特率
    实时性:数据流可实时处理,适用于传感器数据采集等场景。

2. 缓冲区(Buffer)的含义

定义

缓冲区 是硬件或软件中用于临时存储数据的内存区域。在UART通信中,缓冲区分为发送缓冲区和接收缓冲区

  1. 发送缓冲区:存储待发送的数据,由硬件逐步发送
  2. 接收缓冲区:存储已接收但尚未被程序读取的数据

OpenMV_49">在OpenMV中的实现

  1. 发送缓冲区:调用uart.write()时,数据首先写入发送缓冲区,由硬件异步发送。
python">uart.write(b'Data')  # 数据存入发送缓冲区后立即返回,不阻塞程序
  1. 接收缓冲区:当UART接收到数据时,字节暂存于接收缓冲区,直到通过read()读取。
python">if uart.any():  # 检查接收缓冲区是否有数据data = uart.read(uart.any())  # 读取全部缓冲区数据
  1. 缓冲区大小
    OpenMVUART默认缓冲区大小通常为256字节(具体取决于硬件型号)。

  2. 溢出风险:
    若接收缓冲区满,新数据将丢失。
    若发送缓冲区满,后续写入可能阻塞或丢失数据(取决于实现)

3. 流与缓冲区的协同工作

数据发送流程

  1. 程序调用uart.write(data),将数据写入发送缓冲区。
  2. 硬件按波特率从缓冲区逐字节发送数据。
  3. 发送完成后,缓冲区清空,准备下一批数据。

数据接收流程

  1. 硬件检测到UART信号,将接收的字节存入接收缓冲区。
  2. 程序通过uart.any()检查缓冲区中待读的字节数。
  3. 调用uart.read()从缓冲区读取数据,读取后缓冲区释放空间。

4. 缓冲区管理的关键方法

发送缓冲区管理

python">uart.write(data):将数据写入发送缓冲区,非阻塞操作。
uart.sendbreak():发送终止信号(如强制清空缓冲区)。

接收缓冲区管理

python">uart.any():返回接收缓冲区中的字节数。
uart.read(n):读取n个字节,若n超过缓冲区大小,则读取全部可用数据。
uart.readinto(buf):将数据读取到指定内存缓冲区,提高效率。

示例代码

python">import pyb#初始化UART(波特率115200,使用UART3)
uart = pyb.UART(3, 115200)#发送数据(写入发送缓冲区)
uart.write(b'Start Transmission\n')#接收数据(从接收缓冲区读取)
while True:if uart.any() > 0:received_data = uart.read(uart.any())  # 读取所有可用数据print("Received:", received_data)

5. 流控制与缓冲区溢出预防

硬件流控制(RTS/CTS)
作用:通过**RTS(请求发送)和CTS(清除发送)**信号线,防止缓冲区溢出。

  1. OpenMV支持:需硬件支持,配置UART时启用。
python">uart = pyb.UART(3, 115200, flow=pyb.UART.RTS | pyb.UART.CTS)
  1. 软件策略
    定期清空缓冲区:避免接收缓冲区积压。
python">if uart.any() > 100:  # 缓冲区接近满载时清空uart.read(uart.any())
  1. 分块发送:大数据分多次写入,防止发送缓冲区溢出。
python">data = b'A' * 1000  # 1000字节数据
for i in range(0, len(data), 100):uart.write(data[i:i+100])  # 每次发送100字节

6. 实际应用场景

场景1:实时传感器数据传输

需求

连续接收温度传感器数据

实现
python">while True:if uart.any() >= 4:  # 假设每帧数据4字节frame = uart.read(4)temperature = int.from_bytes(frame, 'big')print("Temperature:", temperature)

场景2:高速图像传输

需求

通过UART发送摄像头捕获的图像。
挑战:图像数据量大(如320x240 RGB565图像约150KB),需分块发送。
优化:

python">img = sensor.snapshot()
img_bytes = img.compress(quality=50).to_bytes()  # 压缩图像
chunk_size = 128  # 每次发送128字节
for i in range(0, len(img_bytes), chunk_size):uart.write(img_bytes[i:i+chunk_size])

总结

  1. 流(Stream):UART数据传输的连续性抽象,强调顺序性和实时性。

  2. 缓冲区(Buffer):临时存储数据的内存区域,分为发送和接收缓冲区。

  3. 关键操作:
    写入发送缓冲区:uart.write()
    读取接收缓冲区:uart.read()
    检查数据量:uart.any()

  4. 优化策略:硬件流控制、分块传输、定期清空缓冲区。
    通过合理管理流和缓冲区,可以确保OpenMVUART通信高效稳定,适用于从低速传感器高速数据传输的多样化场景。


总结

以上就是今天要讲的内容,本文仅仅简单介绍了OpenMV的串口流和缓冲区


http://www.ppmy.cn/ops/157582.html

相关文章

win11+mac键盘+PowerToys 重映射热键

在win11系统中,使用mac的蓝牙键盘,键盘本身没有PrintScreen键。这时可以借助PowerToys来将其他键映射到系统的PrintScreen. 1.下载安装PowerToys 地址https://learn.microsoft.com/zh-cn/windows/powertoys/ 2.打开PowerToys,选中【键盘管理器…

DeepSpeek服务器繁忙?这几种替代方案帮你流畅使用!(附本地部署教程)

作者:后端小肥肠 目录 1. 前言 2. 解决方案 2.1. 纳米AI搜索(第三方平台) 2.2. Github(第三方平台) 2.3. 硅基流动(第三方API) 3. 本地部署详细步骤 3.1. 运行配置需求 3.2. 部署教程 4…

第二十一章:考研的艰难抉择与放弃入学的转折

深秋时节,校园宛如被大自然精心雕琢的艺术殿堂。金黄的银杏叶在阳光的轻抚下,闪烁着细碎的光芒,微风拂过,叶片相互摩挲,发出沙沙的轻响,仿佛在低声诉说着岁月的故事。一片片银杏叶悠悠然飘落,宛…

在 PyTorch 中理解词向量,将单词转换为有用的向量表示

你要是想构建一个大型语言模型,首先得掌握词向量的概念。幸运的是,这个概念很简单,也是本系列文章的一个完美起点。 那么,假设你有一堆单词,它可以只是一个简单的字符串数组。 animals ["cat", "dog…

蓝桥杯51单片机练习(国信长天比赛用)

文章目录 代码实现头文件固定模板延时函数HC138译码器和或非门流水灯闪烁次数(假设闪烁5次)从左向右依次亮从左向右依次灭 总代码 代码实现 头文件 #include <REGX52.H> 固定模板 void main() { while(1) { } } 延时函数 void Delay(unsigned char t) { while(t–…

MySql --- 作业

一. 触发器 1建立两个表:goods(商品表)、orders(订单表) mysql> create database mydb16_tigger; Query OK, 1 row affected (0.01 sec)mysql> use mydb16_tigger; Database changed mysql> mysql> CREATE TABLE goods (-> gid CHAR(8) PRIMARY KEY,->…

spring cloud和spring boot的区别

Spring Cloud和Spring Boot在Java开发领域中都是非常重要的框架&#xff0c;但它们在目标、用途和实现方式上存在明显的区别。以下是对两者区别的详细解析&#xff1a; 1. 含义与定位 Spring Boot&#xff1a; 是一个快速开发框架&#xff0c;它简化了Spring应用的初始搭建以…

【Spring Boot】Spring 事务探秘:核心机制与应用场景解析

前言 ???本期讲解关于spring 事务介绍~~~ ??感兴趣的小伙伴看一看小编主页&#xff1a;-CSDN博客 ?? 你的点赞就是小编不断更新的最大动力 ??那么废话不多说直接开整吧~~ 目录 ???1.事务 ??1.1什么是事务 ??1.2为什么需要事务 ??1.3操作事务 ???…