找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1991|回复: 6
收起左侧

基于单片机UART不定长字符串接收

[复制链接]
ID:574346 发表于 2022-6-5 21:57 | 显示全部楼层 |阅读模式
串口接收数据有两种方式:
1.有帧头,帧尾,固定的数据长度;
2.不固定长度,也没有帧头或帧尾;
第1种方法好处理。第2种,需要加入超时判断,当接收到一个字节后,开始计数,超过一定时间,没有接收到下一个数据,就认为数据接收完成。
以下是代码:
回复

使用道具 举报

ID:574346 发表于 2022-6-5 21:57 | 显示全部楼层
一.定义一个结构体,方便代码移植

二.串口中断中接收数据,并装入超时时间30ms

三.在定时器中判断,是否超时,接收完成,进行数据处理
回复

使用道具 举报

ID:248754 发表于 2022-6-6 09:37 | 显示全部楼层
貌似代码没有上传上来啊
回复

使用道具 举报

ID:574346 发表于 2022-6-9 20:02 | 显示全部楼层

一.定义一个结构体,方便代码移植
typedef struct{
        char rec_buff[50];                                //接收数据缓存
        char rec_data[50];                                //接收数据
        unsigned char Rec_Step;                        //接收步骤
        unsigned char Rec_Complete;                //接收完成标志
        unsigned char Rec_Dat_Cnt;                //接收数据计数
        unsigned char Rec_Buf_Cnt;                //接收数据计数
        unsigned char Rec_Timeout;                //接收超时计数10ms
}Rec_Uarts;
//接收步骤
#define REC_WAIT         0x00                           //接收等待
#define REC_DATA         0x01                         //接收数据
#define REC_END         0x02                         //结束

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:574346 发表于 2022-6-9 20:04 | 显示全部楼层
二.串口中断中接收数据,并装入超时时间30ms
        char  rx_data=0;
        rx_data=RXD0;

        if((rx_data!='\r')&&(rx_data!='\n'))                                        //不是回车符和换行符
        {
                Rec_Uart0.Rec_Step=REC_DATA;                                                //接收数据状态
                Rec_Uart0.rec_buff[Rec_Uart0.Rec_Buf_Cnt]=rx_data;
                Rec_Uart0.Rec_Buf_Cnt++;
                Rec_Uart0.Rec_Timeout=30;
        }

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:574346 发表于 2022-6-9 20:05 | 显示全部楼层
三.在定时器中判断,是否超时,接收完成,进行数据处理
        if(Rec_Uart0.Rec_Step==REC_DATA)        //uart0在接收状态
        {
                if(Rec_Uart0.Rec_Timeout)
                {
                        Rec_Uart0.Rec_Timeout--;
                        if(Rec_Uart0.Rec_Timeout==0)
                        {
                                Rec_Uart0.Rec_Complete=1;
                                Rec_Uart0.Rec_Dat_Cnt=Rec_Uart0.Rec_Buf_Cnt;
                                Rec_Uart0.Rec_Buf_Cnt=0;
                                Rec_Uart0.Rec_Step==REC_WAIT;
                        }
                }
        }
回复

使用道具 举报

ID:93929 发表于 2022-6-9 20:43 | 显示全部楼层
用状态机
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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