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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1417|回復: 1
收起左側

請教關于51單片機串口中斷接收的問題

[復制鏈接]
ID:1039635 發表于 2022-8-20 14:25 | 顯示全部樓層 |閱讀模式
下面是我的程序,用邏輯分析儀接單片機的RXD端是可以接收到數據的,如果單片機接收到5A A5 06 83 50 15 01 00 01的指令,應該會執行這段代碼,但是貌似沒有,想問問大佬們有什么想法,麻煩各位大佬了


(這是邏輯分析儀接單片機RXD接收的數據)


//串口發送單個字節
void  SendData(u8 dat)
{
        TI = 0;                                //初始化后TI給置1了,需要軟件置0,避免遺失第二幀數據
        SBUF = dat;         //發送數據
    while (!TI);      //等待上個數據發送完成
    TI=0;

}
//串口發送字符串
void  SendStr(u8 *p,u8 length)  //length是字節個數,增加length是為了發送00
{
        while(length)
        {
                SendData(*p++);
                length--;
        }
}
void UartInit(void)                //115200bps@22.1184MHz
{
        PCON |= 0x80;                //使能波特率倍速位SMOD
        SCON = 0x50;                //8位數據,可變波特率
        REN = 1;
        AUXR &= 0xBF;                //定時器時鐘12T模式
        AUXR &= 0xFE;                //串口1選擇定時器1為波特率發生器
        TMOD &= 0x0F;                //設置定時器模式
        TMOD |= 0x20;                //設置定時器模式
        TL1 = 0xFF;                //設置定時初始值
        TH1 = 0xFF;                //設置定時重載值
        ET1 = 0;                //禁止定時器%d中斷
        ES = 1;                        //使能串口中斷  //查詢方式發數據需要關中斷
        TR1 = 1;                //定時器1開始計時
        EA = 1;
}

//-----------------------------------------------------------------------
// UART中斷函數(與迪文屏通訊)
//指令格式:5A A5 06 83 0000 01 0000
//                        或         5A A5 03 82 4F 4B
//若數據量多、有粘連指令,采用環形隊列處理
//-----------------------------------------------------------------------
void UART_interrupt () interrupt 4
{
        if(RI)           
        {  
                RI = 0;                               //清除接收完成標志               
                RX_Buf[RX_Count]=SBUF;                           //數據接收
                RX_Count++;                                                 //接收數據計數
                if(RX_Count>1 &&((RX_Buf[0]!=0x5A)||(RX_Buf[1]!=0xA5)))//幀頭判定0x5AA5       
                        RX_Count=0;       
                else if(RX_Count>=(RX_Buf[2]+3)) //一幀數據接收完整
                {
//                        if((RX_Buf[4]==0x4F)&&(RX_Buf[5]==0x4B))        //OK指令直接忽略
                        if(Re_full==0)                                                                                                                 
                        {               
                                Send_Step2=1;
                                Re_full=1;
//                                memcpy(Deal_Buf,&RX_Buf[3],RX_Buf[2]);                   //拷貝指令碼起的數據
               
//                        led_time=20;                         //接收到正確指令
                        }
                                RX_Count=0;
                }
         
        }
       
        if (SCON & TI)
        {
                SCON &= ~TI;           //清除發送完成標志
//            Busy = 0;
        }
}

/*--------------------------------------------------------------------
功    能:串口接收處理(40ms)  串口解析
入口參數:void
出口參數:void
返    回:void
// 5A A5 06 83 60 10 01 00 01   //5A A5 03 82 4F 4B
    0   1   2  3   4  5   6   7    8          0  1    2  3   4   5
--------------------------------------------------------------------*/
void Deal_RX_Data(void)
{
        if(Re_full==1)       
        {               
                        switch(RX_Buf[3])
                        {
                                case 0x82:
                                        if((0X4f== RX_Buf[4])&(0X4B == RX_Buf[5]))
                                         {
//                                                printf("setparam success\r\n");
                                         }       
                                         break;
                                case 0x83:
                                        DGUS_VP = (RX_Buf[4]&0x00ff)<<8 | RX_Buf[5];
                                        DGUS_DATA = (RX_Buf[7]&0x00ff)<<8 | RX_Buf[8];
                                        if((DGUS_VP==0x6010)||(DGUS_VP==0x6020)||(DGUS_VP==0x6030))        //調檔
                                        {
                                                  Send_Step2=1;
                                                  if(0x0001== DGUS_DATA)
                                                        {
                                                                                                       
                                                        }
                                                  else if(0x0002== DGUS_DATA)
                                                        {
                               
                                                                //level2 = 1;
                                                        }
                                                  else if(0x0003== DGUS_DATA)
                                                        {
                                       
                                                                //level3 = 1;
                                                        }
                                                  else if(0x0004== DGUS_DATA)
                                                        {
                                       
                                                                //level4 = 1;
                                                        }
                                                  else if(0x0005== DGUS_DATA)
                                                        {
                                                                //level5 = 1;
                                                        }                                       
                                                  else if(0x0006== DGUS_DATA)
                                                        {
                                                               
                                                                //level6 = 1;       
                                                        }               
                                        }
                                        else if((DGUS_VP==0x5015)||(DGUS_VP==0x5025)||(DGUS_VP==0x5035))  //開關
                                        {
                                                if(0x0000==DGUS_DATA)
                                                {
                                                        JDQ = start_a;                                                       
                                                }
                                                else if(0x0001==DGUS_DATA)
                                                {
                                                        JDQ = ~start_a;
                                                        printf("%x",0x11);
//                                                        show_buf[0]=0;
//                                                        show_buf[1]=4;
////                                                        Send_Uart(2,0x82,0x6030,show_buf);
////                                                        Send_Uart(2,0x82,0x6020,show_buf);
//                                                        Send_Uart(2,0x82,0x6010,show_buf);
                                                }
                                        }
                                        break;
                                default:
                                        break;
                                                                 
                        }
               
                       
        Re_full=0;
        }//if(Re_full==1)       
}

回復

使用道具 舉報

ID:1039635 發表于 2022-8-22 10:31 | 顯示全部樓層
找到錯誤了,是接收中斷的問題,系統判斷一條指令接收完成的那句代碼寫錯了,改成這個                     
               else if(RX_Count>(RX_Buf[2]+2)) //一幀數據接收完整    就好了
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 中文字幕国产高清 | 欧美专区在线 | 亚洲在线视频 | 日韩国产精品一区二区三区 | 久久免费精品视频 | 欧美精品一区在线 | 国产激情免费视频 | 爱爱视频网| 色性av | 嫩草影院网址 | 91av视频在线播放 | 97人人澡人人爽91综合色 | 九九九精品视频 | 国产99热在线| 在线a视频| 午夜影院中文字幕 | 国产亚洲精品久久久优势 | 久久久91| 99精品视频免费观看 | 蜜桃视频在线观看免费视频网站www | 欧美性生活网 | 亚洲一二三在线 | 日本午夜精品一区二区三区 | 三级黄色片在线观看 | 色婷婷综合久久久久中文一区二区 | 美女一级a毛片免费观看97 | 91天堂 | 国产成人精品免费视频大全最热 | 欧美日韩亚洲系列 | 免费看黄视频网站 | 久久中文字幕电影 | 久久久精品一区二区三区四季av | 少妇特黄a一区二区三区88av | 激情网站在线观看 | 精品一区av | 密色视频 | 亚州国产| 精国产品一区二区三区 | 天天干天天草 | 国产三级一区二区三区 | 色就是色欧美 |