久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

標題: STM32串口接收不定長數據原理與源程序 [打印本頁]

作者: piaolin    時間: 2015-10-29 23:09
標題: STM32串口接收不定長數據原理與源程序
今天說一下STM32單片機的接收不定長度字節數據的方法。由于STM32單片機帶IDLE中斷,所以利用這個中斷,可以接收不定長字節的數據,由于STM32屬于ARM單片機,所以這篇文章的方法也適合其他的ARM單片機。
IDLE中斷什么時候發生?
IDLE就是串口收到一幀數據后,發生的中斷。什么是一幀數據呢?比如說給單片機一次發來1個字節,或者一次發來8個字節,這些一次發來的數據,就稱為一幀數據,也可以叫做一包數據。
如何判斷一幀數據結束,就是我們今天討論的問題。因為很多項目中都要用到這個,因為只有接收到一幀數據以后,你才可以判斷這次收了幾個字節和每個字節的內容是否符合協議要求。
看了前面IDLE中斷的定義,你就會明白了,一幀數據結束后,就會產生IDLE中斷。這個中斷真是太TMD有用了。省去了好多判斷的麻煩。
如何配置好IDLE中斷?
下面我們就配置好串口IDLE中斷吧。

這是串口CR1寄存器,其中,對bit4寫1開啟IDLE中斷,對bit5寫1開啟接收數據中斷。(注意:不同系列的STM32,對應的寄存器位可能不同)
(RXNE中斷和IDLE中斷的區別?
當接收到1個字節,就會產生RXNE中斷,當接收到一幀數據,就會產生IDLE中斷。比如給單片機一次性發送了8個字節,就會產生8次RXNE中斷,1次IDLE中斷。)

這是狀態寄存器,當串口接收到數據時,bit5就會自動變成1,當接收完一幀數據后,bit4就會變成1.
需要注意的是,在中斷函數里面,需要把對應的位清0,否則會影響下一次數據的接收。比如RXNE接收數據中斷,只要把接收到的一個字節讀出來,就會清除這個中斷。IDLE中斷,如何是F0系列的單片機,需要用ICR寄存器來清除,如果是F1系列的單片機,清除方法是“先讀SR寄存器,再讀DR寄存器”。(我怎么知道?手冊上寫的)
下面以STM32F103為例給出源程序。
我們先來看程序中的主要部分。
串口初始化函數片段

如果你原來的串口初始化函數具有打開串口接收中斷的話,實際上就是在初始化函數中多了一條打開空閑中斷的語句。
串口中斷函數

串口中斷函數里面,最重要的兩條語句,就是上圖中圈出來的兩條語句。第一條語句用來判斷是否接收到1個字節,第二條語句用來判斷是否接收到1幀數據。(是不是感覺超級方便?媽媽再也不用擔心我如何判斷是否接收完1幀數據了。)
主函數

我寫的這個主函數,是用來驗證接收的正確性的。RxCounter表示的是這一幀數據有幾個字節,接收完一幀數據,會在中斷函數里面把ReceiveState置1,然后,通過串口把接收到的數據發送回串口。這樣,既驗證了接收了多少字節的正確性,又驗證了接收到的數據是否正確。

上圖是結果驗證。
點擊下載源程序: STM32串口接收不定長數據程序.7z (207.13 KB, 下載次數: 1812)
                                       
                                我是瑞生,毫無保留的給大家透露電子設計經驗,不定時分享實用的落地的電子設計技巧,希望能夠幫助到大家。   

  1. /**
  2.   ******************************************************************************
  3.   * @file    串口接收不定長字節數據
  4.   * @author  瑞生
  5.   * @version V1.0
  6.   * @date    2015.10.23
  7.   * @brief   Main program body
  8.   ******************************************************************************
  9.   ******************************************************************************
  10.   */  

  11. /* Includes ------------------------------------------------------------------*/
  12. #include "stm32f10x.h"
  13. #include "uart.h"


  14. volatile uint8_t aRxBuffer[100]={0x00};
  15. volatile uint8_t RxCounter=0;
  16. volatile uint8_t ReceiveState=0;
  17. /**
  18.   * @brief  Main program.
  19.   * @param  None
  20.   * @retval None
  21.   */
  22. int main(void)
  23. {
  24.         uint8_t i=0;
  25.         
  26.         USART1_Init();
  27.         
  28.   while (1)
  29.   {
  30.                 if(ReceiveState==1)//如果接收到1幀數據
  31.                 {
  32.                         ReceiveState=0;
  33.                         i=0;

  34.                         while(RxCounter--)// 把接收到數據發送回串口
  35.                         {
  36.                                 USART_SendData(USART1, aRxBuffer[i++]);        
  37.                                 while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET);
  38.                         }
  39.                         RxCounter=0;
  40.                 }
  41.   }
  42. }


