找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1836|回复: 6
收起左侧

关于51单片机串口通信 中断服务函数处理数据问题,希望前辈们可以帮忙看看,指点一二...

[复制链接]
ID:894654 发表于 2021-5-26 21:36 | 显示全部楼层 |阅读模式
关于51单片机串口通信 中断服务函数处理数据问题,希望前辈们可以帮忙看看,指点一二...在此表示感谢用的单片机是STC8A8K  在中断服务函数里 开了8个数组进行保存上位机发下来的8个数组,处理数据是在中断服务函数里处理的.用的是状态机的思想.开两个数组的时候没什么太大的问题,开了8个数组就卡死了.想请教一下前辈们怎么解决这个问题啊? 把数据处理放在主函数嘛? 还是重新定义一个函数呢? 我试了试,没能移植成功,希望前辈们能给点建议  晚辈不胜感激.

中断服务函数代码如下:(每个数组有两个帧头 一个帧尾)


void uart_ISR() interrupt 4
{unsigned int recv_data;
if(RI)
{   RI=0;
        recv_data=SBUF;
        switch(machine_step_0)
        {//接收数据存入第1个数组
        case 0:
        if(recv_data==0xAA)
        {machine_step_0=1;}
        else
        {machine_step_0=0;}
        break;
       
        case 1:
        if(recv_data==0x55)
        {machine_step_0=2;
        recv_cnt_0=0;
        }
        else
        {machine_step_0=0;}
        break;
       
        case 2:
        if(recv_data!=0x0A)
        { recv_buf_0[recv_cnt_0]=recv_data;
          recv_cnt_0++;
          }       
        else
        {
        machine_step_0=3;
        }
    break;
        //接收数据存入第2个数组
        case 3:
        if(recv_data==0xBB)
        {
    machine_step_0=4;
        }
        else
        {
        machine_step_0=0;
        }
    break;
       
        case 4:
        if(recv_data==0x44)
        {
    machine_step_0=5;
        recv_cnt_1=0;
        }
        else
        {
        machine_step_0=0;
        }
    break;
       
        case 5:
        if(recv_data!=0x0B)
        {
        recv_buf_1[recv_cnt_1]=recv_data;
        recv_cnt_1++;
        }
        else
        {
        machine_step_0=6;
        }
    break;
        //接收数据存入第3个数组
        case 6:
        if(recv_data==0xCC)
        {
    machine_step_0=7;
        }
        else
        {
        machine_step_0=0;
        }
    break;
       
        case 7:
        if(recv_data==0x33)
        {
    machine_step_0=8;
        recv_cnt_2=0;
        }
        else
        {
        machine_step_0=0;
        }
    break;
       
        case 8:
        if(recv_data!=0x0C)
        {
        recv_buf_2[recv_cnt_2]=recv_data;
        recv_cnt_2++;
        }
        else
        {
        machine_step_0=9;
        }
    break;
        //接收数据存入第4个数组
        case 9:
        if(recv_data==0xDD)
        {
    machine_step_0=10;
        }
        else
        {
        machine_step_0=0;
        }
    break;
       
        case 10:
        if(recv_data==0x22)
        {
    machine_step_0=11;
        recv_cnt_3=0;
        }
        else
        {
        machine_step_0=0;
        }
    break;
       
        case 11:
        if(recv_data!=0x0D)
        {
        recv_buf_3[recv_cnt_3]=recv_data;
        recv_cnt_3++;
        }
        else
        {
        machine_step_0=12;
        }
    break;
        //接收数据存入第5个数组
        case 12:
        if(recv_data==0xEE)
        {led=0;
    machine_step_0=13;
        }
        else
        {
        machine_step_0=0;
        }
    break;
       
        case 13:
        if(recv_data==0x11)
        {
    machine_step_0=14;
        recv_cnt_4=0;
        }
        else
        {
        machine_step_0=0;
        }
    break;
       
        case 14:
        if(recv_data!=0x0E)
        {
        recv_buf_4[recv_cnt_4]=recv_data;
        recv_cnt_4++;
        }
        else
        {
        machine_step_0=15;
        }
    break;
        //接收数据存入第6个数组
        case 15:
        if(recv_data==0xFF)
        {
    machine_step_0=16;
        }
        else
        {
        machine_step_0=0;
        }
    break;
       
        case 16:
        if(recv_data==0x55)
        {
    machine_step_0=17;
        recv_cnt_5=0;
        }
        else
        {
        machine_step_0=0;
        }
    break;
       
        case 17:
        if(recv_data!=0x0F)
        {
        recv_buf_5[recv_cnt_5]=recv_data;
        recv_cnt_5++;
        }
        else
        {
        machine_step_0=18;
        }
    break;
        //接收数据存入第7个数组
        case 18:
        if(recv_data==0xAB)
        {
    machine_step_0=19;
        }
        else
        {
        machine_step_0=0;
        }
    break;
       
        case 19:
        if(recv_data==0x44)
        {
    machine_step_0=20;
        recv_cnt_6=0;
        }
        else
        {
        machine_step_0=0;
        }
    break;
       
        case 20:
        if(recv_data!=0x1A)
        {
        recv_buf_6[recv_cnt_6]=recv_data;
        recv_cnt_6++;
        }
        else
        {
        machine_step_0=21;
        }
    break;
        //接收数据存入第8个数组
        case 21:
        if(recv_data==0xCD)
        {
    machine_step_0=22;
        }
        else
        {
        machine_step_0=0;
        }
    break;
       
        case 22:
        if(recv_data==0x33)
        {
    machine_step_0=23;
        recv_cnt_7=0;
        }
        else
        {
        machine_step_0=0;
        }
    break;
       
        case 23:
        if(recv_data!=0x1B)
        {
        recv_buf_7[recv_cnt_7]=recv_data;
        recv_cnt_7++;
        }
        else
        {
        recv_cnt_0=0;
        recv_cnt_1=0;
        machine_step_0=0;
        recv_flag_0=1;
        led1=0;
        }
    break;
       
        default:break;
        }}
if(TI)
  {TI=0;}
}


