前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >2-关于单片机通信数据传输(中断接收,大小端,IEEE754浮点型格式,共用体,空闲中断,环形队列)

2-关于单片机通信数据传输(中断接收,大小端,IEEE754浮点型格式,共用体,空闲中断,环形队列)

作者头像
杨奉武
发布2018-06-01 15:05:37
6570
发布2018-06-01 15:05:37
举报
文章被收录于专栏:知识分享知识分享

 上一篇链接 http://www.cnblogs.com/yangfengwu/p/8628219.html

先说明一点这种方式,不光对于单片机类的,,对于上位机接收数据同样适用----不骗人的,自己几乎所有的单片机程序,上位机程序,包括现在用的8266,GPRS等等都用这种方式接收数据,如果您还不会用或者不懂......可以这样说这个模板接收对于开发而言简直太实用了....但是请不要直接拿过来就用,请认真的想明白其中的道理,如果您不明白其中的道理,到了别的平台上还是白搭..........

亲们都用怎样的方式,接收串口的数据,,,,,有没有一直在为数据接收解析而苦恼??记得自己刚毕业的时候也是,,总感觉自己的程序不是好程序

当时自己一直在想到底有没有一个最最最最终的模板可用,后来还是前年才自己摸索到的一个程序,废话少说,

接收数据呢其实最根本的是判断接收到一串完整的数据了,然后去处理,以前哈,现在也是,很多人都是加入一些数据头啦,尾啦,数据个数啦...然后接收的时候一直判断头啦,尾啦....数据个数啦,......要是数据再变变....麻烦死人了...

其实最好判断接收到一条数据的方式就是隔一段时间去判断一下接收的数据个数有没有改变,隔一段时间去判断一下接收的数据个数有没有改变,

隔一段时间去判断一下接收的数据个数有没有改变,如果隔了一段时间数据的个数不改变了,那么就确定接收到一条完整的数据了.

先看我51串口的

隔一段时间然后去判断,最好最好的方式就是放到中断里面

写完了,,,就这样....

是不是很简单,但是妙不可言

现在处理数据

剩下的自己去处理,这个就是判断出来接收到一条完整的数据了

数据存在UsartReceive 里面

数据个数  UsartReadCntCopy

现在看一下32的

 现在看一下8266的(lua开发的)

function InitTimer1function()
   if  ReceiveDataCnt ~=0 then
       if   ReceiveDataCnt == ReceiveDataCntCopy then
            TCPReadDataOverTime = 0;
            
            ReceiveDataCopy = ReceiveData;
            ReceiveData = "";
            ReceiveDataCnt = 0;
            ReceiveDataCntCopy = 0;
            
            if  updataFlage == 0 then
                disposedata(ReceiveDataCopy);
            else
                if  ReceiveDataCopy ~= "UpdataDataSuccess" then
                    file.write(ReceiveDataCopy)
                    updataCnt = updataCnt + 1
                    if  TcpConnect ~= nil then
                        TcpConnect:send("WaitUpdataData"..updataCnt..";");
                    end  
                    print("start down...")  
                else
                    if  TcpConnect ~= nil then
                        TcpConnect:send("UpdataDataSuccess");
                        TcpConnect:close()
                    end
                    file.close() 
                    updataFlage = 0  
                    print("UpdataDataSuccess")  
                    
                    tmr.stop(0)
                    tmr.stop(1)
                    --dofile("main.lua");
                    node.compile("updata.lua")
                    dofile("updata.lua");
                    --dofile("main.lc"); 
                end
                ReceiveDataCopy = "";
            end
       else
            ReceiveDataCntCopy = ReceiveDataCnt      
       end
   end
end
tmr.alarm(1, 400, 1, InitTimer1function)

上位机的就不看了,还要打开软件...电脑快卡死了....

现在说一下注意点:

 假设我接收一个间隔100ms就来一条数据,,,那么我的上面的那个时间就要小于100ms,

其实我一直用5-10ms的间隔时间,

假设波特率很低1200吧,也就是说每间隔 1/1200 S发送过来一位数据  == 0.83ms

如果再苛刻,我就会用芯片自带的空闲中断...51没有哈(不确定有没有,没仔细看过手册...),,32是有的

32虽然有,但是我极少用....

是因为一次载波问题,,,,有没有做过载波的??在电线上传输串口的数据??

载波的数据延迟很高......直接用32的空闲中断检测的太苛刻,,,,根本不能够判断准确...

今天说一下这个是因为自己的源码都是这种模式,因为有一些人不知道为什么这样写,也不知道为什么这样用,所以今天就介绍一个,以后再有人问就直接给他看这篇文章...

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018-04-23 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档