找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1694|回复: 2
打印 上一主题 下一主题
收起左侧

单片机串口通讯接收数据时遇到的逻辑问题

[复制链接]
跳转到指定楼层
楼主
ID:735148 发表于 2020-5-11 15:11 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
1黑币
本帖最后由 饮酒作乐 于 2020-5-11 15:35 编辑

    串口中断部分的程序下所示。add代表地址位,0xff代表开始。我准备先判断初始位,再判断地址位,写入数组的只需要从地址位开始的后几位。现在遇到的问题是,当我用正确地址测试时没有异常,当我更改地址,按说应该再地址判断处截至的,却依然能执行(我设置断点看到了),但是只能执行一次,紧接着当我更改回正确地址测试时,第一次却不能执行,第二次才能执行。请各位帮我看一下。我自己实在看不出来
  1. void UART_Interrupt (void) interrupt  4
  2. {
  3.         static unsigned char t= 0;
  4.         static unsigned char i= 0;

  5.         uchar a;
  6.         if(RI)  //接收字节
  7.         {
  8.                 RI = 0;
  9.                 if(t ==0) //判断第一位是否时起始位
  10.                 {
  11.                         a =SBUF;
  12.                         if(a == 0xff)
  13.                         {
  14.                                 a =0xc0;
  15.                                 t = 1;
  16.                         }
  17.                 }
  18.                 else if(t == 1) //判断地址位是否正确
  19.                 {
  20.                         t=0;
  21.                         a = SBUF;
  22.                         if (a == add)
  23.                         {
  24.                                 a = 0xc0;
  25.                                 t = 2;
  26.                         }
  27.                 }
  28.                
  29.                 if(t==2)
  30.                 {
  31.                         DateBuf[ i ] =SBUF; //将接收缓冲区的信息按位写入到数组中
  32.                         i++;
  33.                         if(i == 6)
  34.                         {
  35.                                 i = 0;
  36.                                 t = 0;
  37.                                 date_over = 1;
  38.                         }
  39.                 }                       
  40.         }
  41.         if(TI)
  42.         {

  43.                 TI = 0;
  44.         }
  45. }
复制代码

最佳答案

查看完整内容

void UART_Interrupt (void) interrupt 4 { static unsigned char i=0; // if(RI)这个判断无意义,既然进入串口中断RI必定=1 RI=0; DateBuf=SBUF; if(DateBuf[0]==0xff)//判断数据串第一个字节正确,否则覆盖掉 { if(i==1)//判断数据串第二个字节错误 { if(DateBuf[1]!=0xc0) { i=0; DateBuf[0]=0x00;//清除后重新接收 DateBuf[1]=0x00; } else i++; } else { ...
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:213173 发表于 2020-5-11 15:11 | 只看该作者
void UART_Interrupt (void) interrupt  4
{
        static unsigned char i=0;       
//        if(RI)这个判断无意义,既然进入串口中断RI必定=1
        RI=0;
        DateBuf[i]=SBUF;
        if(DateBuf[0]==0xff)//判断数据串第一个字节正确,否则覆盖掉
        {
                if(i==1)//判断数据串第二个字节错误
                {               
                        if(DateBuf[1]!=0xc0)
                        {
                                i=0;
                                DateBuf[0]=0x00;//清除后重新接收
                                DateBuf[1]=0x00;
                        }
                        else i++;
                }               
                else
                {
                        i++;
                        if(i==x)//x=数据串长度
                        {                       
                                flag=1;//接收完成标志置1,供主程序判断解析数据串
                                i=0;
                        }
                }
        }
}
回复

使用道具 举报

板凳
ID:94031 发表于 2020-5-11 16:17 | 只看该作者
不要在串口中断里做处理,中断里只做接收放到数组里,中断外做处理,否则影响接收。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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