日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

【嵌入式】openmv与stm32的串口通信

發布時間:2023/11/27 生活经验 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【嵌入式】openmv与stm32的串口通信 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

參考:(文中部分圖/文字/代碼來自以下文章,部分內容由于時間久遠已經找不到原作者,可聯系注明或刪除)
PYTHON串口數據打包發送STM32接收數據解析
openmv中文文檔

這里以openmv循跡代碼為例
main.py

THRESHOLD = (74, 100, -128, 127, -128, 127) # 識別白線
import sensor, image, time
from pyb import LED,UARTuart = UART(3, 115200)
uart.init(115200, bits=8, parity=None, stop=1)  # 定義串口
sensor.reset()
sensor.set_vflip(True)
sensor.set_hmirror(True)
sensor.set_pixformat(sensor.RGB565)
sensor.set_framesize(sensor.QQQVGA)
clock = time.clock()def sending_data(rho_err,theta_error):    #發送函數global uartdata = ustruct.pack("<bbhhb",  # 解釋見下文0x2C,0x12,int(rho_err),int(theta_error),0x5B)uart.write(data);while(True):clock.tick()img = sensor.snapshot().binary([THRESHOLD])line = img.get_regression([(100,100)], robust = True)if (line):rho_err = abs(line.rho())-img.width()/2theta_error = line.theta()if (line.theta()>90):theta_error = line.theta()-180print('rho:', rho_err, 'theta:', theta_error)img.draw_line(line.line(), color = 127)sending_data(rho_err, theta_error)  # 發送數據,這里發送了兩個數據time.sleep_ms(10)

關于struct.pack:
函數原型:struct.pack(fmt, v1, v2, …)

  • fmt是格式字符串
  • v1,v2是要轉換的python值,詳情見下表

注1.q和Q只在機器支持64位操作時有意思;
注2.每個格式前可以有一個數字,表示個數;
注3.s格式表示一定長度的字符串,4s表示長度為4的字符串,但是p表示的是pascal字符串;
注4.P用來轉換一個指針,其長度和機器字長相關;
注5.最后一個可以用來表示指針類型的,占4個字節;
為了同c中的結構體交換數據,還要考慮有的c或c++編譯器使用了字節對齊,通常是以4個字節為單位的32位系統,故而struct根據本地機器字節順序轉換.可以用格式中的第一個字符來改變對齊方式.定義如下:

大端和小端的區別:
小端:較高的有效字節存放在較高的的存儲器地址,較低的有效字節存放在較低的存儲器地址。
大端:較高的有效字節存放在較低的存儲器地址,較低的有效字節存放在較高的存儲器地址。
例如0x12345678 ,在大端模式的排列:0x01(低地址),0x23,0x45,0x67,0x89(高地址)。
在小端模式的排列:0x89(低地址),0x67,0x45,0x23,0x01(高地址)。


在stm32中的代碼如下:
openmv.c

#include "openmv.h"
#include "stm32f10x.h"void USART2_Init(void){ //串口2初始化并啟動//GPIO端口設置GPIO_InitTypeDef GPIO_InitStructure; //串口端口配置結構體變量USART_InitTypeDef USART_InitStructure; //串口參數配置結構體變量NVIC_InitTypeDef NVIC_InitStructure;//串口中斷配置結構體變量RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);	//打開串口復用時鐘RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);   //打開PC端口時鐘//USART2 TX  PA2;GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2; //PA2GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//設定IO口的輸出速度為50MHzGPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;	//復用推挽輸出GPIO_Init(GPIOA, &GPIO_InitStructure); //初始化PA2//USART2 RX  PA3;GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3; //PA3GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空輸入GPIO_Init(GPIOA, &GPIO_InitStructure); //初始化PA3//Usart1 NVIC 配置NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0 ;//搶占優先級0NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;		//子優先級2NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;			//IRQ通道使能NVIC_Init(&NVIC_InitStructure);	//根據指定的參數初始化VIC寄存器//USART 初始化設置USART_InitStructure.USART_BaudRate = 115200;//串口波特率為115200USART_InitStructure.USART_WordLength = USART_WordLength_8b;//字長為8位數據格式USART_InitStructure.USART_StopBits = USART_StopBits_1;//一個停止位USART_InitStructure.USART_Parity = USART_Parity_No;//無奇偶校驗位USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//無硬件數據流控制USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;	//收發模式USART_Init(USART2, &USART_InitStructure); //初始化串口1USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);//開啟ENABLEUSART_Cmd(USART2, ENABLE);   //使能串口1//如下語句解決第1個字節無法正確發送出去的問題USART_ClearFlag(USART2, USART_FLAG_TC);       //清串口2發送標志
}//串口2中斷處理函數
void USART2_IRQHandler(void)			   //串口2全局中斷服務函數
{u8 temp;if( USART_GetITStatus(USART2,USART_IT_RXNE)!=RESET ){USART_ClearITPendingBit(USART2,USART_IT_RXNE);//清除中斷標志temp = USART_ReceiveData(USART2);Openmv_Receive_Data(temp);//openmv數據處理函數}
}u8 RxCounter1 = 0;//接受OpenMV數據里用到的
u8 RxBuffer1[18];//接受OpenMV數據里用到的數組
u16 rho_err = 0,theta_err = 0;//rho偏差和theta偏差//接收OpenMV傳過來的數據
void Openmv_Receive_Data(int16_t data)
{static u8 state = 0;if(state==0&&data==0x2C){state=1;RxBuffer1[RxCounter1++]=data;}else if(state==1&&data==18){state=2;RxBuffer1[RxCounter1++]=data;}else if(state==2){RxBuffer1[RxCounter1++]=data;if(RxCounter1>19||data == 0x5B) state=3;	//最后字符是openmv[19]}else if(state==3)		//state == 3  檢測是否接受到結束標志{if(RxBuffer1[RxCounter1-1] == 0x5B){state = 0;USART_ITConfig(USART2,USART_IT_RXNE,DISABLE);//關閉DTSABLE中斷rho_err = RxBuffer1[3]<<8 | RxBuffer1[2];   //這時已經賦值給rho_err和theta_errtheta_err = RxBuffer1[5]<<8 | RxBuffer1[4];RxCounter1 = 0;USART_ITConfig(USART2,USART_IT_RXNE,ENABLE);//開啟ENABLE中斷}else   //錯誤{state = 0;RxCounter1=0;}}    else	//錯誤{state = 0;RxCounter1=0;}
}
//這段代碼的原稿是一位博主貢獻的,由于時間久遠已經找不到原文章,侵刪或聯系注明

openmv.h

#ifndef __OPENMV_H_
#define __OPENMV_H_
#include "stm32f10x.h"extern u16 USART1_RX_STA;         		//接受狀態標記	
extern u8 RxCounter1; 	 //接受OpenMV數據里用到的
extern u8 RxBuffer1[18];   //接受OpenMV數據里用到的數組extern u16 rho_err;
extern u16 theta_err;extern u8 state;void USART2_Init(void);//串口2初始化并啟動
void Openmv_Receive_Data(int16_t data);//接收OpenMV傳過來的數據
#endif

總結

以上是生活随笔為你收集整理的【嵌入式】openmv与stm32的串口通信的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。