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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 11644|回復: 2
打印 上一主題 下一主題
收起左側

stm32串口中斷接收方式詳細比較

[復制鏈接]
跳轉到指定樓層
樓主
ID:277793 發表于 2018-4-12 11:57 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
串口調試,以前也調過,只是沒這么深入的琢磨過,最近又在弄,感覺串口很基本,也很有學問,要是出現BUG可能導致系統奔潰。。。現在貼出來,歡迎拍磚指正!!!

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

實例一:
void USART1_IRQHandler(u8 GetData)
{
u8 BackData;
if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) //中斷產生
{
USART_ClearITPendingBit(USART1,USART_IT_RXNE); //清除中斷標志.
                  GetData = UART1_GetByte(BackData);   //也行GetData=USART1->DR;  
USART1_SendByte(GetData);      //發送數據

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


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


if((Uart2_Buffer[0] == 0x5A)&&(Uart2_Buffer[Uart2_Rx_Num-1] == 0xA5))  //判斷最后接收的數據是否為設定值,確定數據正確性
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]); //發送數據


Uart2_Rx_Num = 0; //初始化
Uart2_Tx_Num = 0;
Uart2_Sta = 0;
}
這是加了數據頭和數據尾的接收方式,數據頭和尾的個數可增加,此處只用于調試之用。中斷函數用于接收數據以及判斷數據的頭尾,第二個函數在main函數里按照查詢方式執行。
優點:較簡單,采用緩存區接收,對提高數據的正確行有一定的改善 。
缺點:要是第一次數據接收錯誤,回不到初始化狀態,必須復位操作 。

實例三:
vvoid USART2_IRQHandler()
{
     if(USART_GetITStatus(USART2,USART_IT_RXNE) != RESET) //中斷產生
     {
        USART_ClearITPendingBit(USART2,USART_IT_RXNE); //清除中斷標志.
        Uart2_Buffer[Uart2_Rx] = USART_ReceiveData(USART2);
        Uart2_Rx++;
        Uart2_Rx &= 0x3F; //判斷是否計數到最大
      }
      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]); //發送數據
    Uart2_Tx++;
    Uart2_Tx &= 0x3F; //判斷是否計數到最大
}  
采用FIFO方式接收數據,由0x3F可知此處最大接收量為64個,可變,中斷函數只負責收,另一函數在main函數里執行,FIFO方式發送。
優點:發送和接收都很自由,中斷占用時間少,有利于MCU處理其它。
缺點:對數據的正確性沒有判斷,一概全部接收。

實例四:
void USART2_IRQHandler()
{
     if(USART_GetITStatus(USART2,USART_IT_RXNE) != RESET) //中斷產生
     {
       USART_ClearITPendingBit(USART2,USART_IT_RXNE); //清除中斷標志
        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)) //檢測到頭的情況下檢測到尾
     {
            Uart2_Len = Uart2_Rx-1- Uart2_Tx; //長度
            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(tx2=0;tx2 <= Uart2_Len;tx2++,Uart2_Tx++)
                USART2_SendByte(Uart2_Buffer[Uart2_Tx]); //發送數據
        Uart2_Rx = 0; //初始化
        Uart2_Tx = 0;
        Uart2_Sta = 0;
}

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

STM32串口中斷接收方式詳細比較.doc

37 KB, 下載次數: 39, 下載積分: 黑幣 -5

主要描述串口中斷

評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

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

使用道具 舉報

沙發
ID:359997 發表于 2018-6-27 09:57 | 只看該作者
樓主,我覺得應該在發送函數里面,加一個1MS的延時為好,不然用串口調試助手可能顯示不出來
回復

使用道具 舉報

板凳
ID:359997 發表于 2018-6-27 11:18 | 只看該作者
有個BUG就是發送多個5A時候,會出問題,因為算出的數據長度有問題
回復

使用道具 舉報

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

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 午夜精品一区二区三区在线观看 | 成人在线一区二区 | 国产精品一区二区三区在线 | 毛片黄片免费看 | 亚洲女人的天堂 | 欧美一级片在线观看 | 亚洲欧美一区二区三区国产精品 | 欧美乱大交xxxxx另类电影 | 久久99精品国产自在现线小黄鸭 | 欧美成人高清视频 | 91精品久久久久久久久中文字幕 | 四虎影院新地址 | 国产高清视频在线观看播放 | 正在播放国产精品 | 久久成人一区二区三区 | 久久久久亚洲精品 | 亚洲欧美一区二区在线观看 | 综合网伊人 | 免费av毛片 | 久久久一二三区 | 一级大片网站 | 人人做人人澡人人爽欧美 | 四虎永久影院 | 伊人精品在线 | 欧美日韩成人在线 | 福利视频一区二区三区 | 黄色大片在线播放 | 日本在线中文 | 亚洲视频一区在线播放 | 999精品在线观看 | 精品国产欧美日韩不卡在线观看 | 成人国产精品入口免费视频 | 美女日批免费视频 | 99精品99 | 天天干天天干 | 日本黄色片免费在线观看 | 欧美在线一区二区三区 | 欧美老少妇一级特黄一片 | 国产十日韩十欧美 | 国产亚洲精品综合一区 | 日韩一区二区三区四区五区 |