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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1346|回復: 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)       
}

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

使用道具 舉報

沙發
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色| 草久视频 | 国产日韩精品一区二区 | 国产精品一区一区三区 | 在线一级片 | 日韩精品成人 | 久久影音先锋 | 亚洲香蕉在线视频 | 日本中出视频 | 亚洲xx在线 | 欧美一区二区三区在线观看 | 蜜桃毛片 | av大全在线观看 | 一区二区三区四区国产 | 国产一区二区三区在线看 | 国产精品不卡 | 国产成人a亚洲精品 | 一区二区三区不卡视频 | 国产精品久久久久久久久久久久冷 | 99精品在线观看 | 在线免费国产视频 | 五月婷婷 六月丁香 | 午夜视频在线 | 亚洲欧美高清 | 亚洲精品乱码久久久久久按摩观 | 视频在线观看亚洲 | 国产不卡一区在线观看 | 久久精品国产99国产精品 | 亚洲午夜精品一区二区三区 | 亚洲天堂一区二区 | 91久久精品国产91久久性色tv | 欧美亚洲第一区 | 欧美日韩a | 一区二区手机在线 |