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

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

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

stm32串口中斷接收方式詳細(xì)比較

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:277793 發(fā)表于 2018-4-12 11:57 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
串口調(diào)試,以前也調(diào)過,只是沒這么深入的琢磨過,最近又在弄,感覺串口很基本,也很有學(xué)問,要是出現(xiàn)BUG可能導(dǎo)致系統(tǒng)奔潰。。,F(xiàn)在貼出來,歡迎拍磚指正!!

本例程通過PC機(jī)的串口調(diào)試助手將數(shù)據(jù)發(fā)送至STM32,STM32通過SP3232芯片采用中斷接收方式完成,然后接收數(shù)據(jù)后將所接收的數(shù)據(jù)又發(fā)送至PC機(jī),具體下面詳談。。。

實(shí)例一:
void USART1_IRQHandler(u8 GetData)
{
u8 BackData;
if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) //中斷產(chǎn)生
{
USART_ClearITPendingBit(USART1,USART_IT_RXNE); //清除中斷標(biāo)志.
                  GetData = UART1_GetByte(BackData);   //也行GetData=USART1->DR;  
USART1_SendByte(GetData);      //發(fā)送數(shù)據(jù)

GPIO_SetBits(GPIOE, GPIO_Pin_8 ); //LED閃爍,接收成功發(fā)送完成
delay(1000);
GPIO_ResetBits(GPIOE, GPIO_Pin_8 );
}
}  
這是最基本的,將數(shù)據(jù)接收完成后又發(fā)送出去,接收和發(fā)送在中斷函數(shù)里執(zhí)行,main函數(shù)里無其他要處理的。
優(yōu)點(diǎn):簡(jiǎn)單,適合很少量數(shù)據(jù)傳輸。
缺點(diǎn):無緩存區(qū),并且對(duì)數(shù)據(jù)的正確性沒有判斷,數(shù)據(jù)量稍大可能導(dǎo)致數(shù)據(jù)丟失 。


實(shí)例二:
void USART2_IRQHandler()
{
if(USART_GetITStatus(USART2,USART_IT_RXNE) != RESET) //中斷產(chǎn)生
{
USART_ClearITPendingBit(USART2,USART_IT_RXNE); //清除中斷標(biāo)志
Uart2_Buffer[Uart2_Rx_Num] = USART_ReceiveData(USART2);
Uart2_Rx_Num++;
}


if((Uart2_Buffer[0] == 0x5A)&&(Uart2_Buffer[Uart2_Rx_Num-1] == 0xA5))  //判斷最后接收的數(shù)據(jù)是否為設(shè)定值,確定數(shù)據(jù)正確性
Uart2_Sta=1;
if(USART_GetFlagStatus(USART2,USART_FLAG_ORE) == SET) //溢出
{
USART_ClearFlag(USART2,USART_FLAG_ORE);  //讀SR
USART_ReceiveData(USART2); //讀DR
}   
}
  
if( Uart2_Sta )
{
for(Uart2_Tx_Num=0;Uart2_Tx_Num < Uart2_Rx_Num;Uart2_Tx_Num++)
USART2_SendByte(Uart2_Buffer[Uart2_Tx_Num]); //發(fā)送數(shù)據(jù)


Uart2_Rx_Num = 0; //初始化
Uart2_Tx_Num = 0;
Uart2_Sta = 0;
}
這是加了數(shù)據(jù)頭和數(shù)據(jù)尾的接收方式,數(shù)據(jù)頭和尾的個(gè)數(shù)可增加,此處只用于調(diào)試之用。中斷函數(shù)用于接收數(shù)據(jù)以及判斷數(shù)據(jù)的頭尾,第二個(gè)函數(shù)在main函數(shù)里按照查詢方式執(zhí)行。
優(yōu)點(diǎn):較簡(jiǎn)單,采用緩存區(qū)接收,對(duì)提高數(shù)據(jù)的正確行有一定的改善 。
缺點(diǎn):要是第一次數(shù)據(jù)接收錯(cuò)誤,回不到初始化狀態(tài),必須復(fù)位操作 。

實(shí)例三:
vvoid USART2_IRQHandler()
{
     if(USART_GetITStatus(USART2,USART_IT_RXNE) != RESET) //中斷產(chǎn)生
     {
        USART_ClearITPendingBit(USART2,USART_IT_RXNE); //清除中斷標(biāo)志.
        Uart2_Buffer[Uart2_Rx] = USART_ReceiveData(USART2);
        Uart2_Rx++;
        Uart2_Rx &= 0x3F; //判斷是否計(jì)數(shù)到最大
      }
      if(USART_GetFlagStatus(USART2,USART_FLAG_ORE) == SET) //溢出
      {
          USART_ClearFlag(USART2,USART_FLAG_ORE); //讀SR
          USART_ReceiveData(USART2); //讀DR
       }
}
  
if( Uart2_Tx != Uart2_Rx )
{
    USART2_SendByte(Uart2_Buffer[Uart2_Tx]); //發(fā)送數(shù)據(jù)
    Uart2_Tx++;
    Uart2_Tx &= 0x3F; //判斷是否計(jì)數(shù)到最大
}  
采用FIFO方式接收數(shù)據(jù),由0x3F可知此處最大接收量為64個(gè),可變,中斷函數(shù)只負(fù)責(zé)收,另一函數(shù)在main函數(shù)里執(zhí)行,F(xiàn)IFO方式發(fā)送。
優(yōu)點(diǎn):發(fā)送和接收都很自由,中斷占用時(shí)間少,有利于MCU處理其它。
缺點(diǎn):對(duì)數(shù)據(jù)的正確性沒有判斷,一概全部接收。

