OpenMv和STM32通信

本文详细讲述了如何解决OpenMV与STM32之间的通信问题,涉及两种数据发送方法:包格式发送和校验位计算。重点在于理解OpenMV的发送结构、Stm32的USART接收中断配置以及数据格式转换技巧。

OpenMv和STM32通信

前言

最近一段时间都在捣鼓OpenMV和Stm32的通信问题,刚开始不知道哪里出了问题,一直通信失败,明明使用TTL串口接收OpenMv发送的数据是可以在串口调试助手上显示的,但就是无法发给Stm32的USART串口。经过了差不多一周的时间,终于解决了。于是在这里记录学习记录。


一、OpenMv配置

1.第一种发送方法

OpenMv代码如下

# Untitled - By: 86188 - 周二 5月 25 2021

import sensor, image, time,pyb
from pyb import UART,LED
import json
import ustruct




#white_threshold_01 = ((95, 100, -18, 3, -8, 4));  #白色阈值
red_threshold_01 = ((2, 51, 11, 127, -128, 127))  #红色阈值

LED_R = pyb.LED(1) # Red LED = 1, Green LED = 2, Blue LED = 3, IR LEDs = 4.
LED_G = pyb.LED(2)
LED_B = pyb.LED(3)

LED_R.on()
LED_G.on()
LED_B.on()



sensor.reset()
sensor.set_pixformat(sensor.RGB565)
sensor.set_framesize(sensor.QVGA)
sensor.skip_frames(time = 2000)
sensor.set_auto_gain(False) # must be turned off for color tracking
sensor.set_auto_whitebal(False) # must be turned off for color tracking


clock = time.clock()

LED_R.off()
LED_G.off()
LED_B.off()

uart = UART(3,115200)   #定义串口3变量
uart.init(115200, bits=8, parity=None, stop=1) # init with given parameters



def find_max(blobs):    #定义寻找色块面积最大的函数
    max_size=0
    for blob in blobs:
        if blob.pixels() > max_size:
            max_blob=blob
            max_size = blob.pixels()
    return max_blob


def send_data_packet(x,y,z,w):
    temp = ustruct.pack("<bbhhhh"
### OpenMVSTM32通信方法及实现教程 OpenMV是一款专注于机器视觉的小型模块,具有强大的图像处理能力。而STM32则是一种高性能的微控制器系列,广泛应用于嵌入式系统开发中。两者结合可以通过多种通信协议实现高效协作。 #### 一、通信方式概述 OpenMVSTM32之间的通信支持多种标准接口,主要包括UART(通用异步收发传输器)、SPI(串行外设接口)以及I2C(内部集成电路总线)。每种方式都有其特点适用场景: - **UART**:这是最常用的通信方式之一,适合简单的数据交换需求。它通过两个信号线(TX/RX)进行单向或双向通信[^1]。 - **SPI**:相比UART,SPI能够提供更高的速度,并允许多设备连接到同一个主控单元上形成网络结构[^1]。 - **I2C**:这种二线制同步串行总线非常适合于低速率外围器件间的短距离通讯,在节省GPIO资源方面表现优异[^1]。 #### 二、具体实现方案——以UART为例 ##### (一)硬件连线 对于基于UART的解决方案来说,正确的物理连接至关重要: - 将OpenMV板上的P4脚(Pin TX)连至STM32目标接收端口; - 同样地,把P5 (Pin RX)对接发送方向相反的一侧即完成基本布署[^2]。 注意确保电压匹配问题以免损坏任何一方组件! ##### (二)软件编程实例 ###### 1. OpenMV端代码片段 下面给出一段Python风格伪代码展示如何利用`code.payload()`读取QR Code内容并通过指定串口号向外广播消息: ```python import sensor, image, time, pyb sensor.reset() sensor.set_pixformat(sensor.RGB565) sensor.set_framesize(sensor.QVGA) uart = pyb.UART(3, baudrate=115200) # 初始化UART通道号及其波特率参数设定为115200bps. while(True): img = sensor.snapshot() for code in img.find_qrcodes(): uart.write("FH") # 发送帧头标志符 'FH' uart.write(code.payload()) # 转发扫描所得字符串形式的结果给另一方解析. ``` 此处需要注意的是实际部署前需确认双方均采用相同配置比如这里提到的标准比特流速率为115200 bps[^2]. ###### 2. STM32端程序框架 以下是针对ARM Cortex-M架构处理器编写的一个简化版本演示怎样监听来自外部源的信息并回显出来验证正确性的流程图解说明: ```c #include "stm32fxxx_hal.h" UART_HandleTypeDef huart1; void SystemClock_Config(void); static void MX_GPIO_Init(void); static void MX_USART1_UART_Init(void); int main(void){ HAL_Init(); SystemClock_Config(); MX_GPIO_Init(); MX_USART1_UART_Init(); uint8_t buffer[2]; while (true){ if(HAL_UART_Receive(&huart1,buffer,sizeof(buffer),HAL_MAX_DELAY)==HAL_OK && strncmp((char *)buffer,"FH",2)==0 ){ // 此处添加额外逻辑处理接收到的有效负载... char echo[]="Message Received!"; HAL_UART_Transmit(&huart1,(uint8_t*)echo,strlen(echo),1000); } } } // 配置函数省略... ``` 此段示范展示了当检测到来自特定起始标记后的后续操作序列;当然依据项目具体情况还可以扩展更多功能性选项[^3]。 --- ###
评论 100
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值