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

QQ登錄

只需一步,快速開(kāi)始

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

為啥單片機(jī)串口解析時(shí)好時(shí)壞希望有大佬能解決下

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
#include "..\comm\STC32G.h"

#include "stdio.h"
#include "intrins.h"
#include "string.h"

typedef         unsigned char        u8;
typedef         unsigned int        u16;
typedef         unsigned long        u32;

#define MAIN_Fosc        22118400L   //定義主時(shí)鐘(精確計(jì)算115200波特率)
#define Timer0_Reload   (MAIN_Fosc / 1000)      //Timer 0 中斷頻率, 1000次/秒
//==========================================================================


#define Baudrate1   (65536 - MAIN_Fosc / 115200 / 4)
#define Baudrate2   (65536 - MAIN_Fosc / 115200 / 4)

#define UART1_BUF_LENGTH    256
#define UART2_BUF_LENGTH    256



/*************  本地變量聲明    **************/

u16  TX1_Cnt;    //發(fā)送計(jì)數(shù)
u16  RX1_Cnt;    //接收計(jì)數(shù)
u16  TX2_Cnt;    //發(fā)送計(jì)數(shù)
u16  RX2_Cnt;    //接收計(jì)數(shù)

bit B_TX1_Busy;  //發(fā)送忙標(biāo)志
bit B_TX2_Busy;  //發(fā)送忙標(biāo)志


u8  RX1_Buffer[UART1_BUF_LENGTH]; //接收緩沖
u8  RX2_Buffer[UART2_BUF_LENGTH]; //接收緩沖

//短息處理變量

u8 Message_info[256];
//Messgae_Flag = 0;
u16 Cnt_len  = 0;
u16 Cnt_head = 0;
bit M_Flag = 0;
bit Uart_S = 0;



void main(void)
{
    WTST = 0;  //設(shè)置程序指令延時(shí)參數(shù),賦值為0可將CPU執(zhí)行指令的速度設(shè)置為最快

    P0M1 = 0x00;   P0M0 = 0x00;   //設(shè)置為準(zhǔn)雙向口
    P1M1 = 0x00;   P1M0 = 0x00;   //設(shè)置為準(zhǔn)雙向口
    P2M1 = 0x00;   P2M0 = 0x00;   //設(shè)置為準(zhǔn)雙向口
    P3M1 = 0x00;   P3M0 = 0x00;   //設(shè)置為準(zhǔn)雙向口
    P4M1 = 0x00;   P4M0 = 0x00;   //設(shè)置為準(zhǔn)雙向口
    P5M1 = 0x00;   P5M0 = 0x00;   //設(shè)置為準(zhǔn)雙向口
    P6M1 = 0x00;   P6M0 = 0x00;   //設(shè)置為準(zhǔn)雙向口
    P7M1 = 0x00;   P7M0 = 0x00;   //設(shè)置為準(zhǔn)雙向口

    UART1_config(1);    // 選擇波特率, 2: 使用Timer2做波特率, 其它值: 使用Timer1做波特率.
    UART2_config(2);    // 選擇波特率, 2: 使用Timer2做波特率, 其它值: 無(wú)效.

         

                while(1)              
                        {
                                  u16 i;
                                
                                if( Uart_S)
                                        {  
                                                
                                                for(i=0;i<=Cnt_len;i++)
                                                {UART1_TxByte(RX1_Buffer[Cnt_head+i]);}
                                                Uart_S   =0;
                                                RX1_Cnt         =0;
                                                Cnt_head =0;
                                        }
                        }               
}

