使用openMV3与stm32进行通讯

使用openMV3与stm32进行通讯

想用openMV与stm32通讯,在网上找了一大圈,最后决定使用串口
可以找到openMV的引脚资源图如下:
在这里插入图片描述
这里使用P4(USART3_TX)P5(USART3_RX)脚与stm32的USART1交叉联接。
在这里插入图片描述
openMV的代码如下,功能是进行色块识别并把中心点传给stm32,需要注意的是对数据的打包格式,用到了ustruct.pack这个函数:

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


#white_threshold_01 = ((95, 100, -18, 3, -8, 4));  #白色阈值
red_threshold_01 = ((35, 100, 41, 77, 24, 59));
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()

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 sending_data(cx,cy):
    global uart;
    #frame=[0x2C,18,cx%0xff,int(cx/0xff),cy%0xff,int(cy/0xff),0x5B];
    #data = bytearray(frame)
    data = ustruct.pack("<bbhhb",              #格式为俩个字符俩个短整型(2字节)
                   0x2C,                       #帧头1
                   0x12,                       #帧头2
                   int(cx), # up s
### 实现 OpenMV STM32 通过 RS485 进行串口通信 #### 配置方法 为了使 OpenMVSTM32 能够通过 RS485 正常通信,硬件连接至关重要。RS485 是一种半双工通信协议,在同一时间只允许一方发送数据。 对于硬件部分,确保两设备间正确连接 DE/RE 控制线以及 A/B 数据线。通常情况下: - 将 OpenMV 的 TXD 接到 MAX485 模块的 DI 引脚; - RXD 对应 RO; - GND 相连; - VCC 提供电源支持; - DE 及 RE 并联接到控制信号端子上以便切换收发状态[^1]。 软件配置方面,需分别设置好两个平台上的参数以匹配波特率、停止位等属性。下面给出具体操作指南和示例代码片段用于指导开发人员完成这项工作。 #### 示例代码 ##### OpenMV 端 Python 代码 ```python import pyb, time from pyb import UART uart = UART(3, 9600) # 使用UART3接口,设定波特率为9600bps while True: uart.write(&#39;Hello from OpenMV!\r\n&#39;) # 发送字符串给STM32 if uart.any(): print(uart.read()) # 打印接收到的数据 time.sleep_ms(1000) ``` ##### STM32 HAL 库 C 代码 (假设使用USART1作为RS485接口) 初始化函数: ```c static void MX_USART1_UART_Init(void){ huart1.Instance = USART1; huart1.Init.BaudRate = 9600; /* 设置相同的波特率 */ huart1.Init.WordLength = UART_WORDLENGTH_8B; huart1.Init.StopBits = UART_STOPBITS_1; huart1.Init.Parity = UART_PARITY_NONE; huart1.Init.Mode = UART_MODE_TX_RX; huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE; huart1.Init.OverSampling = UART_OVERSAMPLING_16; if(HAL_UART_DeInit(&huart1)!=HAL_OK){/* 初始化前先释放资源 */} if(HAL_UART_Init(&huart1)!=HAL_OK){ Error_Handler(); } } ``` 接收中断处理程序: ```c void USART1_IRQHandler(void){ HAL_UART_IRQHandler(&huart1); } void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart){ static uint8_t buffer[64]; if(huart->Instance==USART1){ HAL_UART_Receive_IT(&huart1,(uint8_t*)buffer,sizeof(buffer)-1); // 继续监听新消息 printf("Received:%s",buffer); // 输出接收到的信息 } } ``` 发送命令至OpenMV: ```c char msg[]="Echo back!"; if(HAL_UART_Transmit(&huart1,msg,strlen(msg),HAL_MAX_DELAY)!=HAL_OK){ Error_Handler(); // 错误处理机制 } ```
评论 19
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值