stm32串列埠傳送資料復位第乙個資料丟失 已解決

2022-06-16 20:09:10 字數 1868 閱讀 3163

stm32串列埠傳送必須先檢測狀態,否則第乙個位元組無法發出,傳送完畢,必須檢測傳送狀態是否完成,否則,傳送不成功,使用stm32f10x除錯串列埠通訊時,發現乙個出錯的現象,硬體復位重啟之後,傳送測試資料0x01 0x02 0x03 0x04..接收端收到的資料為:0x02 0x03 0x04,第乙個資料丟失。換成傳送別的數值的資料,如0x06 0x0ff,則接收到0x0ff,0x06丟失。錯誤依舊。 

故障排除過程: 

1、剛開始懷疑是接收端的錯誤,我是使用電腦串列埠,執行串列埠輔助除錯工具接收,換成其他軟體後,發現故障依舊,而且電腦軟體一直是開啟狀態,不像和電腦軟體有關。 

2、使用單步除錯,單步執行各個傳送指令,都正常。能收到0x01 0x02 0x03 0x04的資料。間接的排除了不是電腦軟體的問題,而是其他的錯誤。 

3、單步調試執行雖然正常了,但連續執行時,錯誤依舊。現在有點摸不到頭緒了,單步執行正常,看起來程式設計沒有出錯,那故障在**呢?測試程式如下 

usart_senddata(usart2, 0x01);                                 //a 

while(usart_getflagstatus(usart2, usart_flag_tc) == reset);   //b 

usart_senddata(usart2, 0x02);                                 //c 

while(usart_getflagstatus(usart2, usart_flag_tc) == reset); 

usart_senddata(usart2, 0x03); 

while(usart_getflagstatus(usart2, usart_flag_tc) == reset); 

usart_senddata(usart2, 0x04); 

while(usart_getflagstatus(usart2, usart_flag_tc) == reset); 

4、猜測,也許是因為某個特殊原因,使第二個資料覆蓋了首個資料,使得首個資料丟失。假設:在執行b指令時,usart的 tc 狀態位==set,那麼就會緊接著執行c指令,也就有可能發生資料的覆蓋。於是,在a指令前,加入如下指令:usart_clearflag(usart2,usart_flag_tc); 

5、加入上一條指令後,執行,錯誤消失了。說明上乙個假設,應該是成立的。 

6、查閱stm32f10x參考手冊,找到這樣一句話: 

tc:傳送完成 

當包含有資料的一幀傳送完成後,由硬體將該位置位。如果usart_cr1中的tcie為1,則產生中斷。由軟體序列清除該位(先讀usart_sr,然後寫入usart_dr)。tc位       也可以通過寫入0來清除,只有在多快取通訊中才推薦這種清除程式。 

0:傳送還未完成;1:傳送完成。 

7、注意到這一句:由軟體序列清除該位(先讀usart_sr,然後寫入usart_dr)。 也就是說,要先read usart_sr,然後write usart_dr,才能完成tc狀態位的清除。而硬體復位後,串列埠傳送的首個資料之前沒有read sr的操作,是直接write dr,也就是說,tc沒有被清除掉。 說明第4步的猜測是對的。 

8、那麼,應該把指令a前面加的usart_clearflag(usart2,usart_flag_tc); 改為usart_getflagstatus(usart2, usart_flag_tc);,應該也能消除錯誤。測試後證實,確實如此,在傳送首個資料之前,先讀取一下usart_sr,那麼就不會出現首個資料丟失的情況了。 

9、總結:硬體復位後,串列埠傳送首個資料之前,先讀取一下usart_sr,則能夠保證首個資料傳送時,不出現覆蓋的情況。當然,也有別的方法,比如先清除tc狀態位,或是,在write usart_dr之後,加入乙個小延時,讓資料傳送完畢,應該也能間接排除這個錯誤。

STM32 串列埠DMA(一)

今天調usart,資料在晶元內部用dma傳到串列埠快取,發現dma真的很好,很快,而且不消耗系統資源。只是在傳輸完的時候中斷的標誌置位。下面解釋一下程式。void dma configuration void 再弄幾個重要的語句。這裡是開始dma傳輸前的一些準備工作,將usart1模組設定成dma方...

stm32 串列埠傳送資料第一位元組丟失

使用stm32f10x除錯串列埠通訊時,發現乙個出錯的現象,硬體復位重啟之後,傳送測試資料0x01 0x02 0x03 0x04.接收端收到的資料為 0x02 0x03 0x04,第乙個資料丟失。查閱stm32f10x參考手冊,找到這樣一句話 tc 傳送完成 當包含有資料的一幀傳送完成後,由硬體將該...

stm32串列埠通訊

通訊方式 1 同步通訊 帶時鐘同步訊號傳輸 spi,iic等 2 非同步通訊 不帶時鐘用途訊號 usrt,單匯流排 stm32串列埠引腳表 串口號 rxd txd 1 pa10 pa9 2 pa3pa2 3 pb11 pb10 4 pc11 pc10 5 pd2pc12 通訊過程 接收過程 由rx入...