感情模拟器 2021-10-31 11:23 采纳率: 100%
浏览 61
已结题

STC8A8K64S4A12单片机串口通信数据帧的判断

需求:在串口中断中判断接收的第一帧数据是否为为0xAA,如果是:向电脑回传数据,否则丢弃该数据
出现的问题:_if(BUF[0]==0xaa&&BUF[7]!=0x55)_条件无法进入,无法向电脑回传数据
代码如下

void Uart1(void) interrupt 4 using 1
{
    Flag=TRUE;                 //接收到数据,接收标识符有效
    
    if (RI)
    {/*RI置1表示串口接收完成,SBUF已经写入数据申请进入中断*/
        RI = 0;                 //清除RI位 (该位必须软件清零)
        BUF[cnt] = SBUF;/*
        将单片机缓存中的数据写入BUF[cnt]*/
        if(BUF[0]==0xaa&&BUF[7]!=0x55) /*数据传输中*/
        {
            SendDataByUart1(BUF[cnt]);/*
        将串口接收到的数据发送回电脑*/
            cnt++;/*继续接收数据*/
        }    
        else if((BUF[0] == 0xAA)&&(BUF[7] == 0x55))/*一条完整数据传输完毕*/
        {
            ES = 0;/*关闭串口中断,防止数据被覆盖*/
            cnt = 0;/*重置数据位标记*/
            sign = 1;/*标记:该条数据可以进行下一步处理*/
        }
        else
        {
            cnt = 0;
            return;
        }/*数据中间出现错误,重置数据位标记并跳出中断*/
    }

   if (TI)
     {                       //在停止位开始发送时,该位置1
      TI = 0;              //清除TI位(该位必须软件清零)
   }
     ES =  1;                // 串口1中断打开
}


现象:无法向电脑回传数据

img

只有将条件改成_if(BUF[0]!=0xaa&&BUF[7]!=0x55)_才能进入条件向电脑回传数据
更改后代码如下:(可忽略)


void Uart1(void) interrupt 4 using 1
{
    Flag=TRUE;                 //接收到数据,接收标识符有效
    
    if (RI)
    {/*RI置1表示串口接收完成,SBUF已经写入数据申请进入中断*/
        RI = 0;                 //清除RI位 (该位必须软件清零)
        BUF[cnt] = SBUF;/*
        将单片机缓存中的数据写入BUF[cnt]*/
        if(BUF[0]!=0xaa&&BUF[7]!=0x55) /*数据传输中*/
        {
            SendDataByUart1(BUF[cnt]);/*
        将串口接收到的数据发送回电脑*/
            cnt++;/*继续接收数据*/
        }    
        else if((BUF[0] == 0xAA)&&(BUF[7] == 0x55))/*一条完整数据传输完毕*/
        {
            ES = 0;/*关闭串口中断,防止数据被覆盖*/
            cnt = 0;/*重置数据位标记*/
            sign = 1;/*标记:该条数据可以进行下一步处理*/
        }
        else
        {
            cnt = 0;
            return;
        }/*数据中间出现错误,重置数据位标记并跳出中断*/
    }

   if (TI)
     {                       //在停止位开始发送时,该位置1
      TI = 0;              //清除TI位(该位必须软件清零)
   }
     ES =  1;                // 串口1中断打开
}

测试结果

img

  • 写回答

1条回答 默认 最新

  • 关注

    先调试一下buf[0],buf[7]的值有没有符合条件的数据。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 11月9日
  • 已采纳回答 11月1日
  • 创建了问题 10月31日

悬赏问题

  • ¥15 关于#matlab#的问题:在模糊控制器中选出线路信息,在simulink中根据线路信息生成速度时间目标曲线(初速度为20m/s,15秒后减为0的速度时间图像)我想问线路信息是什么
  • ¥15 banner广告展示设置多少时间不怎么会消耗用户价值
  • ¥16 mybatis的代理对象无法通过@Autowired装填
  • ¥15 可见光定位matlab仿真
  • ¥15 arduino 四自由度机械臂
  • ¥15 wordpress 产品图片 GIF 没法显示
  • ¥15 求三国群英传pl国战时间的修改方法
  • ¥15 matlab代码代写,需写出详细代码,代价私
  • ¥15 ROS系统搭建请教(跨境电商用途)
  • ¥15 AIC3204的示例代码有吗,想用AIC3204测量血氧,找不到相关的代码。