欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 86721|回復(fù): 146
打印 上一主題 下一主題
收起左側(cè)

STM32串口接收不定長數(shù)據(jù)原理與源程序

  [復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:91350 發(fā)表于 2015-10-29 23:09 | 只看該作者 |只看大圖 回帖獎勵(lì) |倒序?yàn)g覽 |閱讀模式
今天說一下STM32單片機(jī)的接收不定長度字節(jié)數(shù)據(jù)的方法。由于STM32單片機(jī)帶IDLE中斷,所以利用這個(gè)中斷,可以接收不定長字節(jié)的數(shù)據(jù),由于STM32屬于ARM單片機(jī),所以這篇文章的方法也適合其他的ARM單片機(jī)。
IDLE中斷什么時(shí)候發(fā)生?
IDLE就是串口收到一幀數(shù)據(jù)后,發(fā)生的中斷。什么是一幀數(shù)據(jù)呢?比如說給單片機(jī)一次發(fā)來1個(gè)字節(jié),或者一次發(fā)來8個(gè)字節(jié),這些一次發(fā)來的數(shù)據(jù),就稱為一幀數(shù)據(jù),也可以叫做一包數(shù)據(jù)。
如何判斷一幀數(shù)據(jù)結(jié)束,就是我們今天討論的問題。因?yàn)楹芏囗?xiàng)目中都要用到這個(gè),因?yàn)橹挥薪邮盏揭粠瑪?shù)據(jù)以后,你才可以判斷這次收了幾個(gè)字節(jié)和每個(gè)字節(jié)的內(nèi)容是否符合協(xié)議要求。
看了前面IDLE中斷的定義,你就會明白了,一幀數(shù)據(jù)結(jié)束后,就會產(chǎn)生IDLE中斷。這個(gè)中斷真是太TMD有用了。省去了好多判斷的麻煩。
如何配置好IDLE中斷?
下面我們就配置好串口IDLE中斷吧。

