最小系統:stm32f103rct6
開發環境:stm32cubeide
實現功能:openmv作為上位機傳送識別物體後獲取的座標資訊,加上幀頭幀尾表示資訊結構
舉個例子,如果你需要傳送兩個座標(x,y),傳送的座標資訊之間沒有間隔。那資料流應該是這個樣子:xyxyxyxyxyxy
微控制器在接受時很容易分不清本次接收的值是x座標還是y座標。所以直接傳送直接接收是不可行的。
我們可以定義自己的資料報,定義幀頭幀尾 將自定義規則的資料放在中間(不追求嚴謹可不考慮校驗位)。
**:
/*
* protol.h
* * created on: 2023年9月27日
* author: kindresy
*/#ifndef inc_protol_h_
#define inc_protol_h_
#include
"usart.h"
#include
"string.h"
#include
"stdio.h"
#include
"stdbool.h"
#define datalength 24
typedef
struct __protol_handletypedef
protolhandletypedef;
void
protol_init
(uint8_t framehead,uint8_t frametail,protolhandletypedef * protol)
;bool usart_dataget
(protolhandletypedef * protol)
;#endif
/* inc_protol_h_ */
/* * protol.c
* * created on: 2023年9月27日
* author: kindresy
*/#include
"protol.h"
void
protol_init
( uint8_t framehead,
uint8_t frametail,
protolhandletypedef * protol)
bool usart_dataget
(protolhandletypedef * protol)
else
if(protol->data == protol->frametail)
if(protol->rec)
return protol->packflag;
}protolhandletypedef ov_usart;
protolhandletypedef * ov_usarthandler=
&ov_usart;
void
hal_uart_rxcpltcallback
(uart_handletypedef *huart)
}hal_uart_abortreceive_it
(&huart1)
;hal_uart_receive_it
(&huart1,
&(ov_usarthandler->data),1
);}int
main()
需要注意的事:
hal庫的串列埠接收中斷每次接收完畢都需要重新開啟
hal_uart_transmit_it(&huartx,&protol->data,1);
基於HAL庫處理UART中斷並接收串列埠傳入的資料
正確的獲取接收資料的方法是 1.在進入中斷後使用hal庫函式中的hal uart getstate函式確定uart的接收是否結束,這個函式也可以判斷傳送資料是否忙碌等 hal uart busy xx 2.處理快取中的資料,提取儲存到自定義的變數陣列中,用hal uart receive函式實現 3...
STM32使用HAL庫寫串列埠接收中斷
硬體 正點原子戰艦開發板 stm32f103zet6 軟體 mdk5,stm32cubemx 下面講解使用hal庫配置串列埠1,使串列埠1可以使用中斷接收位元組並原樣返回。uint8 t uart1 rxbuf 10 用於存放接收到的資料 void mx usart1 uart init void ...
STM32 HAL庫使用中斷實現串列埠接收不定長資料
以前用dma實現接收不定長資料,dma的方法接收串列埠助手的資料,全部沒問題,不過如果接收模組返回的資料,而這些資料如果包含回車換行的話就會停止接收,例如接收 at r nok r n,就只能接收到at r,導致沒有接收完成,具體原因還沒搞懂,有了解的,希望可以告知一下,dma不定長接收方法傳輸門 ...