STM32如何利用串列埠傳送接收資料

2021-05-15 05:00:08

STM32如何利用串列埠傳送接收資料?
我現在計劃利用STM32F103X的串列埠對迪文屏傳送及接收資料。
手中硬體:正點原子開發板(旗艦版),迪文屏(4.3寸),電腦
軟體:MCU程式下載:FLYMCU;串列埠助手:XCOM;迪文屏設定:DGUS TOOL V7.623
1、我先利用正點原子開發板向串列埠助手傳送資料:
(1)傳送單位元組
利用正點原子開發板自己程式就可以實現了。
在這裡插入圖片描述
在這裡插入圖片描述

在這裡插入圖片描述
點選「傳送」後,單字元「a」會傳送到開發板的MCU中,然後又重新傳送到XCOM中。但是有時候點選傳送後,字元「a」未重新發回來。
只有當主迴圈「while(1){}」中增加延時函數後,這種情況才消失。見下圖
在這裡插入圖片描述
分析原因:在主函數執行過程中,串列埠接收中斷,接收到的資料儲存到USART_RX_BUF[]中。但是由於主迴圈速度過快,中斷在「USART_SendData(USART1, USART_RX_BUF[t]);」之後的資料由於USART_RX_STA=0,導致資料無法從串列埠傳送出去了。

當把USART_RX_STA=0,刪除,則「USART_SendData(USART1, USART_RX_BUF[t]);」一直傳送原來串列埠接收到的資料。
在這裡插入圖片描述

在這裡插入圖片描述

(2)傳送字串
在這裡插入圖片描述
在這裡插入圖片描述
在這裡插入圖片描述
字串在傳送到開發板後,開發板接收,並重新傳送回來,此時XCOM接收到的字串有明顯丟失字元現象。此現象與第(1)步裡面的情況相似。

(3)利用串列埠中斷傳送迪文屏的「讀」「寫」命令。
當前遇到的2個問題:
問題1:在用串列埠助手傳送資料,如:5a a5 06 83 20 00 01 00 00。MCU接收資料時,串列埠助手並不是每次點選「傳送」都能夠返回值。
解決方法:因為掃描開發板傳送到串列埠助手的所有資料時發現,資料最後都會跟「0d」「0a」。所以是否有看不到的資料,第一次沒有采集完,導致第二次、第三次採集時資料位不再是順序採集,導致條件語句無法執行。所以增加if(RX_buf[0]==0x5a),當為資料開始時再採集。
在這裡插入圖片描述
問題2:

在這裡插入圖片描述

在這裡插入圖片描述
想用條件語句判斷, 從而更改status的值,如果是else if的話,執行完else if(status1),整個條件語句就執行完了,不會繼續執行。但是改動後,就可以繼續執行下一個條件語句,通過賦值語句,從而得到status=0;
在這裡插入圖片描述
當這裡面的賦值語句去掉後,最後的status
0語句不再執行。這個原因是什麼?