void UART1_int (void) interrupt 4
{
                if(TI)
    {
        TI = 0;
        B_TX1_Busy = 0;
    }
               
                if(RI) // 中斷產(chǎn)生
                                {
                                        RI=0 ; //清楚中斷標(biāo)志
                                        RX1_Buffer[RX1_Cnt] = SBUF;
                                        RX1_Cnt++;
                                       
                                        if((RX1_Buffer[RX1_Cnt-1]==0x2B)&&(RX1_Buffer[RX1_Cnt]==0x43))//頭
                                                                {        Cnt_head  = RX1_Cnt-1;}
                                        if((RX1_Buffer[Cnt_head]==0x2B)&&(RX1_Buffer[RX1_Cnt-1]==0x0A)) //檢測(cè)到頭的情況下檢測(cè)尾巴
                                                        {
                                                                        Cnt_len = RX1_Cnt-1 - Cnt_head;
                                                                        Uart_S = 1;
                                                        
                                                        }
                                }
               
                //數(shù)據(jù)溢出的情況
                if(RX1_Cnt >= UART1_BUF_LENGTH)   
                                {RX1_Cnt = 0;}


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

使用道具 舉報(bào)

沙發(fā)
ID:1066795 發(fā)表于 2023-3-16 11:24 | 只看該作者
有大佬幫忙看看嗎?
回復(fù)

使用道具 舉報(bào)

板凳
ID:807182 發(fā)表于 2023-3-16 14:48 | 只看該作者
中斷盡量快,不要處理數(shù)據(jù),把數(shù)據(jù)放到其他地方判斷
回復(fù)

使用道具 舉報(bào)

地板
ID:384109 發(fā)表于 2023-3-16 15:42 | 只看該作者
中斷里的接收判斷錯(cuò)誤了
回復(fù)

使用道具 舉報(bào)

5#
ID:1066795 發(fā)表于 2023-3-16 18:34 | 只看該作者
人中狼 發(fā)表于 2023-3-16 15:42
中斷里的接收判斷錯(cuò)誤了

能略微指點(diǎn)一下嗎?
回復(fù)

使用道具 舉報(bào)

6#
ID:1066823 發(fā)表于 2023-3-16 20:56 | 只看該作者
不用大佬,小弟就可以,時(shí)好時(shí)壞,以硬件的角度看,沒(méi)插好、插頭慫了,軟件看那是玄學(xué)!
回復(fù)

使用道具 舉報(bào)

7#
ID:384109 發(fā)表于 2023-3-16 22:08 | 只看該作者
if((RX1_Buffer[RX1_Cnt-1]==0x2B)&&(RX1_Buffer[RX1_Cnt]==0x43))
這里邏輯問(wèn)題
回復(fù)

使用道具 舉報(bào)

8#
ID:1066795 發(fā)表于 2023-3-17 08:58 | 只看該作者
人中狼 發(fā)表于 2023-3-16 22:08
if((RX1_Buffer[RX1_Cnt-1]==0x2B)&&(RX1_Buffer[RX1_Cnt]==0x43))
這里邏輯問(wèn)題

emm 抱歉實(shí)在是 邏輯理解不出來(lái) RX1_Cnt-1 時(shí)為0x2B (+)RX1_Cnt 時(shí) 為 0x43 (C) 這里有什么邏輯問(wèn)題,還望不吝賜教
回復(fù)

使用道具 舉報(bào)

9#
ID:1066795 發(fā)表于 2023-3-17 08:59 | 只看該作者
lihuajie32 發(fā)表于 2023-3-16 20:56
不用大佬,小弟就可以,時(shí)好時(shí)壞,以硬件的角度看,沒(méi)插好、插頭慫了,軟件看那是玄學(xué)!

線什么的應(yīng)該沒(méi)什么問(wèn)題
回復(fù)

使用道具 舉報(bào)

10#
ID:161164 發(fā)表于 2023-3-17 10:14 | 只看該作者
yslsdas 發(fā)表于 2023-3-17 08:58
emm 抱歉實(shí)在是 邏輯理解不出來(lái) RX1_Cnt-1 時(shí)為0x2B (+)RX1_Cnt 時(shí) 為 0x43 (C) 這里有什么邏輯問(wèn)題,還 ...


由于12行的關(guān)系
13行的RX1_Buffer[RX1_Cnt-1]為接收值后面的RX1_Buffer[RX1_Cnt]永遠(yuǎn)等于0

回復(fù)

使用道具 舉報(bào)

11#
ID:1066795 發(fā)表于 2023-3-17 11:06 | 只看該作者
確實(shí)是這樣 RX1_Buffer[1] 的值確實(shí)沒(méi)有謝謝大佬指出
回復(fù)

使用道具 舉報(bào)

12#
ID:1066795 發(fā)表于 2023-3-17 11:13 | 只看該作者
lkc8210 發(fā)表于 2023-3-17 10:14
由于12行的關(guān)系
13行的RX1_Buffer[RX1_Cnt-1]為接收值后面的RX1_Buffer[RX1_Cnt]永遠(yuǎn)等于0

按照您這么說(shuō),這確實(shí)后面的那個(gè)RX1_Buffer[RX1_Cnt] 沒(méi)有值
回復(fù)

使用道具 舉報(bào)

13#
ID:1066795 發(fā)表于 2023-3-19 16:37 | 只看該作者
  1. if( M_Flag)
  2.                                         {  
  3.                                        
  4.                                                 PrintString1(RX1_Buffer);
  5.                                                 PrintString1("\n");
  6.                                                 M_index[M_index_num]=RX1_Buffer[3] ;
  7.                                                 M_index_num++;
  8.                                                 memset(RX1_Buffer,0,RX1_Cnt);
  9.                                                  M_Flag   =0;
  10.                                                 RX1_Cnt         =0;
  11.                                                 PrintString1(M_index);
  12.                                                 PrintString1("\n");
  13.                                         }
  14. void UART1_int (void) interrupt 4
  15. {
  16.                

  17. //               
  18. //                if(RI) // 中斷產(chǎn)生
  19. //                                {
  20. //                                        RI=0 ; //清除中斷標(biāo)志
  21. //                                        RX1_Buffer[RX1_Cnt] = SBUF;
  22. //                                        RX1_Cnt++;
  23. //                                        if(RX1_Cnt >= UART1_BUF_LENGTH)   
  24. //                                                        {RX1_Cnt = 0;}
  25. //                                        }
  26. //                if((RX1_Buffer[RX1_Cnt-1]==0x2B)&&(RX1_Buffer[RX1_Cnt]==0x43))//頭
  27. //                                                                {        Cnt_head  = RX1_Cnt-1;}
  28. //                if((RX1_Buffer[Cnt_head]==0x2B)&&(RX1_Buffer[Cnt_head+1]==0x43)&&(RX1_Buffer[RX1_Cnt-1]==0x0A)) //檢測(cè)到頭的情況下檢測(cè)尾巴
  29. //                                {
  30. //                                                Cnt_len = RX1_Cnt-1 - Cnt_head;
  31. //                                          
  32. //                                                Uart_S = 1;
  33. //                                          RX1_Cnt = 0;
  34. //                                                Cnt_head =0;
  35. ////                               
  36. //                                }

  37.                          if(RI)//如果產(chǎn)生中斷
  38.                                  {
  39.                                        
  40.                                         switch(state){
  41.                                                 case 1:
  42.                                                                                 if(SBUF == 0x4C){ //頭
  43.                                                                                         RX1_Cnt=0;
  44.                                                                                         state = 2;
  45.                                                                                         RX1_Buffer[RX1_Cnt++] = SBUF;
  46.                                                                                 }
  47.                                                                                 else
  48.                                                                                 {
  49.                                                                                         state=1;
  50.                                                                                         RX1_Cnt=0;
  51.                                                                                        
  52.                                                                                 }
  53.                                                                                 break;
  54.                                                                                
  55.                                                 case 2:
  56.                                                                                 if(SBUF == 0x3A){ //頭
  57.                                                                                         state = 3;
  58.                                                                                         RX1_Buffer[RX1_Cnt++] = SBUF;
  59.                                                                                 }
  60.                                                                                 else
  61.                                                                                 {
  62.                                                                                         state=1;
  63.                                                                                         RX1_Cnt=0;
  64.                                                                                        
  65.                                                                                 }
  66.                                                                                 break;
  67.                                        
  68.                                                  case 3:
  69.                                                                                         if(SBUF==0x2C){  //尾
  70.                                                                                                
  71.                                                                                                         RX1_Buffer[RX1_Cnt++] = SBUF;
  72.                                                                                                         M_Flag = 1;
  73.                                                                                                         state =1;
  74.                                                                                                        
  75.                                                                                         }
  76.                                                                                         else
  77.                                                                                         {
  78.                                                                                                        
  79.                                                                                                 RX1_Buffer[RX1_Cnt++] = SBUF;
  80.                                                                                                  state=3;
  81.                                                                                         }
  82.                                                                                         break;
  83.        
  84.                                                                                        
  85.                                                  default:
  86.                                                                                         state = 1;
  87.                                                                                  break;
  88.                                        
  89.                                         }
  90.                                          
  91.                                          RI = 0;
  92.                  }
  93.                        
  94.     if(TI)
  95.     {
  96.         TI = 0;
  97.         B_TX1_Busy = 0;
  98.     }
  99.                          
  100. }
復(fù)制代碼


這個(gè)應(yīng)該是可以解決指定頭和位幀然后不定長(zhǎng)數(shù)據(jù)解析了吧嘿嘿
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

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