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


文章目录


前言

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


流和缓冲区

1. 流(Stream)的含义

定义

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

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

在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中的实现

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

    OpenMV的UART默认缓冲区大小通常为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. 优化策略:硬件流控制、分块传输、定期清空缓冲区。

    通过合理管理流和缓冲区,可以确保OpenMV的UART通信高效稳定,适用于从低速传感器高速数据传输的多样化场景。


总结

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

相关推荐
想搞嵌入式的小白18 分钟前
STM32 NVIC中断控制器
stm32·单片机·嵌入式硬件·nvic
Jay_2723 分钟前
python项目如何创建docker环境
开发语言·python·docker
A-花开堪折39 分钟前
Android7 Input(十)View 处理Input事件pipeline
android·嵌入式硬件
老胖闲聊42 分钟前
Python Django完整教程与代码示例
数据库·python·django
爬虫程序猿1 小时前
利用 Python 爬虫获取淘宝商品详情
开发语言·爬虫·python
noravinsc1 小时前
django paramiko 跳转登录
后端·python·django
声声codeGrandMaster1 小时前
Django之表格上传
后端·python·django
深圳市尚想信息技术有限公司1 小时前
【深尚想】OPA855QDSGRQ1运算放大器IC德州仪器TI汽车级高速8GHz增益带宽的全面解析
单片机·嵌入式硬件
元直数字电路验证1 小时前
Python数据分析及可视化中常用的6个库及函数(一)
python·numpy
waterHBO1 小时前
一个小小的 flask app, 几个小工具,拼凑一下
javascript·vscode·python·flask·web app·agent mode·vibe coding