復制代碼

   

作者: 0406445    時間: 2016-2-1 21:59
好詳細的帖子,謝謝lz
作者: woodman100    時間: 2016-2-21 19:27
程序下來試了,IDLE進不了啊!

作者: My_Skity    時間: 2016-3-17 08:13
這兩天正在琢磨STM32F103的串口中斷處理程序,之前以為只能一個字節一個字節接收,多謝樓主提醒還有IDLE這個幀數據接收,大愛啊!
作者: My_Skity    時間: 2016-3-17 08:13
這兩天正在琢磨STM32F103的串口中斷處理程序,之前以為只能一個字節一個字節接收,多謝樓主提醒還有IDLE這個幀數據接收,大愛啊!
作者: duckfans    時間: 2016-3-23 17:50
好標記
作者: seu_zhang    時間: 2016-4-18 15:13
謝謝樓主的分享,太贊了,終于解決我這個不定長GPS信息的接收問題了,贊贊贊
作者: seu_zhang    時間: 2016-4-18 15:19
woodman100 發表于 2016-2-21 19:27
程序下來試了,IDLE進不了啊!

你進不了嗎?我就是參考了 這個思想,很棒啊!你看看是不是板子的型號不對,他這是F1的,修改程序,和你的板子相稱
作者: 舞者0068    時間: 2016-4-21 14:09
感覺挺不錯,之前還有個什么串口延時處理,要是這個能用的話都不用那么麻煩了
作者: hdfjg    時間: 2016-5-10 13:28
贊,解決了我的問題
作者: 打醬油+1    時間: 2016-5-19 21:05
太感謝樓主了
作者: 打醬油+1    時間: 2016-5-19 21:06
感謝樓主
作者: doer    時間: 2016-5-20 18:57
謝謝樓主分享,幫了大忙。。。。。。。
作者: MUCV    時間: 2016-5-21 00:22
正在學這個,給點贊樓主
作者: sqhua333    時間: 2016-5-30 10:49
為什么最后串口發送的數據總是有個別數據丟失了呢?
作者: sqhua333    時間: 2016-5-30 10:50
樓主,為什么最好發送的數據總是有個別的數據丟失了呢?

作者: sqhua333    時間: 2016-5-30 11:08
樓主,波特率為9600的時候數據是正確的,當波特率設置為115200時,數據就不正確了,為什么呢?
作者: mardin    時間: 2016-5-31 08:52
真心是太TMD有用了
作者: yaoyanyan    時間: 2016-6-14 10:40
大家好,我是新來的,就像樓主說的方法我也試了,只不過是用的UART4,在發送的時候也是有數據丟失,是什么原因呢
作者: lamdota    時間: 2016-6-15 16:05
zhichizhichi
作者: phantomplus    時間: 2016-6-30 17:21
非常謝謝。
作者: a7250658    時間: 2016-7-1 17:02
學習了

作者: 遺忘的心    時間: 2016-7-11 15:40
好東西,謝謝!
作者: 默默成長    時間: 2016-7-20 20:53
好東西,學習了。
作者: tanliang    時間: 2016-7-21 09:20
非常有用,modbus可以用上 前面說的9600可以有這個情況嗎
作者: senzh01    時間: 2016-7-22 11:27
謝謝樓主的分享,太贊了
作者: 1321498219    時間: 2016-8-11 20:58

感謝樓主
作者: biyaoyzs    時間: 2016-8-16 11:13
很好,學習學習!
作者: faguoduifangui    時間: 2016-8-16 16:36
一直在找方法到底怎么做!!!!!!!!!!!!
作者: faguoduifangui    時間: 2016-8-17 16:55
真心的良心帖子
作者: qscdianzhi    時間: 2016-8-17 18:08
強!!!!為;樓主的態度點贊!!
作者: intersetings    時間: 2016-8-23 23:41
謝謝樓主的分享,太贊了
作者: tubage    時間: 2016-8-31 15:05
不錯,支持
作者: vitasnokia    時間: 2016-9-25 21:56
繼續頂,終于有黑幣可以下載了
作者: 單片機初始化    時間: 2016-10-12 13:30

