STM32與感測器串列埠通訊問題

2021-10-24 04:45:36 字數 1940 閱讀 3501

stm32f407zgt6使用串列埠通訊傳送指令給感測器,讓感測器返回測得的資料。

大家看我這個程式,在main函式前面我定義了乙個read_instruction陣列,存放讀取感測器的指令,在while迴圈中有乙個按鍵檢測,當按下key0的時候,微控制器傳送這個指令給感測器,理論上感測器接收到指令會返回測量的資料,但switch下面的這個if語句跳過了,說明if(usart_rx_sta&0x8000)沒滿足條件,也就是usart_rx_sta沒有變成1。

首先確認我感測器沒問題,如下圖:

用串列埠助手傳送16進製制11 02 07 db給感測器返回這串資料(共56個資料),所以感測器沒問題。

其次是**有沒有問題,如下圖:

按下微控制器key0,串列埠助手接收到微控制器傳送的11 02 0b 07 db,說明傳送**沒問題。

下面看接收**:

微控制器rx接收到串列埠助手發的11 02 0b 07 db會觸發中斷,這個usart_rx_sta暫存器就置1了(當然傳送任何數usart_rx_sta都會被置1,因為只要接收就觸發中斷),所以led1就被點亮了。

總結:1、感測器被我用串列埠助手驗證了沒問題;

2、微控制器的傳送程式也用串列埠助手驗證了,能傳送;

3、微控制器接收函式用串列埠助手驗證了,只要接收到就點亮led1;

所以就是微控制器rx接收感測器傳送的資料usart_rx_sta暫存器不會置1,這到底是什麼原因?

開啟usart.c檔案,找到下圖這個函式:

函式就是rx有資料進來就中斷,開始讀資料,但是這串資料必須要以0x0d和0x0a結尾,用串列埠助手發的資料預設被加上了

0x0d 0x0a,所以你用串列埠助手發任意的數這個函式都會把usart_rx_sta暫存器置1,而感測器傳送給微控制器rx的資料不是以0x0d 0x0a結尾就不會置1(雖然觸發中斷了,但資料不是0x0d 0x0a結尾呀)。

因此,想讓usart_rx_sta暫存器置1,就需要在rx接收到的資料後面加上0x0d 0x0a,但感測器返回的資料不是我能定的呀,結尾沒法加呀。

所以只能改這個中斷函式:

我就直接把這個函式注釋掉,自己寫判斷讓usart_rx_sta暫存器置1,由於感測器返回的資料是56個,所以定義個標誌flag2,當它等於56的時候就把usart_rx_sta暫存器置1,說明資料接收完了。然後下面的用液晶顯示的函式也就實現了hhh....

以上是在調**的時候遇到的問題,第一次發部落格,希望對大家有所幫助。

STM32串列埠接收粉塵感測器資料

本文章主要記錄stm32實現對粉塵感測器的資料採集及簡單處理。主要設計思路 1 串列埠初始化,包括gpio,外設時鐘,nvic等配置 2 串列埠中斷處理函式編寫,即通過接收中斷獲取資料並且儲存到陣列,同時注意判斷相關資料位 3 傳送資料,使用到了printf函式,需要重定向 4 主程式初始化。主要函...

stm32碼盤感測器 STM32編碼器介面模式

1.編碼器 圖1 編碼器示意圖 圖1為編碼器的示意圖,中間是乙個帶光柵的碼盤,光通過光柵,接收管接收到高電平,沒通過,接收到低電平。電機旋轉一圈,碼盤上有多少光柵,接受管就會接收多少個高電平。2.stm32編碼器介面模式 暫存器 stm32的編碼器介面模式在stm32中文參考手冊中有詳細的說明。圖2...

STM32之串列埠通訊

一 rs232通訊協議 1 概念 個人計算機上的通訊介面之一,由電子工業協會 electronic industries association,eia 所制定的非同步傳輸標準介面。2 電氣特性 邏輯1 mark 3v 15v 邏輯0 space 3 15v 3 介面 實現全雙工非同步通訊只需要三根...