實(shí)例四:
void USART2_IRQHandler()
{
     if(USART_GetITStatus(USART2,USART_IT_RXNE) != RESET) //中斷產(chǎn)生
     {
       USART_ClearITPendingBit(USART2,USART_IT_RXNE); //清除中斷標(biāo)志
        Uart2_Buffer[Uart2_Rx] = USART_ReceiveData(USART2);
        Uart2_Rx++;
        Uart2_Rx &= 0xFF;
     }
     if(Uart2_Buffer[Uart2_Rx-1] == 0x5A) //頭
        Uart2_Tx = Uart2_Rx-1;
     if((Uart2_Buffer[Uart2_Tx] == 0x5A)&&(Uart2_Buffer[Uart2_Rx-1] == 0xA5)) //檢測(cè)到頭的情況下檢測(cè)到尾
     {
            Uart2_Len = Uart2_Rx-1- Uart2_Tx; //長(zhǎng)度
            Uart2_Sta=1; //標(biāo)志位
     }
     if(USART_GetFlagStatus(USART2,USART_FLAG_ORE) == SET) //溢出
     {
            USART_ClearFlag(USART2,USART_FLAG_ORE); //讀SR
            USART_ReceiveData(USART2); //讀DR
     }
}

if( Uart2_Sta )
{
        for(tx2=0;tx2 <= Uart2_Len;tx2++,Uart2_Tx++)
                USART2_SendByte(Uart2_Buffer[Uart2_Tx]); //發(fā)送數(shù)據(jù)
        Uart2_Rx = 0; //初始化
        Uart2_Tx = 0;
        Uart2_Sta = 0;
}

數(shù)據(jù)采用數(shù)據(jù)包的形式接收,接收后存放于緩存區(qū),通過判斷數(shù)據(jù)頭和數(shù)據(jù)尾(可變)來判斷數(shù)據(jù)的“包”及有效性,中斷函數(shù)用于接收數(shù)據(jù)和判斷頭尾以及數(shù)據(jù)包長(zhǎng)度,另一函數(shù)在main函數(shù)里執(zhí)行,負(fù)責(zé)發(fā)送該段數(shù)據(jù)。
優(yōu)點(diǎn):適合打包傳輸,穩(wěn)定性和可靠性很有保證,可隨意發(fā)送,自動(dòng)挑選有效數(shù)據(jù)。
缺點(diǎn):緩存區(qū)數(shù)據(jù)長(zhǎng)度要根據(jù)“包裹”長(zhǎng)度設(shè)定, 要是多次接收后無頭無尾,到有頭有尾的那一段數(shù)據(jù)恰好跨越緩存區(qū)最前和最后位置時(shí),可能導(dǎo)致本次數(shù)據(jù)丟失,不過這種情況幾乎沒有可能。

STM32串口中斷接收方式詳細(xì)比較.doc

37 KB, 下載次數(shù): 39, 下載積分: 黑幣 -5

主要描述串口中斷

評(píng)分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

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

使用道具 舉報(bào)

沙發(fā)
ID:359997 發(fā)表于 2018-6-27 09:57 | 只看該作者
樓主,我覺得應(yīng)該在發(fā)送函數(shù)里面,加一個(gè)1MS的延時(shí)為好,不然用串口調(diào)試助手可能顯示不出來
回復(fù)

使用道具 舉報(bào)

板凳
ID:359997 發(fā)表于 2018-6-27 11:18 | 只看該作者
有個(gè)BUG就是發(fā)送多個(gè)5A時(shí)候,會(huì)出問題,因?yàn)樗愠龅臄?shù)據(jù)長(zhǎng)度有問題
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 成人精品系列 | 久久久久国产一区二区三区四区 | 欧美在线不卡 | 免费精品视频在线观看 | 日韩欧美在线观看 | 99久热在线精品视频观看 | 超碰成人av | 国产成人精品一区二区三 | 日韩在线免费视频 | 国产精品一区二区久久精品爱微奶 | 久国产视频 | 欧美国产91 | 精品不卡 | 免费观看一级视频 | 亚洲风情在线观看 | 亚洲va欧美va人人爽午夜 | 午夜精品一区二区三区在线播放 | 免费观看成人av | 中文字幕亚洲一区二区三区 | 成人精品一区亚洲午夜久久久 | 国产99久久精品一区二区永久免费 | 欧美日韩精品中文字幕 | 国产第一区二区 | 91超碰在线观看 | 亚洲精品18 | 亚洲精品成人免费 | 欧美亚洲国产一区 | 日韩视频在线播放 | 精品欧美激情精品一区 | 手机在线观看av | 在线观看视频一区二区三区 | 亚洲视频三区 | 久久久久久免费毛片精品 | 国产精品久久久久免费 | 北条麻妃一区二区三区在线视频 | 91精品国产91久久久久游泳池 | 成人av一区二区在线观看 | 国产精品视频一区二区三区 | 欧美成人免费在线视频 | 成人欧美一区二区三区1314 | 亚洲伊人久久综合 |