openmv串口打包发送数据

文章描述了一个使用STM32通过串口接收OpenMV发送的数据的过程。OpenMV发送的数据格式包含帧头和16位整数,STM32接收到的数据顺序需要校验并反转后才能得到正确的数值。在STM32端,通过HAL_UARTEx_RxEventCallback函数进行数据接收和处理,验证帧头和帧尾,并将接收到的16位数据转换为有符号整数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 openmv端

import time
from pyb import UART
import ustruct

uart = UART(3, 19200)
uart.init(19200,8,None,1)

def send_data(d):
    global uart;
    data = ustruct.pack("<bbhb",      #b为1byte h为2byte
                   0x2C,                      #帧头1
                   0x12,                      #帧头2
                   int(d), 
                   0x5B)
    uart.write(data); 




while(True):
    send_data(5)
    time.sleep_ms(1000)

stm32端

uint8_t pData[20];
void HAL_UARTEx_RxEventCallback(UART_HandleTypeDef *huart, uint16_t Size)
{
	HAL_UART_Transmit_IT(&huart1, pData, strlen(pData));

	HAL_UARTEx_ReceiveToIdle_IT(&huart3, pData, sizeof(pData));
}

使用3号串口接收openmv的数据,1号串口打印

通过串口助手得到的数据是 2C 12 05 00 5b 而不是 2c 12 00 05 5b顺序是反的,需要在32端进行处理才可以得到真实数据,处理过程如下,

If(pData[0] == 0x2C && pData[1] == 0x12&&pData[4] == 0x5b){//验证帧头帧尾
	int16_t num = 0;//使用2byte的int类型接收不能用32位,因为你发送的本来就是16位的
	num = pData[3] << 8;
	num = pData[2];
	//这样就可以接收16位(short类型)有符号数
}

这样num就是所发送的数据了

完整代码

int16_t derta_x = 0;
uint8_t pData[20];
void HAL_UARTEx_RxEventCallback(UART_HandleTypeDef *huart, uint16_t Size)
{
	HAL_UART_Transmit_IT(&huart1, pData, strlen(pData));
	if(pData[0] == 0x2C && pData[1] == 0x12)
	{
		derta_x = pData[3] << 8;
		derta_x += pData[2];
		uint8_t s[6] = {0};
		memset(s,0,sizeof(s));
		sprintf(s,"%d",derta_x);
		//HAL_UART_Transmit_IT(&huart1, s, sizeof(s));
	}

	HAL_UARTEx_ReceiveToIdle_IT(&huart3, pData, sizeof(pData));
}

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值