感謝樓主
作者: johnsonxjq    時間: 2016-10-12 15:11
感謝樓主教誨
作者: g753388438    時間: 2016-10-13 16:48
好貼  推薦
作者: whole_hope    時間: 2016-10-20 10:26
正好需要串口傳速大量的數據,不知道速度跟不跟得上
作者: tangquan    時間: 2016-10-20 11:08
嗯,不錯不錯,我之前還是使用流控制界定幀的,移植性好一點,但是既然STM32自帶這個功能那為何不用呢,
作者: jackouy    時間: 2016-11-5 09:37
兄弟,為什么我參考你的這個程序,串口助手發送11 22 33 44 55時,單片機接收出現FF 11 22 33 44 55
作者: dmgy343    時間: 2016-11-14 15:34
好辦法,下次嘗試使用這種方法
作者: jzxiecl    時間: 2016-11-15 17:28
果然是良心貼,頂。。。。。。。。
作者: 709360416    時間: 2016-11-17 14:16
我用的是串口2,但是不通
作者: bing20138    時間: 2016-11-22 13:15
這個方式很贊!!!!
作者: 1725591298    時間: 2016-12-12 16:11
8錯~~~
作者: ljy773945726    時間: 2016-12-12 18:40
謝謝樓主分享,先收藏下!!!
作者: ljy773945726    時間: 2016-12-12 18:40
謝謝樓主分享!!!
作者: 520sky    時間: 2017-2-6 17:27
試了好多網上的idle+dma的都不行
作者: 520sky    時間: 2017-2-7 15:31
不知道怎么回事就是進不了 IDLE
作者: 332052001    時間: 2017-2-26 12:36
我曹這個功能太有用了,以前做51的時候都是定了長度的
作者: jasonyu    時間: 2017-2-27 09:51
樓主你好,為什么我按照你的程序這樣改的,那個idle中斷每個字節都進呢
作者: zhang135789    時間: 2017-3-4 09:23
良心貼,很有用處,只是修改
作者: xiangyang123    時間: 2017-3-4 14:57
好貼必須頂上去,贊贊贊贊贊贊贊贊贊贊贊贊贊贊贊贊贊贊贊贊贊贊贊贊贊贊贊贊贊贊贊贊贊贊贊贊贊贊贊贊贊贊
作者: splendid    時間: 2017-3-4 16:03
大兄弟,用了五黑幣下下來,連中斷程序都沒有是怎么回事??
作者: museum    時間: 2017-3-27 13:56
誰下載了給我一份  qq  1952488652
我積分不夠,謝謝
作者: cm7626    時間: 2017-4-8 11:14
講解的很詳細 大家需要你這樣的高手
作者: jdm2005    時間: 2017-4-26 13:22
高手,謝謝知道
作者: 落雁秋莎    時間: 2017-4-27 10:59
很好,希望有所幫助
作者: hongqintin    時間: 2017-5-18 11:36
好貼,謝謝樓主
作者: xiaoyue92    時間: 2017-5-19 18:16
我遇到和上面同志一樣的問題  有數據丟失現象  樓主能解下禍嗎
作者: 樹葉的人生    時間: 2017-5-20 10:36
這個真的很有用啊,謝謝分享,很有幫助的
作者: worinidege    時間: 2017-5-23 14:08
就是不知道后面的abuffer是怎么處理的
作者: victor6611    時間: 2017-6-12 09:40
不錯,下載學習,學習
作者: dzfree    時間: 2017-6-30 15:56
很詳細很經典的帖子,苦無頭緒的串口終于搞定了  謝謝謝謝謝謝謝謝 謝謝謝謝
作者: sfd123    時間: 2017-7-1 10:28
什么原理呢?單片機根據波特率自己得到一個幀超時時間?
作者: cqh757128    時間: 2017-7-4 08:28
很棒,正好需要這一塊的東西,謝謝樓主
作者: 君臨天下尹成    時間: 2017-8-4 16:33
很實用                  
作者: Allaneil    時間: 2017-9-13 10:40
感謝樓之分享
作者: 穿山躍海    時間: 2017-11-23 23:34
下來試試,借鑒一下,最近正在調這個東西
作者: www76307a    時間: 2017-12-5 16:45
好詳細的帖子,謝謝lz
作者: 竹軒2018    時間: 2018-1-2 23:27
給力樓主!謝謝分享!
作者: fan5572283    時間: 2018-1-7 15:22
感謝樓主
作者: xjjwws    時間: 2018-1-16 17:01
好東西,值得大家下載。原樓主多多奉獻,不慎感激
作者: whj4674672    時間: 2018-3-19 11:06
好東西,正好有用
作者: 278821852    時間: 2018-3-27 19:51
好東西,謝謝樓主分享!
作者: 564646546465    時間: 2018-3-29 16:34
贊贊贊!!!!!!程序試過了,沒問題
作者: gaojian218    時間: 2018-4-3 22:32
好詳細的帖子,謝謝lz
作者: wutuobangs    時間: 2018-4-8 14:02
感謝樓主分享
作者: fly_confidence    時間: 2018-5-22 22:14
好詳細的帖子,謝謝lz
作者: ljjmust    時間: 2018-5-25 09:36
真的很方便,非常感謝。
作者: caosongze    時間: 2018-6-2 17:04
收益匪淺
作者: user5448    時間: 2018-6-4 12:50
長知識了 感謝無私分享
作者: Jesus    時間: 2018-7-7 13:42
新手簽到,謝謝
作者: 一世界    時間: 2018-7-11 11:15
  牛逼  簡直學到了  
