0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

stm32串口字節(jié)丟失怎么辦?

h1654155971.7688 ? 來(lái)源:互聯(lián)網(wǎng) ? 作者:佚名 ? 2017-11-06 11:51 ? 次閱讀

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

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

7、注意到這一句:由軟件序列清除該位(先讀USART_SR,然后寫入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ò)誤。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴

原文標(biāo)題:偵破STM32串口第一個(gè)字節(jié)丟失問(wèn)題

文章出處:【微信號(hào):weixin21ic,微信公眾號(hào):21ic電子網(wǎng)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    STM32串口發(fā)送數(shù)據(jù)和接收數(shù)據(jù)方式總結(jié)

    STM32串口發(fā)送數(shù)據(jù)和接收數(shù)據(jù)方式總結(jié)
    的頭像 發(fā)表于 09-19 09:14 ?7197次閱讀
    <b class='flag-5'>STM32</b><b class='flag-5'>串口</b>發(fā)送數(shù)據(jù)和接收數(shù)據(jù)方式總結(jié)

    stm32串口首次發(fā)送數(shù)據(jù)丟失的原因?怎么解決?

    stm32串口首次發(fā)送數(shù)據(jù)丟失的原因?怎么解決?
    發(fā)表于 12-13 07:15

    如何解決STM32串口輸出數(shù)據(jù)丟失問(wèn)題?

    如何解決STM32串口輸出數(shù)據(jù)丟失問(wèn)題?
    發(fā)表于 12-13 06:07

    stm32串口發(fā)送數(shù)據(jù)個(gè)數(shù)和上位機(jī)接收到的數(shù)據(jù)個(gè)數(shù)不匹配怎么辦?

    stm32串口發(fā)送數(shù)據(jù)個(gè)數(shù)和上位機(jī)接收到的數(shù)據(jù)個(gè)數(shù)不匹配怎么辦?
    發(fā)表于 12-13 07:23

    STM32串口ORE溢出怎么辦?

    STM32串口ORE溢出怎么辦?
    發(fā)表于 12-13 07:30

    stm32串口調(diào)試軟件

    電子發(fā)燒友網(wǎng)站提供《stm32串口調(diào)試軟件.rar》資料免費(fèi)下載
    發(fā)表于 09-06 16:59 ?6次下載

    STM32串口DMA問(wèn)題詳解

    昨天晚上在STM32串口DMA的問(wèn)題上糾結(jié)了好長(zhǎng)時(shí)間,所以今天上午寫篇博客來(lái)談?wù)勎覍?duì)串口DMA發(fā)送的理解。
    的頭像 發(fā)表于 10-27 16:16 ?8404次閱讀
    <b class='flag-5'>STM32</b><b class='flag-5'>串口</b>DMA問(wèn)題詳解

    STM32串口下載軟件FLYMCU免費(fèi)下載

    本文檔的主要內(nèi)容詳細(xì)介紹的是STM32串口下載軟件FLYMCU免費(fèi)下載。
    發(fā)表于 12-16 08:00 ?33次下載
    <b class='flag-5'>STM32</b><b class='flag-5'>串口</b>下載軟件FLYMCU免費(fèi)下載

    寫了個(gè)通用的stm32串口bootloader

    寫了個(gè)通用的stm32串口bootloader
    發(fā)表于 11-26 15:51 ?26次下載
    寫了個(gè)通用的<b class='flag-5'>stm32</b><b class='flag-5'>串口</b>bootloader

    STM32串口通訊

    STM32串口通訊USART串口通信實(shí)踐USART串口通信實(shí)踐1、實(shí)驗(yàn)環(huán)境參考資料 野火官方的 《零死角玩轉(zhuǎn)STM32—F103指南者
    發(fā)表于 12-06 20:21 ?13次下載
    <b class='flag-5'>STM32</b><b class='flag-5'>串口</b>通訊

    stm32串口代碼詳解

    stm32串口
    發(fā)表于 12-24 18:38 ?52次下載
    <b class='flag-5'>stm32</b><b class='flag-5'>串口</b>代碼詳解

    stm32串口

    DMA發(fā)送緩存區(qū)bsp_usart.cbsp_usart.hisr.c基于stm32f103zet6串口發(fā)送使用DMA發(fā)送大致說(shuō)明USART_Rx_Sbuffer二維數(shù)組 -> 串口接收緩存區(qū)? 一共3行 Rx_Sbuffe
    發(fā)表于 12-24 18:55 ?20次下載
    <b class='flag-5'>stm32</b><b class='flag-5'>串口</b>

    STM32串口1通訊實(shí)驗(yàn)程序下載

    STM32串口1通訊實(shí)驗(yàn)程序下載
    發(fā)表于 12-30 10:34 ?83次下載

    STM32F105RBT6串口程序

    STM32F105RBT6串口程序免費(fèi)下載。
    發(fā)表于 07-06 16:51 ?7次下載

    STM32串口通信簡(jiǎn)明知識(shí)

    STM32串口通信簡(jiǎn)明知識(shí)
    的頭像 發(fā)表于 10-25 15:48 ?1273次閱讀
    <b class='flag-5'>STM32</b><b class='flag-5'>串口</b>通信簡(jiǎn)明知識(shí)