入门学习记录
学习中接触到了openmv ,发现视觉也挺好玩的,openmv视觉处理的数据经常要传到另一个单片机,这里openmv用的是stm32h7,用的串口为串口3。控制板是stm32f407zgt6,用的串口是串口2。
目的是将openmv的数据通过串口传到控制板并在oled上面显示。
大概思路
两个单片机用串口通信,必须把自己的串口配置好。stm32f407串口2的配置在上一个文章讲了;openmv的串口直接调用。双方约定好波特率就可以通信了。难的是数据的处理,在用单片机与电脑通信的时候会发现有时候得到一些乱码,主要是串口有可能一直在发送数据,这不是我们希望得到的。在电脑串口助手观察十六进制会发现在我们要的信息前面有乱码的十六进制,因此在我们需要的数据前面自己加两个已知的数,接收的时候判断到了这两个数就可以认为接下来的就是我们要的数据,这两个数就是所谓的“帧头”,以帧发送数据比较常用,帧头和数据比较重要,其它可以省略,具体可以百度。
1.配置串口,约定好波特率
2.IO接线,RX接TX
3.传数据,收数据。openmv的数据要用 bytearray()函数将数据转化为字节形式传到控制板
4.数据处理
代码
openmv
import time
from pyb import UART
uart = UART(3, 115200) //波特率为115200
while(True):
FH = bytearray([0xb3,0xb3]) //帧头,控制板接收数据以后判断,转化为字节传送,不能用16进制直接传
uart.write(FH) //写到串口
uart.write(“123321”) /// 写数据
FH = bytearray([0x0d,0x0a]) //结束标志 ,换行和回车的ascll
uart.write(FH)
time.sleep(1000)
main.c
#include “sys.h” //没有的头文件要删掉
#include “delay.h”
#include “usart.h”
#include “led.h”
#include “beep.h”
#include “key.h”
#include “oled.h”
u8 UsartDisPlay[200]; // oled上面显示的
int main(void)
{
u8 t,n;
u8 len;
u16 times=0;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置系统中断优先级分组2
delay_init(168); //延迟初始化
uart2_init(115200); //波特率为115200
LED_Init();
OLED_Init(); //oled初始化
while(1)
{
if(USART2_RX_STA&0x8000)
{
len=USART2_RX_STA&0x3fff;//得到此次接收到的数据长度
for(t=0;t《len;t++)
{
if(USART2_RX_BUF[t]==0xb3) //判断帧头,即我们加的两个数
if(USART2_RX_BUF[t+1]==0xb3)
n=t+2; //记录我们需要数据的位置
}
for(t=0;n《len;t++,n++)
UsartDisPlay[t] = USART2_RX_BUF[n]; // 将我们需要的数据在oled上面显示,便于观察是否正确
OLED_ShowString(1,1,UsartDisPlay);
USART2_RX_STA=0;
}else
{
times++;
if(times%5000==0)
{
LED1=!LED1;
}
if(times%30==0)LED0=!LED0; //闪烁LED,提示系统正在运行
delay_ms(10);
}
}
}
入门学习记录
学习中接触到了openmv ,发现视觉也挺好玩的,openmv视觉处理的数据经常要传到另一个单片机,这里openmv用的是stm32h7,用的串口为串口3。控制板是stm32f407zgt6,用的串口是串口2。
目的是将openmv的数据通过串口传到控制板并在oled上面显示。
大概思路
两个单片机用串口通信,必须把自己的串口配置好。stm32f407串口2的配置在上一个文章讲了;openmv的串口直接调用。双方约定好波特率就可以通信了。难的是数据的处理,在用单片机与电脑通信的时候会发现有时候得到一些乱码,主要是串口有可能一直在发送数据,这不是我们希望得到的。在电脑串口助手观察十六进制会发现在我们要的信息前面有乱码的十六进制,因此在我们需要的数据前面自己加两个已知的数,接收的时候判断到了这两个数就可以认为接下来的就是我们要的数据,这两个数就是所谓的“帧头”,以帧发送数据比较常用,帧头和数据比较重要,其它可以省略,具体可以百度。
1.配置串口,约定好波特率
2.IO接线,RX接TX
3.传数据,收数据。openmv的数据要用 bytearray()函数将数据转化为字节形式传到控制板
4.数据处理
代码
openmv
import time
from pyb import UART
uart = UART(3, 115200) //波特率为115200
while(True):
FH = bytearray([0xb3,0xb3]) //帧头,控制板接收数据以后判断,转化为字节传送,不能用16进制直接传
uart.write(FH) //写到串口
uart.write(“123321”) /// 写数据
FH = bytearray([0x0d,0x0a]) //结束标志 ,换行和回车的ascll
uart.write(FH)
time.sleep(1000)
main.c
#include “sys.h” //没有的头文件要删掉
#include “delay.h”
#include “usart.h”
#include “led.h”
#include “beep.h”
#include “key.h”
#include “oled.h”
u8 UsartDisPlay[200]; // oled上面显示的
int main(void)
{
u8 t,n;
u8 len;
u16 times=0;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置系统中断优先级分组2
delay_init(168); //延迟初始化
uart2_init(115200); //波特率为115200
LED_Init();
OLED_Init(); //oled初始化
while(1)
{
if(USART2_RX_STA&0x8000)
{
len=USART2_RX_STA&0x3fff;//得到此次接收到的数据长度
for(t=0;t《len;t++)
{
if(USART2_RX_BUF[t]==0xb3) //判断帧头,即我们加的两个数
if(USART2_RX_BUF[t+1]==0xb3)
n=t+2; //记录我们需要数据的位置
}
for(t=0;n《len;t++,n++)
UsartDisPlay[t] = USART2_RX_BUF[n]; // 将我们需要的数据在oled上面显示,便于观察是否正确
OLED_ShowString(1,1,UsartDisPlay);
USART2_RX_STA=0;
}else
{
times++;
if(times%5000==0)
{
LED1=!LED1;
}
if(times%30==0)LED0=!LED0; //闪烁LED,提示系统正在运行
delay_ms(10);
}
}
}
举报