OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4279|回复: 7

关于rfid 开发板 51串口接收程序 红色不理解

[复制链接]

3

主题

14

帖子

0

精华

初级会员

Rank: 2

积分
54
金钱
54
注册时间
2016-9-28
在线时间
12 小时
发表于 2016-10-8 14:53:23 | 显示全部楼层 |阅读模式
1金钱
/////////////////////////////////////////////////////////////////////
//串行中断,接收上位机数据
/////////////////////////////////////////////////////////////////////
seri_int () interrupt 4 using 1
{
   unsigned int i,j;
   unsigned char rece_data = SBUF;
   unsigned char verify = 0;
   if (RI)
   {   
       RI = 0;
           if (g_bReceAA)
           {  
               g_bReceAA = 0;
               switch (rece_data)
               {   
                        case 0x00:
                      break;
                   case 0xBB:
                      g_cReceNum = 0;
                      break;
                   default:
                      i = g_cReceNum;
                      g_cReceBuf = rece_data;
                      break;
               }
           }
           else
           {   
               switch (rece_data)                 //接收到上位机发来的数据
               {   
                        case 0xAA:                        //开始字节0XAA
                      g_bReceAA = 1;         //开始字节的标志
                   default:
                      i = g_cReceNum++;
                      g_cReceBuf = rece_data;          //接收上位机发来的每一个字节
                      break;
               }
           }
           i = (((unsigned int)(g_cReceBuf[1]<<8)) + (unsigned int)(g_cReceBuf[0]));          //16位   0XBBAA ??
           if ((g_cReceNum == i + 2) && ( i != 0 ))
       {   
            for (j=1; j<g_cReceNum; j++)
            {   verify ^= g_cReceBuf[j];    }
            if (!verify)
                {   
                        g_bReceOk  = 1;
                                BELL =  0;
                                redled = 0;
                        g_cCommand = (((unsigned int)(g_cReceBuf[5]<<8)) + (unsigned int)(g_cReceBuf[4]));        //接收到的命令2个字节
                        g_bReceAA  = 0;
                        ES = 0;
                }
        }


        if (g_cReceNum >= sizeof(g_cReceBuf))
        {   g_cReceNum=0;   }
    }
    if (TI)
    {        TI = 0;   }
}
求好心人帮帮 注解下。。

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165309
金钱
165309
注册时间
2010-12-1
在线时间
2108 小时
发表于 2016-10-8 18:55:43 | 显示全部楼层
不理解直接用行么?代码都给出来了...
回复

使用道具 举报

3

主题

14

帖子

0

精华

初级会员

Rank: 2

积分
54
金钱
54
注册时间
2016-9-28
在线时间
12 小时
 楼主| 发表于 2016-10-9 13:46:29 | 显示全部楼层
这样不好吧。。
回复

使用道具 举报

3

主题

14

帖子

0

精华

初级会员

Rank: 2

积分
54
金钱
54
注册时间
2016-9-28
在线时间
12 小时
 楼主| 发表于 2016-10-9 17:03:21 | 显示全部楼层
正点原子 发表于 2016-10-8 18:55
不理解直接用行么?代码都给出来了...

原子大哥 stm32 usart 1 2 3 发数据会互相影响吗?
我的程序里面没有USART_SendData(USART2, Data);
但是串口2 也出现了数据?这是为什么?谢谢 谢谢谢谢
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165309
金钱
165309
注册时间
2010-12-1
在线时间
2108 小时
发表于 2016-10-12 22:59:50 | 显示全部楼层
ice 发表于 2016-10-9 17:03
原子大哥 stm32 usart 1 2 3 发数据会互相影响吗?
我的程序里面没有USART_SendData(USART2, Data);
但 ...

不会。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

7

主题

90

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
325
金钱
325
注册时间
2016-10-21
在线时间
43 小时
发表于 2016-10-24 15:39:55 | 显示全部楼层
i = (((unsigned int)(g_cReceBuf[1]<<8)) + (unsigned int)(g_cReceBuf[0]));          //读取数据长度标志
           if ((g_cReceNum == i + 2) && ( i != 0 ))        //接收到数据的长度应等于+2
       {   
            for (j=1; j<g_cReceNum; j++)    //数据校验计算
            {   verify ^= g_cReceBuf[j];    }  
            if (!verify)   //verify为0时,说明检验成功,数据接收没有问题
                {   
                        g_bReceOk  = 1;   //接收标志为1,
                                BELL =  0;  
                                redled = 0;
                        g_cCommand = (((unsigned int)(g_cReceBuf[5]<<8)) + (unsigned int)(g_cReceBuf[4]));        //提取命令(两个字节)
                        g_bReceAA  = 0;
                        ES = 0;
                }
        }


        if (g_cReceNum >= sizeof(g_cReceBuf))  //如果接收到数据长度大于缓存,说明数据溢出,应丢弃,故g_cReceNum = 0;
        {   g_cReceNum=0;   }
    }
回复

使用道具 举报

3

主题

14

帖子

0

精华

初级会员

Rank: 2

积分
54
金钱
54
注册时间
2016-9-28
在线时间
12 小时
 楼主| 发表于 2016-10-24 16:48:36 | 显示全部楼层
ldskendy 发表于 2016-10-24 15:39
i = (((unsigned int)(g_cReceBuf[1]

谢谢 过程大概懂了  为什么(unsigned int)(g_cReceBuf[1]<<8)) + (unsigned int)(g_cReceBuf[0]) 就是数据长度标志
回复

使用道具 举报

7

主题

90

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
325
金钱
325
注册时间
2016-10-21
在线时间
43 小时
发表于 2016-10-24 16:57:15 | 显示全部楼层
本帖最后由 ldskendy 于 2016-10-24 16:58 编辑
ice 发表于 2016-10-24 16:48
谢谢 过程大概懂了  为什么(unsigned int)(g_cReceBuf[1]

数据长度有两个字节数据,低位在前。所以g_cReceBuf[1]<<8,右移8位后,就是16位的高8位了,再加上低8位,就组成16位的数据了。
[0]和[1]两个字节数据是在通信协议中定好的了,就是[0]和[1]代表长度。
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-23 19:05

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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