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));
}