Openmv 與 Stm32f407通訊

亦友.發表於2020-12-20

Openmv 與 Stm32f407通訊

入門學習記錄

學習中接觸到了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);
		}			
	}
}

![在這裡在這裡插入圖片描述
stm32f407zgt6串列埠配置的程式碼在上一篇文章。

相關文章