日本高清不卡中文字幕-一起草草视频在线观看-亚洲精品一区二区三区色-国产亚洲精品免费视频

你好!歡迎來(lái)到深圳市穎特新科技有限公司!
語(yǔ)言
當(dāng)前位置:首頁(yè) >> 技術(shù)中心 >> 單片機(jī)入門(mén) >> STM32串口第一個(gè)字節(jié)丟失問(wèn)題的分析過(guò)程

STM32串口第一個(gè)字節(jié)丟失問(wèn)題的分析過(guò)程

關(guān)鍵字:STM32 串口 作者:admin 來(lái)源:不詳 發(fā)布時(shí)間:2018-05-18  瀏覽:13

STM32串口發(fā)送必須先檢測(cè)狀態(tài),否則第一個(gè)字節(jié)無(wú)法發(fā)出,發(fā)送完畢,必須檢測(cè)發(fā)送狀態(tài)是否完成,否則,發(fā)送不成功,使用stm32f10x調(diào)試串口通訊時(shí),發(fā)現(xiàn)一個(gè)出錯(cuò)的現(xiàn)象,硬件復(fù)位重啟之后,發(fā)送測(cè)試數(shù)據(jù)0x01 0x02 0x03 0x04..接收端收到的數(shù)據(jù)為:0x02 0x03 0x04,第一個(gè)數(shù)據(jù)丟失。換成發(fā)送別的數(shù)值的數(shù)據(jù),如0x06 0x0ff,則接收到0x0ff,0x06丟失。錯(cuò)誤依舊。

故障排除過(guò)程:

1、剛開(kāi)始懷疑是接收端的錯(cuò)誤,我是使用電腦串口,運(yùn)行串口輔助調(diào)試工具接收,換成其他軟件后,發(fā)現(xiàn)故障依舊,而且電腦軟件一直是開(kāi)啟狀態(tài),不像和電腦軟件有關(guān)。

2、使用單步調(diào)試,單步運(yùn)行各個(gè)發(fā)送指令,都正常。能收到0x01 0x02 0x03 0x04的數(shù)據(jù)。間接的排除了不是電腦軟件的問(wèn)題,而是其他的錯(cuò)誤。

3、單步調(diào)試運(yùn)行雖然正常了,但連續(xù)運(yùn)行時(shí),錯(cuò)誤依舊,F(xiàn)在有點(diǎn)摸不到頭緒了,單步運(yùn)行正常,看起來(lái)編程沒(méi)有出錯(cuò),那故障在哪里呢?測(cè)試程序如下

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、猜測(cè),也許是因?yàn)槟硞(gè)特殊原因,使第二個(gè)數(shù)據(jù)覆蓋了首個(gè)數(shù)據(jù),使得首個(gè)數(shù)據(jù)丟失。假設(shè):在執(zhí)行B指令時(shí),USART的 TC 狀態(tài)位==SET,那么就會(huì)緊接著執(zhí)行C指令,也就有可能發(fā)生數(shù)據(jù)的覆蓋。于是,在A指令前,加入如下指令:USART_ClearFlag(USART2,USART_FLAG_TC);

5、加入上一條指令后,運(yùn)行,錯(cuò)誤消失了。說(shuō)明上一個(gè)假設(shè),應(yīng)該是成立的。

6、查閱stm32f10x參考手冊(cè),找到這樣一句話(huà):

TC:發(fā)送完成

當(dāng)包含有數(shù)據(jù)的一幀發(fā)送完成后,由硬件將該位置位。如果USART_CR1中的TCIE為1,則產(chǎn)生中斷。由軟件序列清除該位(先讀USART_SR,然后寫(xiě)入U(xiǎn)SART_DR)。TC位 也可以通過(guò)寫(xiě)入0來(lái)清除,只有在多緩存通訊中才推薦這種清除程序。

0:發(fā)送還未完成;1:發(fā)送完成。

7、注意到這一句:由軟件序列清除該位(先讀USART_SR,然后寫(xiě)入U(xiǎn)SART_DR)。 也就是說(shuō),要先read USART_SR,然后write USART_DR,才能完成TC狀態(tài)位的清除。而硬件復(fù)位后,串口發(fā)送的首個(gè)數(shù)據(jù)之前沒(méi)有read SR的操作,是直接write DR,也就是說(shuō),TC沒(méi)有被清除掉。 說(shuō)明第4步的猜測(cè)是對(duì)的。

8、那么,應(yīng)該把指令A(yù)前面加的USART_ClearFlag(USART2,USART_FLAG_TC); 改為USART_GetFlagStatus(USART2, USART_FLAG_TC);,應(yīng)該也能消除錯(cuò)誤。測(cè)試后證實(shí),確實(shí)如此,在發(fā)送首個(gè)數(shù)據(jù)之前,先讀取一下USART_SR,那么就不會(huì)出現(xiàn)首個(gè)數(shù)據(jù)丟失的情況了。

9、總結(jié):硬件復(fù)位后,串口發(fā)送首個(gè)數(shù)據(jù)之前,先讀取一下USART_SR,則能夠保證首個(gè)數(shù)據(jù)發(fā)送時(shí),不出現(xiàn)覆蓋的情況。當(dāng)然,也有別的方法,比如先清除TC狀態(tài)位,或是,在write USART_DR之后,加入一個(gè)小延時(shí),讓數(shù)據(jù)發(fā)送完畢,應(yīng)該也能間接排除這個(gè)錯(cuò)誤。

編輯:admin  最后修改時(shí)間:2018-05-18

聯(lián)系方式

0755-82591179

傳真:0755-82591176

郵箱:vicky@yingtexin.net

地址:深圳市龍華區(qū)民治街道民治大道973萬(wàn)眾潤(rùn)豐創(chuàng)業(yè)園A棟2樓A08

Copyright © 2014-2023 穎特新科技有限公司 All Rights Reserved.  粵ICP備14043402號(hào)-4

景德镇市| 全州县| 凤冈县| 锡林郭勒盟| 旌德县| 吕梁市| 鄱阳县| 阿拉尔市| 凉城县| 资溪县| 芷江| 宽城| 高雄市| 讷河市| 巴林左旗| 常山县| 金堂县| 蓝田县| 富源县| 贡觉县| 无棣县| 平乡县| 达州市| 射阳县| 若尔盖县| 陆良县| 平度市| 庄河市| 久治县| 枣阳市| 峨边| 呼玛县| 恩施市| 巴塘县| 兴城市| 内乡县| 杂多县| 阿城市| 荥经县| 台湾省| 西昌市|