标题: 单片机串口SBUF数据接收问题,如何判断接受程序为1111? [打印本页]

作者: 夜鹫    时间: 2020-7-15 14:59
标题: 单片机串口SBUF数据接收问题,如何判断接受程序为1111?
你好 想向你请教一个问题 就是我想判断接收的数据为1111应该怎么做?现在只能接收判断一个字符,自己改过用字符数组接收但还是不能实现

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

{
  char buf;
  
        if(RI == 1 && receiveFlag == 0)
        {
                RI = 0;//清除接收中断标志位
                buf = SBUF;
                if(buf =='1')
                {
                 receiveFlag = ’1‘;                                                                                                                                                                                                                                          
                }
  }

作者: xianfajushi    时间: 2020-7-16 08:55
char接收1111已经超范围了,用int变量接收。
作者: xianfajushi    时间: 2020-7-16 08:58
本帖最后由 xianfajushi 于 2020-7-17 06:42 编辑

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

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

录像15_转.gif

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

51hei.png

作者: 夜鹫    时间: 2020-7-16 09:10
xianfajushi 发表于 2020-7-16 08:55
char接收1111已经超范围了,用int变量接收。

我试过用int 类型 还是不行啊
作者: carpcarey    时间: 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;
                    }
                }
        }
}


作者: xianfajushi    时间: 2020-7-16 13:54
更正一下,刚研究了一下串口一次能接收的数据范围应从0-255这个值范围,因此是无法使用int类型接收的。
作者: wulin    时间: 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;//清除缓存
        }
}



作者: 乐儿翅    时间: 2020-7-28 09:59
定义的变量超过量程,建议用long
作者: 昆明路口卖提莫    时间: 2020-7-28 10:15
BUF是一个8位的寄存器,你的1111超了, 你要么先发高八位,再发低八位试试
作者: lxbhcy    时间: 2020-7-28 10:22
你可以加个变量K,判断值为1时,k+1,对K进行判断,k=4时,说明接受到了1111,其后清零,这个过程中有一次接受到0.   k也直接清零




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1