stm32串列埠接收、tf卡儲存丟數現象解析與總結
問題:
待接受的串列埠資料是9600波特率,一行一行的傳送,最長一行不超過1024位元組。 在利用stm32的串列埠進行資料接收,設定兩個1024大小的buf,輪流接收,輪流寫入tf卡, 為什麼中間總會出現完整的一行無發記錄下來的問題呢。
解析:我確定是中間的資料丟失,我估計很大原因就是接收和寫保護偏差問題。 剛才用串列埠除錯攻擊分別以10ms 100ms 1000ms 的速率傳送一整行資料(保證有0x0d 0x0a)(一行是20位元組), 結果統計的傳送位元組跟實際儲存到檔案的位元組數如下:
傳送間隔時間 實際儲存位元組數 串列埠工具傳送位元組數
1000ms 7620bytes 7800bytes
100ms 28240 28680
10ms 26860 32920
發現10ms的時候,裡面的檔案記錄直接就亂了,本來應該是整齊的很多行業資料,因為中間丟包導致資料比較亂, 而且看實際儲存位元組數跟 串列埠傳送位元組數 差別也很明顯。
串列埠是9600波特率的, 儲存時用sdio 往tf卡里儲存的。 程式上採用雙buf。 不知道問題出在什麼地方, 還是本身tf卡儲存就到不了接收9600波特率 10m間隔傳送的這麼一種速率呢。
同行的建議:
在做桌球操作時,要保護buffer不能被讀,和寫同時操作。如果如下描述是正確的話,應該不是讀寫資料速度不匹配造成的。
傳送間隔時間 實際儲存位元組數 串列埠工具傳送位元組數
1000ms 7620bytes 7800bytes
我建議你程式做些除錯資訊:1.弄乙個包的接收計數器,看包是不是都收到了,如果收包就有丟失,那肯定是會少了?2.如果包都收到了,就看你寫過程是不是有判斷,丟棄了一些包。假如你做了資料校驗,或者寫tf卡失敗等。
總結:中間總會出現完整的一行無發記錄下來
請確認是否是中間一行,還是第一行或者最後一行。
1. 協議是否是存硬體實現。如果是,則可能是時序出問題。
2. 如果是第一行或者最後一行,則可能是起始條件出問題或者結束條件出問題。
3. 如果中間一行出問題。可能是接收和寫儲存時序偏差積累造成丟包。
最好將**仔細看看。
建議用示波器觀察波形,計算時間傳送速率。
STM32串列埠接收策略
如果我們需要接收乙個序列協議,怎麼做呢?先放到緩衝區然後再檢查標誌位是一種思路。道理簡單,關鍵要看怎麼設計。這裡介紹的方法是巧妙利用定時器,與串列埠中斷進行耦合,得到一種魯棒的接收方法。具體 開啟定時器與串列埠中斷 首先用示波器檢視完整幀所需要的時間,並且設定為timmax。定時器以適當的中斷頻率開...
STM32串列埠接收中斷BUG
除錯串列埠時,發現串列埠會出現頻繁跳中斷,導致無法執行主迴圈的問題!除錯發現是串列埠中斷硬體bug 1.usart itconfig usart 1,usart it rxne,enable 使能了接收中斷,那麼ore中斷也同時被開啟了。2.ore中斷只能使用usart getflagstatus ...
STM32串列埠通訊中斷接收
串列埠的時序和工作原理就不寫了,主要寫如何應用 串列埠的設定除了gpio外,需要設定的引數有波特率 資料位 停止位,校驗方式 gpio輸出配置af pp復用推挽輸出 gpio出入配置in flaoting浮空輸入 usart的配置為115200的波特率,8位資料長度,1位停止位,無校驗,無硬體流控制...