這是串口CR1寄存器,其中,對bit4寫1開啟IDLE中斷,對bit5寫1開啟接收數(shù)據(jù)中斷。(注意:不同系列的STM32,對應(yīng)的寄存器位可能不同)
(RXNE中斷和IDLE中斷的區(qū)別?
當(dāng)接收到1個(gè)字節(jié),就會產(chǎn)生RXNE中斷,當(dāng)接收到一幀數(shù)據(jù),就會產(chǎn)生IDLE中斷。比如給單片機(jī)一次性發(fā)送了8個(gè)字節(jié),就會產(chǎn)生8次RXNE中斷,1次IDLE中斷。)

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

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

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

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

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

  1. /**
  2.   ******************************************************************************
  3.   * @file    串口接收不定長字節(jié)數(shù)據(jù)
  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幀數(shù)據(jù)
  31.                 {
  32.                         ReceiveState=0;
  33.                         i=0;

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


復(fù)制代碼

   

評分

參與人數(shù) 14黑幣 +99 收起 理由
黑夜問白天-YEJ + 12 絕世好帖!
wzb1003 + 30
Tony不吃辣 + 24 回帖助人的獎勵(lì)!
菜雞一只314159 + 5 絕世好帖!
tangchenfei + 5 很給力!
kqk123 + 1 很給力!
電子星辰 + 1 贊一個(gè)!
JULIS + 5 很給力!
Zeuphoria + 4 贊一個(gè)!
1111_1111 + 5 共享資料的黑幣獎勵(lì)!
kkkMill + 2 很棒,正好需要這一塊的東西,謝謝樓主
xiaoguaishou + 1 很給力!
panx + 2 很給力!
jsnjzhw + 2 贊一個(gè)!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏48 分享淘帖 頂24 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:91390 發(fā)表于 2016-2-1 21:59 | 只看該作者
好詳細(xì)的帖子,謝謝lz
回復(fù)

使用道具 舉報(bào)

板凳
ID:105982 發(fā)表于 2016-2-21 19:27 | 只看該作者
程序下來試了,IDLE進(jìn)不了啊!
回復(fù)

使用道具 舉報(bào)

地板
ID:109266 發(fā)表于 2016-3-17 08:13 | 只看該作者
這兩天正在琢磨STM32F103的串口中斷處理程序,之前以為只能一個(gè)字節(jié)一個(gè)字節(jié)接收,多謝樓主提醒還有IDLE這個(gè)幀數(shù)據(jù)接收,大愛啊!
回復(fù)

使用道具 舉報(bào)

5#
ID:109266 發(fā)表于 2016-3-17 08:13 | 只看該作者
這兩天正在琢磨STM32F103的串口中斷處理程序,之前以為只能一個(gè)字節(jié)一個(gè)字節(jié)接收,多謝樓主提醒還有IDLE這個(gè)幀數(shù)據(jù)接收,大愛啊!
回復(fù)

使用道具 舉報(bào)

6#
ID:110407 發(fā)表于 2016-3-23 17:50 | 只看該作者
好標(biāo)記
回復(fù)

使用道具 舉報(bào)

7#
ID:114928 發(fā)表于 2016-4-18 15:13 | 只看該作者
謝謝樓主的分享,太贊了,終于解決我這個(gè)不定長GPS信息的接收問題了,贊贊贊
回復(fù)

使用道具 舉報(bào)

8#
ID:114928 發(fā)表于 2016-4-18 15:19 | 只看該作者
woodman100 發(fā)表于 2016-2-21 19:27
程序下來試了,IDLE進(jìn)不了啊!

你進(jìn)不了嗎?我就是參考了 這個(gè)思想,很棒啊!你看看是不是板子的型號不對,他這是F1的,修改程序,和你的板子相稱
回復(fù)

使用道具 舉報(bào)

9#
ID:115692 發(fā)表于 2016-4-21 14:09 | 只看該作者
感覺挺不錯(cuò),之前還有個(gè)什么串口延時(shí)處理,要是這個(gè)能用的話都不用那么麻煩了
回復(fù)

使用道具 舉報(bào)

10#
ID:119763 發(fā)表于 2016-5-10 13:28 | 只看該作者
贊,解決了我的問題
回復(fù)

使用道具 舉報(bào)

11#
ID:122041 發(fā)表于 2016-5-19 21:05 | 只看該作者
太感謝樓主了
回復(fù)

使用道具 舉報(bào)

12#
ID:122041 發(fā)表于 2016-5-19 21:06 | 只看該作者
感謝樓主
回復(fù)

使用道具 舉報(bào)

13#
ID:122221 發(fā)表于 2016-5-20 18:57 | 只看該作者
謝謝樓主分享,幫了大忙。。。。。。。
回復(fù)

使用道具 舉報(bào)

14#
ID:117525 發(fā)表于 2016-5-21 00:22 來自觸屏版 | 只看該作者
正在學(xué)這個(gè),給點(diǎn)贊樓主
回復(fù)

使用道具 舉報(bào)

15#
ID:120530 發(fā)表于 2016-5-30 10:49 | 只看該作者
為什么最后串口發(fā)送的數(shù)據(jù)總是有個(gè)別數(shù)據(jù)丟失了呢?
回復(fù)

使用道具 舉報(bào)

16#
ID:120530 發(fā)表于 2016-5-30 10:50 | 只看該作者
樓主,為什么最好發(fā)送的數(shù)據(jù)總是有個(gè)別的數(shù)據(jù)丟失了呢?
回復(fù)

使用道具 舉報(bào)

17#
ID:120530 發(fā)表于 2016-5-30 11:08 | 只看該作者
樓主,波特率為9600的時(shí)候數(shù)據(jù)是正確的,當(dāng)波特率設(shè)置為115200時(shí),數(shù)據(jù)就不正確了,為什么呢?
回復(fù)

使用道具 舉報(bào)

18#
ID:124166 發(fā)表于 2016-5-31 08:52 | 只看該作者
真心是太TMD有用了
回復(fù)

使用道具 舉報(bào)

19#
ID:126634 發(fā)表于 2016-6-14 10:40 | 只看該作者
大家好,我是新來的,就像樓主說的方法我也試了,只不過是用的UART4,在發(fā)送的時(shí)候也是有數(shù)據(jù)丟失,是什么原因呢
回復(fù)

使用道具 舉報(bào)

20#
ID:126864 發(fā)表于 2016-6-15 16:05 | 只看該作者
zhichizhichi
回復(fù)

使用道具 舉報(bào)

21#
ID:103617 發(fā)表于 2016-6-30 17:21 | 只看該作者
非常謝謝。
回復(fù)

使用道具 舉報(bào)

22#
ID:128839 發(fā)表于 2016-7-1 17:02 | 只看該作者
學(xué)習(xí)了
回復(fù)

使用道具 舉報(bào)

23#
ID:130030 發(fā)表于 2016-7-11 15:40 來自觸屏版 | 只看該作者
好東西,謝謝!
回復(fù)

使用道具 舉報(bào)

24#
ID:134419 發(fā)表于 2016-7-20 20:53 | 只看該作者
好東西,學(xué)習(xí)了。
回復(fù)

使用道具 舉報(bào)

25#
ID:123377 發(fā)表于 2016-7-21 09:20 | 只看該作者
非常有用,modbus可以用上 前面說的9600可以有這個(gè)情況嗎
回復(fù)

使用道具 舉報(bào)

26#
ID:6553 發(fā)表于 2016-7-22 11:27 | 只看該作者
謝謝樓主的分享,太贊了
回復(fù)

使用道具 舉報(bào)

27#
ID:136557 發(fā)表于 2016-8-11 20:58 | 只看該作者

感謝樓主
回復(fù)

使用道具 舉報(bào)

28#
ID:136869 發(fā)表于 2016-8-16 11:13 | 只看該作者
很好,學(xué)習(xí)學(xué)習(xí)!
回復(fù)

使用道具 舉報(bào)

29#
ID:136903 發(fā)表于 2016-8-16 16:36 | 只看該作者
一直在找方法到底怎么做!!!!!!!!!!!!
回復(fù)

使用道具 舉報(bào)

30#
ID:136903 發(fā)表于 2016-8-17 16:55 | 只看該作者
真心的良心帖子
回復(fù)

使用道具 舉報(bào)

31#
ID:136987 發(fā)表于 2016-8-17 18:08 | 只看該作者
強(qiáng)!!!!為;樓主的態(tài)度點(diǎn)贊!!
回復(fù)

使用道具 舉報(bào)

32#
ID:137439 發(fā)表于 2016-8-23 23:41 來自觸屏版 | 只看該作者
謝謝樓主的分享,太贊了
回復(fù)

使用道具 舉報(bào)

33#
ID:138053 發(fā)表于 2016-8-31 15:05 | 只看該作者
不錯(cuò),支持
回復(fù)

使用道具 舉報(bào)

34#
ID:136553 發(fā)表于 2016-9-25 21:56 | 只看該作者
繼續(xù)頂,終于有黑幣可以下載了
回復(fù)

使用道具 舉報(bào)

35#
ID:142422 發(fā)表于 2016-10-12 13:30 | 只看該作者

感謝樓主
回復(fù)

使用道具 舉報(bào)

36#
ID:75390 發(fā)表于 2016-10-12 15:11 | 只看該作者
感謝樓主教誨
回復(fù)

使用道具 舉報(bào)

37#
ID:61002 發(fā)表于 2016-10-13 16:48 | 只看該作者
好貼  推薦
回復(fù)

使用道具 舉報(bào)

38#
ID:143545 發(fā)表于 2016-10-20 10:26 | 只看該作者
正好需要串口傳速大量的數(shù)據(jù),不知道速度跟不跟得上
回復(fù)

使用道具 舉報(bào)

39#
ID:143559 發(fā)表于 2016-10-20 11:08 | 只看該作者
嗯,不錯(cuò)不錯(cuò),我之前還是使用流控制界定幀的,移植性好一點(diǎn),但是既然STM32自帶這個(gè)功能那為何不用呢,
回復(fù)

使用道具 舉報(bào)

40#
ID:146174 發(fā)表于 2016-11-5 09:37 | 只看該作者
兄弟,為什么我參考你的這個(gè)程序,串口助手發(fā)送11 22 33 44 55時(shí),單片機(jī)接收出現(xiàn)FF 11 22 33 44 55
回復(fù)

使用道具 舉報(bào)

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表