找回密码
 立即注册

QQ登录

只需一步,快速开始

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

51单片机串口接收到的字符串怎么分开保存?新人求教!

[复制链接]
跳转到指定楼层
楼主
ID:700420 发表于 2020-4-9 22:45 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
比如:SBUF中得到的数据是“TZF”,怎么才能分开保存,如A="T",B="Z" ,C="F".
请教各位好哥哥,谢谢!
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:213173 发表于 2020-4-10 06:39 | 只看该作者
设置一个缓存数组和串口接收完成标志
unsigned char rec_buf[3];
bit flag=0;

void UARTInterrupt() interrupt 4
{
        static unsigned char num=0;        //静态变量
        RI=0;                                                //接收中断请求标志位清0
        rec_buf[num]=SBUF;                        //保存SBUF接收到的数据
        if(rec_buf[0]=='T')         //验证数据头正确继续接收后续数据
        {                           //否则被下一个数据覆盖并再次验证
                num++;
                if(num>=3)                                //字符串长度
                {
                        flag=1;                                //接收完成标志置1
                        num=0;
                }
        }
}

再在主函数中验证全部数据是否正确

        if(flag==1)
        {
                flag=0;
                if(rec_buf[0]=='T' && rec_buf[1]=='Z' && rec_buf[2]=='F')
                {
                        //OK,执行任务                       
                        for(i=0;i<3;i++)//缓存清0,为下次接收准备
                                rec_buf[i]=0;
                }
                else
                {
                        //ERROR 发送重传数据请求
                        for(i=0;i<3;i++)//缓存清0,为下次接收准备
                                rec_buf[i]=0;
                }
        }
回复

使用道具 举报

板凳
ID:65956 发表于 2020-4-10 08:21 | 只看该作者
有两种方法,一是先定义一组缓存,接收时先一个个存入缓存中,接收完毕后再去取缓存一个个判断是否是你接收的数据;二是接收一个判断一个,但这样是在中断里执行的,要用最短的时间处理,否则容易产生冲突,但这个效率最快;
回复

使用道具 举报

地板
ID:470332 发表于 2020-4-10 08:27 | 只看该作者
SBUF一次只能存一个字节,不存在“TZF”这种字符串,所以存数组啊
回复

使用道具 举报

5#
ID:164602 发表于 2020-4-10 08:34 | 只看该作者
我是这样做的:
                        k=SBUF;
                        if (k!='\n')
                        {
                                DD[i]=k;
                                i++;
                                if (i>9)
                                {
                                        i=0;
                                }
                        }
第一:我这段程序,是为了接收不确定长度的字符串而编写的。串口发过来的字符串最后一定以回车为结束符,没有检测到回车符,则保存到数组变量中,如果检测到回车符,则不再接收字符串,而去执行相关控制操作。
第二:如果你串口发送的字符串长度是固定的,就可以不检测字符串的结束符,一个循环就可以保存依次的字符了。
第三:个人认为,如果你使用的是51单片机,那么你帖子中说的“比如:SBUF中得到的数据是“TZF””,是不对的。51单片机(入门级的哈,你玩很高级的不在此列)SBUF只是8位,一次本来就只能发送一个字符的,所以,收到一个就保存一个,就分开了嘛。
回复

使用道具 举报

6#
ID:282850 发表于 2020-4-10 09:08 | 只看该作者
SBUF 每次传输一个字节+检验位,所以是一个字一个字传送,不存在分开的说法。TZF是三个char,收数据时直接分别保存就行了。
回复

使用道具 举报

7#
ID:477828 发表于 2020-4-10 09:25 | 只看该作者
数据用16进制。加一个数据头和尾。判断到数据头后,开始接收数据到字符数组里面。判断到数据尾就拿到全部数据了。想怎么操作就看你了!
回复

使用道具 举报

8#
ID:675145 发表于 2020-4-29 09:28 | 只看该作者
wulin 发表于 2020-4-10 06:39
设置一个缓存数组和串口接收完成标志
unsigned char rec_buf[3];
bit flag=0;

老哥   我也是你这种接收方式,但是现在需要接收不定长度的数据,而且尾部数据不一样,要怎么判断什么时候接收完
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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