程序設(shè)計中遇到程序邏輯問題以及數(shù)值不對我們可以通過串口來進(jìn)行調(diào)試辆琅,這樣可以很明確程序的走向以及我們錯在什么地方垂券,但是有時候我們會發(fā)現(xiàn)一些很奇怪的問題堵幽,調(diào)試出來也不知道為什么叼屠。
由于停車場考的是串口,串口發(fā)送數(shù)據(jù)時必須要的论颅,在寫程序時遇到了以下幾個問題:
一開始程序可以正常執(zhí)行毕泌,但是加上 sprintf 之后,外加 buf 緩存數(shù)據(jù)嗅辣,但是我的數(shù)組大小是20撼泛,在LED上顯示數(shù)據(jù),但是程序卡死澡谭,我當(dāng)時有注釋找問題愿题,找到問題所在,但是不知道是這個buf的大小太小了蛙奖,我就去設(shè)置了全局變量(下一個問題也出現(xiàn)在這個地方)潘酗,程序正常運行。
改成全局變量之后運行順暢雁仲,后面問題又來了仔夺。在程序中有設(shè)置費率以及汽車ID兩個功能,都用到串口攒砖。這個難度不大缸兔,但是我在寫完之后發(fā)現(xiàn)數(shù)據(jù)處理之后的數(shù)據(jù)不對,但是有說不出來哪里不對吹艇,當(dāng)時也在模擬考惰蜜,也就沒又多管。但是在檢查的就是發(fā)現(xiàn):第一次發(fā)送數(shù)據(jù)單片機不能正常識別受神,第二次發(fā)送有時正確抛猖,有時不能識別,但是我直接在串口中斷里面完全返回發(fā)送過去的數(shù)據(jù)鼻听,完全正確财著,這問題就出來了,我就猜撑碴,我的處理函數(shù)錯了撑教。
在晚上我再來看這個程序的時候,我發(fā)現(xiàn)我改過處理函數(shù)也不正確灰羽,然后使用串口進(jìn)行一步一步的調(diào)試驮履,然后發(fā)現(xiàn)數(shù)據(jù)處理錯誤,應(yīng)該說是不知道哪里跑來的數(shù)據(jù)廉嚼。然后我也不知道什么問題玫镐,就去隨意加大哪些全局?jǐn)?shù)組的數(shù)組大小,沒想到怠噪,成功了恐似,然后一看,**我把 u8 buf[20];
改為u8 buf[30]
傍念,沒錯就是這樣成功了矫夷;
反思:
寫程序考慮數(shù)組的大小的意義,特別是有
sprintf()
函數(shù)時憋槐,有時候我們多打了個空格双藕,少打了個空格就會超過數(shù)組的大小:局部變量容易讓程序卡死阳仔,全局變量就有可能造成溢出忧陪,就相當(dāng)于混進(jìn)其他內(nèi)存地址去了,就會讓程序出現(xiàn)莫名其妙的錯誤近范。但是寫單片機程序遵循一個變量的數(shù)據(jù)類型能小盡量小的原則嘶摊,畢竟資源有限;寫程序遇到問題要會用合適方法去找問題