文章目录
- 前言
- 流和缓冲区
-
- [1. 流(Stream)的含义](#1. 流(Stream)的含义)
- [2. 缓冲区(Buffer)的含义](#2. 缓冲区(Buffer)的含义)
- [3. 流与缓冲区的协同工作](#3. 流与缓冲区的协同工作)
- [4. 缓冲区管理的关键方法](#4. 缓冲区管理的关键方法)
- [5. 流控制与缓冲区溢出预防](#5. 流控制与缓冲区溢出预防)
- [6. 实际应用场景](#6. 实际应用场景)
- 总结
- 总结
前言
以上就是今天要讲的内容,本文简单介绍了OpenMV的串口流和缓冲区。
流和缓冲区
1. 流(Stream)的含义
定义
流 是一种抽象的数据传输模型,代表连续的数据流动 。在UART通信中,数据通过串行接口 以字节流的形式逐位发送或接收。
流强调数据的顺序性和连续性,类似于水流,数据按发送顺序依次到达接收端。
在OpenMV中的体现
- 发送流:通过UART的write()方法发送数据时,数据以流的形式逐字节传输。
python
uart.write(b'Hello World') # 发送字节流
- 接收流:通过read()方法读取数据时,按接收顺序逐个字节处理。
python
data = uart.read(10) # 读取10个字节的流数据
- 特点
异步传输:数据发送和接收不需要严格的时钟同步,仅依赖波特率 。
实时性:数据流可实时处理 ,适用于传感器数据采集等场景。
2. 缓冲区(Buffer)的含义
定义
缓冲区 是硬件或软件中用于临时存储数据的内存区域 。在UART通信中,缓冲区分为发送缓冲区和接收缓冲区。
- 发送缓冲区:存储待发送的数据,由硬件逐步发送。
- 接收缓冲区:存储已接收但尚未被程序读取的数据。
在OpenMV中的实现
- 发送缓冲区:调用uart.write()时,数据首先写入发送缓冲区,由硬件异步发送。
python
uart.write(b'Data') # 数据存入发送缓冲区后立即返回,不阻塞程序
- 接收缓冲区:当UART接收到数据时,字节暂存于接收缓冲区,直到通过read()读取。
python
if uart.any(): # 检查接收缓冲区是否有数据
data = uart.read(uart.any()) # 读取全部缓冲区数据
-
缓冲区大小
OpenMV的UART默认缓冲区大小通常为256字节(具体取决于硬件型号)。
-
溢出风险:
若接收缓冲区满,新数据将丢失。
若发送缓冲区满,后续写入可能阻塞或丢失数据(取决于实现)。
3. 流与缓冲区的协同工作
数据发送流程
- 程序调用uart.write(data),将数据写入发送缓冲区。
- 硬件按波特率从缓冲区逐字节发送数据。
- 发送完成后,缓冲区清空,准备下一批数据。
数据接收流程
- 硬件检测到UART信号,将接收的字节存入接收缓冲区。
- 程序通过uart.any()检查缓冲区中待读的字节数。
- 调用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(清除发送)**信号线,防止缓冲区溢出。
- OpenMV支持:需硬件支持,配置UART时启用。
python
uart = pyb.UART(3, 115200, flow=pyb.UART.RTS | pyb.UART.CTS)
- 软件策略
定期清空缓冲区:避免接收缓冲区积压。
python
if uart.any() > 100: # 缓冲区接近满载时清空
uart.read(uart.any())
- 分块发送:大数据分多次写入,防止发送缓冲区溢出。
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])
总结
-
流(Stream):UART数据传输的连续性抽象 ,强调顺序性和实时性。
-
缓冲区(Buffer):临时存储数据的内存区域 ,分为发送和接收缓冲区。
-
关键操作:
写入 发送缓冲区:uart.write()
读取 接收缓冲区:uart.read()
检查数据量:uart.any() -
优化策略:硬件流控制、分块传输、定期清空缓冲区。
通过合理管理流和缓冲区,可以确保OpenMV的UART通信高效稳定,适用于从低速传感器 到高速数据传输的多样化场景。
总结
以上就是今天要讲的内容,本文仅仅简单介绍了OpenMV的串口流和缓冲区。