Ⅰ、寫在前面
今天這篇文章分享的知識點比較少,但比較重要,是大部分人在實際項目開發中都容易忽視,且容易犯下的低級錯誤。
本文講述在項目開發中,或在學習中經常遇到USART發送字符串,對方沒有接收完成(最后一兩字節),也就是最后字節數據丟失了。具體可以看下面章節實驗。
關于本文的更多詳情請往下看。
Ⅱ、實例工程
為了方便大家學習,提供實驗源代碼工程給大家參考。
STM32F10x_SART(驗證USART發送字符串):
https://yunpan.cn/ckInh8YTwWHVP訪問密碼 81f9
提供下載的實例實現的功能比較簡單,主要是用于驗證不同情況下,發送字符的不同。
實例實現功能可以從下面main函數中看的出來,打印數據,進入待機。為了方便用戶進入待機不能下載程序,例程使用了一個喚醒按鍵PC13(可以修改),喚醒有一個LED閃爍和延時,這個期間可以重新下載代碼。
Ⅲ、本文要點
這里主要說的是在特殊情況下發送字符軟件代碼的寫法。
特殊情況指的是:
1.調用發送字符串函數“發送完”本機立即掉電;
2.調用發送字符串函數“發送完”從機立即掉電;
【上面兩種主要用于芯片對電源控制的項目中】
3.調用發送字符串函數“發送完”立刻進入待機或停機;
其實本文主要說的是兩個標志位:USART_FLAG_TXE 和 USART_FLAG_TC.
USART_FLAG_TXE發送緩沖區空標志:說明可以往數據寄存器寫入數據了,但并不代碼數據發送完成了。
USART_FLAG_TC發送完成標志:這個才是代表USART在緩沖區的數據發送完成了,即從機接收到了數據。
這兩個標志的區別在于:它們分別表示數據在發送過程中,在兩個不同的階段中的完成情況。TXE 表示數據被從發送緩沖區中取走,轉移到的移位寄存器中,此時發送緩沖是空的,可以向其中補充新的數據了。而 TC 則表示最后放入發送緩沖區的數據已經完成了從移位寄存器向發送信號線 Tx 上的轉移。所以,判定數據最終發送完成的標志是 TC,而不是 TXE.
下面講述在不同代碼寫法下,得到不同實驗效果【調試助手接收數據】:
1.常見寫法一
這種寫法在不是特殊(不掉電、不待機等)情況下,問題不大,USART數據會成功發送出去。 但是在上面說的特殊情況下,問題就來了,代碼只將數據放到了發送緩沖區,而沒有發送出去就掉電或待機了,這個時候其實最后兩個字符是沒有發送出去的。
2.常見寫法二
這種寫法達到的效果和上面存在不同的就是倒數第二個數據發送出去了,也就是只有最后一個字符是沒有發送出去的。
3.常見寫法三
這種寫法達到的效果和上面兩種寫法有不一樣,發送了10個字符。
4.寫法四
這種寫法按理說可以實現功能,但實際多次試驗結果確實第一字節數據丟失了。
5.寫法五(正確寫法)
這種寫法是比較完成,為了保守起見,在特殊情況下使用該寫法。。
至此,常見軟件寫法都給出了源代碼和試驗效果,請根據自己實際情況寫代碼驗證。
Ⅳ、說明
以上幾點內容比較容易出現問題,希望對你項目開發起到幫助作用。
以上總結僅供參考,若有不對之處,敬請諒解。。
-
源代碼
+關注
關注
96文章
2950瀏覽量
67816 -
USAR
+關注
關注
0文章
4瀏覽量
8470 -
main
+關注
關注
0文章
38瀏覽量
6338
發布評論請先 登錄
安富利推出個人安全追蹤器解決方案

ESD防護設計中的10個常見誤區,你中招了嗎?

STM32學習USART之基礎篇(可下載)
stm32g0b1中的usart5進不去HAL_UARTEx_RxEventCallback,為什么?
為什么很多古建筑、寺容易著火?

電平匹配問題,簡單卻容易被忽視

掌握調試技巧是攻克嵌入式學習難點的關鍵

一文看懂為什么貼片共模電感的感量在電路中會不穩定
【GD32 MCU 入門教程】GD32 MCU 常見外設介紹(10)USART 模塊介紹

NAS工具軟件大盤點:瞧瞧哪個被你遺漏了
創建Aurix項目失敗怎么解決?
【RISC-V信息速遞】反X86和ARM壟斷?很多人低估了RISC-V的顛覆性

評論