關於USART很多人都容易忽視的乙個問題

2021-07-23 11:48:53 字數 2193 閱讀 5592

今天這篇文章分享的知識點比較少,但比較重要,是大部分人在實際專案開發中都容易忽視,且容易犯下的低階錯誤。

本文講述在專案開發中,或在學習中經常遇到usart傳送字串,對方沒有接收完成(最後一兩位元組),也就是最後位元組資料丟失了。具體可以看下面章節實驗。

stm32f10x_usart(驗證

usart

傳送字串):

訪問密碼 81f9

例項實現功能可以從下面main函式中看的出來,列印資料,進入待機led

這裡主要說的是在特殊情況下傳送字元軟體**的寫法。

特殊情況指的是:

1.呼叫傳送字串函式「傳送完」本機立即掉電;

2.呼叫傳送字串函式「傳送完」從機立即掉電;

【上面兩種主要用於晶元對電源控制的專案中】

3.呼叫傳送字串函式「傳送完」立刻進入待機或停機;

其實本文主要說的是兩個標誌位:usart_flag_txe 和

usart_flag_tc.

usart_flag_txe傳送緩衝區空標誌:說明可以往資料暫存器寫入資料了,但並不**資料傳送完成了。

usart_flag_tc傳送完成標誌:這個才是代表usart在緩衝區的資料傳送完成了,即從機接收到了資料。

這兩個標誌的區別在於:它們分別表示資料在傳送過程中,在兩個不同的階段中的完成情況。txe 表示資料被從傳送緩衝區中取走,轉移到的移位暫存器中,此時傳送緩衝是空的,可以向其中補充新的資料了。而

tc 則表示最後放入傳送緩衝區的資料已經完成了從移位暫存器向傳送訊號線

tx 上的轉移。所以,判定資料最終傳送完成的標誌是

tc,而不是

txe.

下面講述在不同**寫法下,得到不同實驗效果【除錯助手接收資料】:

這種寫法在不是特殊(不掉電、不待機等)情況下,問題不大,usart資料會成功傳送出去。 但是在上面說的特殊情況下,問題就來了,**只將資料放到了傳送緩衝區,而沒有傳送出去就掉電或待機了,這個時候其實最後兩個字元是沒有傳送出去的。

這種寫法達到的效果和上面存在不同的就是倒數第二個資料傳送出去了,也就是只有最後乙個字元是沒有傳送出去的。

這種寫法達到的效果和上面兩種寫法有不一樣,傳送了10個字元。

這種寫法按理說可以實現功能,但實際多次試驗結果確實第一位元組資料丟失了。

這種寫法是比較完成,為了保守起見,在特殊情況下使用該寫法。。

至此,常見軟體寫法都給出了源**和試驗效果,請根據自己實際情況寫**驗證。

以上幾點內容比較容易出現問題,希望對你專案開發起到幫助作用。

以上總結僅供參考,若有不對之處,敬請諒解。

我的部落格:

乙個故事,說穿了很多人

a不喜歡吃雞蛋,每次發了雞蛋都給b吃。剛開始b很感謝,久而久之便習慣了。習慣了,便理所當然了。於是,直到有一天,a將雞蛋給了c,b就不爽了。她忘記了這個雞蛋本來就是a的,a想給誰都可以。為此,她們大吵一架,從此絕交。有一年,很熱的夏天,一隊人出去漂流。女孩的拖鞋在玩水的時候,把拖鞋掉下去了,沉底了。...

sql 乙個說起來都知道,工作中容易忽視的問題

1今天乙個大學同學問了我乙個問題,他說他想刪除表裡的一行資料。我覺得再簡單不過了。不過他使得是asp開發。我對asp接觸很少,所以有點犯怵,雖然不承認。看了他發來的 我沒發現有什麼問題。language vbscript codepage 936 option explicit dim userna...

乙個容易忽視的儲存過程問題

在ms sql sever的儲存過程中,最好加上事務哦,一般的書上都沒提到這點,以後要注意下 set xact abort on begin transcation 中間執行的sql commit transcation if error 0 rollback set xact abort 指定當 ...