回复

使用道具 举报

ID:213173 发表于 2021-5-27 06:31 | 显示全部楼层
一般来说串口中断函数只负责正确接收数据。根据通信协议对诸如数据头尾,长度等部分判断。逐字节接收并保存在缓冲数组中,不具体处理数据内容。一帧数据串接收结束后产生完成标志。然后在主函数中解析处理数据,执行相应任务。
回复

使用道具 举报

ID:894654 发表于 2021-5-27 09:06 | 显示全部楼层
wulin 发表于 2021-5-27 06:31
一般来说串口中断函数只负责正确接收数据。根据通信协议对诸如数据头尾,长度等部分判断。逐字节接收并保存 ...

所以一般是先将一包数据完整接收到一个缓冲数组中,然后再对应解析嘛?  因为sram空间有限,我就想着直接接收放在对应数组了,就没开一个大的数组先接收全部数据了.
回复

使用道具 举报

ID:928015 发表于 2021-5-27 10:37 | 显示全部楼层
中断一般只收数,不处理。否则很容易发生中断嵌套,或者看门狗溢出。
回复

使用道具 举报

ID:451718 发表于 2021-5-27 11:57 | 显示全部楼层
你那些recv_buf_0[]到recv_buf_7[],在编译的时候,不是一样会占用内存么?   直接用结构体来缓存,结构体里面在申明recv_buf_0[]到recv_buf_7[],这样就可以用  结构体名称.recv_buf_0[]来调用实际数据了。
回复

使用道具 举报

ID:894654 发表于 2021-5-27 13:37 | 显示全部楼层
robinsonlin 发表于 2021-5-27 11:57
你那些recv_buf_0[]到recv_buf_7[],在编译的时候,不是一样会占用内存么?   直接用结构体来缓存,结构体 ...

是说直接将处理好的数据直接放结构体嘛?
回复

使用道具 举报

ID:894654 发表于 2021-5-27 13:40 | 显示全部楼层
xkdigital 发表于 2021-5-27 10:37
中断一般只收数,不处理。否则很容易发生中断嵌套,或者看门狗溢出。

好的 谢谢你。我以为为了节省空间可以在中断里边接收边解析放对应数组的。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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