作者: 小歐陽    時間: 2018-7-12 17:31
我也用了出了一些問題
作者: kaneky    時間: 2018-7-31 14:09
學習了,謝謝樓主!
作者: 離落城    時間: 2018-10-12 13:10
很給力!
作者: hwasun    時間: 2018-11-6 10:29
感覺挺不錯,之前還有個什么串口延時處理,要是這個能用的話都不用那么麻煩了
作者: wdliming    時間: 2018-11-13 08:44
標記一下~~~~~
作者: guguren    時間: 2018-11-19 15:32
學習下,新手
作者: 離落城    時間: 2018-12-2 15:13
先收藏了,有空一定試試
作者: SKYlink    時間: 2018-12-3 09:15
厲害厲害   
作者: Xchonger    時間: 2018-12-4 11:01
不錯 ,學習到了
作者: Adey楊    時間: 2018-12-17 13:35
有沒有庫函數版本的代碼呢,寄存器不會
作者: bucker    時間: 2018-12-21 21:54
雖然已經用過,確實非常好用,還是為樓主點贊。
作者: 天風情    時間: 2018-12-24 16:43
正學習中斷呢,看了好多程序,目前看到的只有這個比較好
作者: 天風情    時間: 2018-12-24 16:44
jackouy 發表于 2016-11-5 09:37
**** 作者被禁止或刪除 內容自動屏蔽 ****

是不是上電的時候多發的?你上電穩定后把接收數據清除一下,再發送試試看
作者: amesim2019    時間: 2019-4-17 13:52
太感謝樓主了
作者: jiaxiangqi    時間: 2019-5-14 20:53
非常感謝樓主分享
作者: Caramel2    時間: 2019-6-30 19:43
謝謝樓主分享!




歡迎光臨 (http://www.zg4o1577.cn/bbs/) Powered by Discuz! X3.1
主站蜘蛛池模板: 欧美freesex黑人又粗又大 | 在线观看免费观看在线91 | 人人爽日日躁夜夜躁尤物 | 国产精品永久免费 | 国产综合久久 | 国产视频中文字幕 | 国产精品美女久久久av超清 | 99免费在线视频 | 国产乱码精品一区二区三区忘忧草 | www成人免费视频 | 99九九久久 | 亚洲一区二区免费视频 | 国产成人麻豆免费观看 | 在线观看日本高清二区 | 国产特级毛片 | 情侣酒店偷拍一区二区在线播放 | 国产成人亚洲精品 | 国产日韩久久 | 亚洲第一色av | 欧洲成人免费视频 | 色av一区二区三区 | 国产精品一区二区三区四区 | 亚洲精品免费在线 | 午夜视频一区二区 | 人人鲁人人莫人人爱精品 | 亚洲交性 | 国产激情视频在线免费观看 | 久久91精品 | 人操人人 | 日本三级电影在线观看视频 | 成人美女免费网站视频 | 黑人精品xxx一区一二区 | 久久久91精品国产一区二区三区 | 日韩在线视频精品 | 日韩欧美高清 | 奇米久久久 | 日韩av在线一区二区 | 天天干天天色 | 国产精品久久毛片av大全日韩 | 国产精品免费观看视频 | 亚洲欧美精品一区 |