上一篇鏈接 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的空閑中斷檢測的太苛刻,,,,根本不能夠判斷准確...
今天說一下這個是因為自己的源碼都是這種模式,因為有一些人不知道為什么這樣寫,也不知道為什么這樣用,所以今天就介紹一個,以后再有人問就直接給他看這篇文章...