找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2937|回复: 4
收起左侧

单片机串口接收数据 怎么接收一个判断一个?

[复制链接]
ID:261025 发表于 2021-11-25 21:07 | 显示全部楼层 |阅读模式
遥控接收部分  不想接收完整的数据后再判断接收的数据是否正确  想接收一个判断一个  接收判断的部分怎么写  要C语言的  我现在只能判断第一个  往后就不会写了   比如接收123456  1到5需要判断  6存到Temp里

void UARTInterrupt(void) interrupt 4
{
        if(RI)  
        {   RI=0;   
                Receive=SBUF;                 
                if(Receive=='1')
                {          Temp=Receive;
                }
        }
        else
        TI = 0;
}




回复

使用道具 举报

ID:624769 发表于 2021-11-25 22:51 | 显示全部楼层
建议存缓存,然后统一判断, 如果非要收一个判断一个的话, 接收的时候啥事都干不了了。

接收时判断如下:

void UARTInterrupt(void) interrupt 4
{
        u8        i;
        if(RI)  
        {   
                RI=0;   
                Receive=SBUF;                 
                if(Receive=='1')                //如果第一个字节吻合'1'
                {         
                        i = 255;
                        while((--i > 0) && (!RI));
                        if(RI)
                        {
                                RI=0;   
                                Receive=SBUF;                 
                                if(Receive=='2')        //如果第二个字节吻合'2'
                                {
                                        i = 255;
                                        while((--i > 0) && (!RI));
                                        if(RI)
                                        {
                                                RI=0;   
                                                Receive=SBUF;                 
                                                if(Receive=='3')        //如果第三个字节吻合'3'
                                                {
                                                        i = 255;
                                                        while((--i > 0) && (!RI));
                                                        if(RI)
                                                        {
                                                                RI=0;   
                                                                Receive=SBUF;                 
                                                                if(Receive=='4')        //如果第四个字节吻合'4'
                                                                {
                                                                        i = 255;
                                                                        while((--i > 0) && (!RI));
                                                                        if(RI)
                                                                        {
                                                                                RI=0;   
                                                                                Receive=SBUF;                 
                                                                                if(Receive=='5')        //如果第五个字节吻合'5'
                                                                                {
                                                                                        i = 255;
                                                                                        while((--i > 0) && (!RI));
                                                                                        if(RI)
                                                                                        {
                                                                                                RI=0;   
                                                                                                My_Buf=SBUF;     //保存第六个字节到缓存并返回
                                                                                                Recive_Ok = 1;
                                                                                        }
                                                                                }
                                                                        }
                                                                }
                                                        }
                                                }
                                        }
                                }
                        }
                }
        }
        else
        TI = 0;
}


再你代码的基础上写的,i用来判断超时, i 的值取决于你的波特率,波特率越高i可以越小,反之i 可能需要增大。

最后,这种方法非常不建议。可能的话,还是推荐用缓冲池方式。
回复

使用道具 举报

ID:401564 发表于 2021-11-25 23:32 | 显示全部楼层
你这是红外遥控还是串口,红外遥控是在外部中断的,那是要接收完整数据的
如果是串口通讯,可以在上位机或者遥控程序中加入起始信号和停止信号收到起始信号开始保存到数组中,收到结束信号之后开始判断接收的信息,不需要每次都检测,那串口不累坏了
你参考一下:
void Uart1_Isr() interrupt 4        //串口1中断函数,这里要参考数据手册来编写代码
{
        char *p,Uart_S[20];
        static unsigned char RX_Count=0x0;
        if(TI)                                          //如果是发送中断触发,就处理发送中断
                   {                          
                         TI=0;                           //发送中断
                        busy=0;                          
                }  
        if(RI)
                {
                        RI=0;        //清除中断接收标示位                                                                                           
                        Uart_S[RX_Count]=SBUF;
                        if(SBUF==0xff)end_str++; //检测结束符
                        else if (end_str>0)end_str--;       
                        if((Uart_S[RX_Count]==0xe8)&&(Uart_S[RX_Count-1]==0xc9))        //检测开始接收到"设"字                                                                  
                                   {
                                        RX_Count=1;
                                        Uart_S[0]=0xc9;
                                        Uart_S[1]=0xe8;                                                                       
                                }
                        RX_Count++;
                        if(RX_Count>=20)RX_Count=0;//防止数组溢出
                        if(end_str>2)
                                {                                       
                                        p=strstr(Uart_S,"设开机");                                                                //查找指令
                                        if(NULL!=p)//如果接收到"设开机"字符串,指针返回值不为"空"
                                                {
                                                        //处理部分                                                                                                                                                                       
                                                }                                
                                        }
                                        end_str=0;
                                        RX_Count=0;                                                       
                                        memset(&Uart_S,0,sizeof(Uart_S));        //串口接收数据归零                                                 
                                }                                                       
                                                                                                                                                                                                                                                                                                                                                                                                                                     
                }                                       
}

回复

使用道具 举报

ID:311903 发表于 2021-11-26 08:22 | 显示全部楼层
对于数据接收,建立一个环形缓存,在接收数据的时候,把数据push进缓存中,在外部(while大循环中)一直检测缓存是否有数据,有数据则读取出来,类似生产者消费者模式
回复

使用道具 举报

ID:57657 发表于 2021-11-26 08:55 | 显示全部楼层
建立一个unsigned char数组,然后进行FIFO缓存。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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