搞自:
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串列埠第乙個位元組丟失問題的分析過程
stm32串列埠傳送必須先檢測狀態,否則第乙個位元組無法發出,傳送完畢,必須檢測傳送狀態是否完成,否則,傳送不成功,使用stm32f10x除錯串列埠通訊時,發現乙個出錯的現象,硬體復位重啟之後,傳送測試資料0x01 0x02 0x03 0x04.接收端收到的資料為 0x02 0x03 0x04,第乙...
關於STM32串列埠列印資料,丟失第乙個位元組的總結
這兩天在做串列埠誤位元速率通訊的實驗的時候,發現串列埠列印資料會發生第一發個資料丟失的情況,通過查閱資料,具體原因為stm32的usart的sr暫存器的tc為初始為1,導致第一次列印時的第乙個資料被覆蓋,所以列印不出 現將解決辦法總結如下 1 直接修改while的等待條件,while usart g...
STM32《串列埠USART收發》第乙個字元丟失問題
問題及現象 stm32 串列埠傳送資料第一位元組丟失 使用stm32f10x除錯串列埠通訊時,發現乙個出錯的現象,硬體復位重啟之後,傳送測試資料0x01 0x02 0x03 0x04 接收端收到的資料為 0x02 0x03 0x04,第乙個資料丟失。當包含有資料的一幀傳送完成後,由硬體將該位置位。如...