找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 876|回复: 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 单片机教程网

快速回复 返回顶部 返回列表