单片机下串口(UART)协议包接收程序

发布时间:2023-03-24  

代码编写在51单片机上,用于从接收缓冲区中提取有用数据(协议包)。基本逻辑亦可用于其他语言,其他情况下的接收程序。


数据的转移主要分了3步,接收缓冲区=》待处理数据=》有用数据。


接收缓冲区提取到待处理数据:由于可能下一个包马上就要过来,所以应把数据提取出来再做处理,以免直接处理的过程中收到新的数据造成混乱。


待处理数据提取到有用数据:例如在某些环境下,会收到其他协议的包(由其他程序处理),或者带有地址区分是否发给本机的包,所以需要设置一些条件来提取真正有用的数据。


单片机串口UART在接收中断程序中写入接收缓冲区,一定时间没有收到数据则标志为接收空闲(完成一个包的接收)。


本段代码先判断串口处于接收空闲状态,然后判断包太小则放弃,认为是错误包。


失能中断,把接收缓冲区提取出来后,重新使能中断,以尽快准备好接收下一次数据传输。


然后则开始搜索包头(帧头),然后把符合协议的部分提取出来,清空包头以免重复处理,最后解析该包。


int WaitingBuf(void)

{

    int return_err=5;

    uint8 bytecnt;

    uint8 i;    

    uint16 dest_p;

    uint16 ScanningAddr;

    uint8 buffer[RXBUFSIZE];//如果太小,收到数据CNT比他大,则程序崩溃    

    uint8 ReceiveBuf[20];

    

    if(rs_state==RS_IDLE)//uart中断接受处于空闲状态,表示一个包接受结束,利用一定时间内没有收到数据判断

    {        

        bytecnt=r_count;

        if(bytecnt<=5)//包太小,误传,错误包,电压不稳定等 

            return 3;

        UA_IER &= (~RDA_IEN | ~RLS_IEN);    //禁止中断,提取本次接收完成后,接受缓冲区的数据

        for(i=0;i        {

            buffer[i]=r_buf[i];

        }

        r_count=0;//让缓冲区重新从头开始储存

        UA_IER |= (RDA_IEN | RLS_IEN);   //使能中断,提取数据完毕,准备下一次接收数据

        for(ScanningAddr=0;ScanningAddr        {

            if(buffer[ScanningAddr] == 0xEF && buffer[ScanningAddr+1] == 0x01)//找到包头

            {

                for(dest_p=0;dest_p                {

                    ReceiveBuf[dest_p]=buffer[ScanningAddr+dest_p];    

                }

                buffer[ScanningAddr]=0;//清除包头,以免重复处理

                buffer[ScanningAddr+1]=0;

                return_err = ReceiveBufAnalysis(ReceiveBuf);//把收到的协议包送去处理

                break;//如果存在有1个以上数据包将快速发送过来的话,可能缓存区一次将包含2个有用的包,需要去掉该break;

            }

        }    

    }

    else 

        return_err = 2;

    return return_err;

}


文章来源于:电子工程世界    原文链接
本站所有转载文章系出于传递更多信息之目的,且明确注明来源,不希望被转载的媒体或个人可与我们联系,我们将立即进行删除处理。

相关文章

    的数据来到。电路图: 三、 实验步骤 编写串口初始化程序,配置中断接收内容 编写判断循环主体函数 根据主体判断循环的结果,编写各个按键判断循环 在按键判断循环里面编写按键扫描函数,判断......
    要参考对应说明了。 接下来我们要怎么验证单片机与计算机进行通信了呢?我们现在就编程实现计算机串口助手发送数据,单片机收到数据就做出回应将数据回传给计算机。 现在我们先来看看程序的具体实现过程。 /* *这是一个串口通信应用程序......
    ) ( 12) 程序详细说明: (1)头文件包含。 (2)声明串口初始化程序。 (3)设置定时器1 工作在模式2,自动装载初值(详见第二讲)。 (4)SMOD 位清0,波特率不加倍。 (5)串行口工作在方式1......
    可以直接读取CommEvent属性的值来检测通信中产生的事件和错误类型,这种方法比较简单,常用在小的自含程序中。 该设计程序即采用查询法读取InBufferCount的属性值来接收单片机发来的数据。实验主程序对串口初始化......
    内部。      51串行口通信编程机制   决定编程机制的先决条件是51单片机的硬件结构及51芯片内部CPU的执行机制。根据串行通信口硬件结构,实现UART通信可以分为两步:   (1)初始化串行通信口( UART......
    51单片机 HC05蓝牙模块学习;一、注意事项 1、烧写程序时,要把蓝牙tx,rx信号线拔掉,对烧写程序有影响。 2、执行HC05集命令时,均以rn结尾。串口中断若选择“发送新行”时,不用......
    Light_Out = P1^6;//亮灯指示灯 sbit Spdt_Out = P1^7;//继电器输出 //串口初始化 u8 Light_flag=0,Show_mode=0; extern......
    Light_Out = P1^6;//亮灯指示灯 sbit Spdt_Out = P1^7;//继电器输出 //串口初始化 u8 Light_flag=0,Show_mode=0; extern......
    基于51单片机的蓝牙密码锁;原理图: PCB图: 程序运行图: 部分程序: #include #include #include #include <12864.h>......
    与89C51串口参数的设置必须一致,否则两者无法进行通讯。设置PC机串口参数的初始化程序如下: If(!m_Com1.getportOpen()) m_Com1.SetPortOpen(TRUE);//打开串口......

我们与500+贴片厂合作,完美满足客户的定制需求。为品牌提供定制化的推广方案、专属产品特色页,多渠道推广,SEM/SEO精准营销以及与公众号的联合推广...详细>>

利用葫芦芯平台的卓越技术服务和新产品推广能力,原厂代理能轻松打入消费物联网(IOT)、信息与通信(ICT)、汽车及新能源汽车、工业自动化及工业物联网、装备及功率电子...详细>>

充分利用其强大的电子元器件采购流量,创新性地为这些物料提供了一个全新的窗口。我们的高效数字营销技术,不仅可以助你轻松识别与连接到需求方,更能够极大地提高“闲置物料”的处理能力,通过葫芦芯平台...详细>>

我们的目标很明确:构建一个全方位的半导体产业生态系统。成为一家全球领先的半导体互联网生态公司。目前,我们已成功打造了智能汽车、智能家居、大健康医疗、机器人和材料等五大生态领域。更为重要的是...详细>>

我们深知加工与定制类服务商的价值和重要性,因此,我们倾力为您提供最顶尖的营销资源。在我们的平台上,您可以直接接触到100万的研发工程师和采购工程师,以及10万的活跃客户群体...详细>>

凭借我们强大的专业流量和尖端的互联网数字营销技术,我们承诺为原厂提供免费的产品资料推广服务。无论是最新的资讯、技术动态还是创新产品,都可以通过我们的平台迅速传达给目标客户...详细>>

我们不止于将线索转化为潜在客户。葫芦芯平台致力于形成业务闭环,从引流、宣传到最终销售,全程跟进,确保每一个potential lead都得到妥善处理,从而大幅提高转化率。不仅如此...详细>>