找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机串口SBUF数据接收问题,如何判断接受程序为1111?

[复制链接]
回帖奖励 20 黑币 回复本帖可获得 20 黑币奖励! 每人限 1 次
跳转到指定楼层
楼主
你好 想向你请教一个问题 就是我想判断接收的数据为1111应该怎么做?现在只能接收判断一个字符,自己改过用字符数组接收但还是不能实现

void Usart() interrupt 4   //串口相应中断

{
  char buf;
  
        if(RI == 1 && receiveFlag == 0)
        {
                RI = 0;//清除接收中断标志位
                buf = SBUF;
                if(buf =='1')
                {
                 receiveFlag = ’1‘;                                                                                                                                                                                                                                          
                }
  }
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:332444 发表于 2020-7-16 08:55 | 只看该作者
char接收1111已经超范围了,用int变量接收。
回复

使用道具 举报

板凳
ID:332444 发表于 2020-7-16 08:58 | 只看该作者
本帖最后由 xianfajushi 于 2020-7-17 06:42 编辑

验证一个串口能接受的数据范围有多种方法,比如我写的发送251-255的值,接收端判断是否大于250是就取余显示数码。

录像15_转.gif (2.96 MB, 下载次数: 36)

录像15_转.gif

51hei.png (52.42 KB, 下载次数: 31)

51hei.png
回复

使用道具 举报

地板
ID:661664 发表于 2020-7-16 09:10 | 只看该作者
xianfajushi 发表于 2020-7-16 08:55
char接收1111已经超范围了,用int变量接收。

我试过用int 类型 还是不行啊
回复

使用道具 举报

5#
ID:267719 发表于 2020-7-16 09:23 | 只看该作者
#define MaxReceiveLen 100
unsigned int ReceiveCount=0;
unsigned char ReceiveDat[MaxReceiveLen];
void Usart() interrupt 4   //串口相应中断
{
        if(RI == 1 && receiveFlag == 0)
        {
                RI = 0;//清除接收中断标志位
                ReceiveDat[ReceiveCount]= SBUF;                ReceiveCount++;
                if (ReceiveCount>=MaxReceiveLen)
                {
                   //接收缓存溢出处理
                   ReceiveCount=0;
                }
                if (ReceiveCount>=4)
                {
                    if (memcmp(&ReceiveDat[ReceiveCount-4],"1111",4)==0)
                    {
                          receiveFlag =1;
                          ReceiveCount=0;
                    }
                }
        }
}

回复

使用道具 举报

6#
ID:332444 发表于 2020-7-16 13:54 | 只看该作者
更正一下,刚研究了一下串口一次能接收的数据范围应从0-255这个值范围,因此是无法使用int类型接收的。
回复

使用道具 举报

7#
ID:213173 发表于 2020-7-17 07:01 | 只看该作者
//数据格式 A 1 1 1 1

unsigned char buf[5];
bit flag=0;

void Usart() interrupt 4
{
        static unsigned char num=0;        //静态变量
        RI=0;                                                //接收中断请求标志位清0
        buf[num]=SBUF;                                  //保存SBUF接收到的数据
        if(buf[0]=='A')                                //验证数据头 OK-继续接收 NO-被下一个数据覆盖
        {
                num++;
                if(num>=5)
                {
                        num=0;
                        flag=1;                                //接收完成标志置1
                }
        }
}

void parsing()//在主函数中调用
{
        unsigned char i;
        if(flag==1)
        {
                flag=0;
                if(buf[1]=='1' && buf[2]=='1' && buf[3]=='1' && buf[4]=='1')
                {
                        //任务
                }
                for(i=0;i<5;i++)
                        buf[i]=0x00;//清除缓存
        }
}


回复

使用道具 举报

8#
ID:801878 发表于 2020-7-28 09:59 | 只看该作者
定义的变量超过量程,建议用long
回复

使用道具 举报

9#
ID:367460 发表于 2020-7-28 10:15 | 只看该作者
BUF是一个8位的寄存器,你的1111超了, 你要么先发高八位,再发低八位试试
回复

使用道具 举报

10#
ID:808700 发表于 2020-7-28 10:22 | 只看该作者
你可以加个变量K,判断值为1时,k+1,对K进行判断,k=4时,说明接受到了1111,其后清零,这个过程中有一次接受到0.   k也直接清零
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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