我負責一個模塊,功能比較簡單,就是測量環境溫、濕度,外加控制空調開/關、溫度設定。就是這么幾個功能,就反復試驗、修改,才達到穩定。在調試時,出現各種各樣的BUG,一些是編程時候出現的語法錯誤,一些是功能設計不合理的原因。其中有個BUG折騰了好久,今天終于發現原因,這還是別人幫助我才解決的。下面看看這除BUG的過程:
???
空調通訊方面問題比較多:
1、起初是有時候出現空調與模塊完全不能通訊的現象;
2、出現空調與模塊單邊通訊的現象,即空調收到模塊的指令,但模塊沒有收到空調返回的信息;
3、出現空調與模塊首次上電時,情況2發生,但不重啟的情況時,第二次之后完全通訊成功(雙邊通訊)的現象。
針對情況一,通過請教OMRON公司的技術人員,我了解到溫控器接收指令與發送指令之間必須有一定的時間間隔,大概有500ms就可以了。所以我在發送數據程序中加入了500ms的延時指令,問題1情況不在出現,但隨之而來的是問題2的頻繁出現。這個問題困擾了我很長時間。在現場我做了如下試驗:
首先,斷開溫控器與模塊之間的RS485連接,然后通過usb轉串口線把溫控器與調試所用的筆記本連接起來,然后通過通過串口調試助手調試溫控器,目的是為了驗證溫控器是否能夠正常工作。經過試驗,結果表明溫控器完全能夠正常工作。電氣連接示意圖如圖1:
?
圖1 溫控器與上位機連接
接著,斷開筆記本與溫控器的連接,然后通過usb轉串口線把模塊與調試所用的筆記本連接起來,然后通過串口調試助手調試模塊,目的是為了測試模塊軟件是否正常。經過試驗,結果表明模塊能夠成功接收到串口助手發送過來的數據。電氣連接示意圖如圖2:
圖2? 模塊與上位機連接
最后,重新連接溫控器與模塊,上電,設置溫度,情況2再次出現。電氣連接示意圖如圖3:
圖3 溫控器與模塊連接
同時連接溫控器、模塊、筆記本時候,則溫控器與模塊之間能夠夠正常通信。電氣連接示意圖如圖4:
圖4 溫控器與模塊、上位機連接
到此初步估計是由于RS485接線問題,經過詢問OMRON公司技術人員可知,1對1時,RS485總線終端電阻(約為120歐姆)可有可無。模塊上接有終端電阻,當我嘗試去掉該電阻時,針對圖3情況時,問題2得到解決。但出現問題3。
經過考慮,在模塊上電初始化中,我加入了向空調發送“開空調”程序,這段程序能夠保證每次模塊上電時都要重新開啟空調,以保證空調隨時進行接收別的指令(當空調處于“關”時,它是不工作的,即使空調已經上電)。問題3得以解決。
到這里,本以為可以結束了,其實還有很大的問題,如果在模塊上電之后才開空調的話,那么那個初始化中加入的指令就不會起作用,還是會出現問題3。這個方法治標不治本,后來,在一同事的幫助下,終于從根本上解決的問題。問題是這樣解決的,只在一個地方加了這么一條語句。
void beginSend(void)
{?
?uint8 i = 0;
?sendEnable();?//設為發送??
?TXSTAbits.TXEN = 1; //使能發送?
??? for(i=0; i< sendCount; i++)
??? {
?? TXREG? = sendBuf[i];??
?? while (!TXSTAbits.TRMT);?? //TSR為空時置TRMT = 1
??? }
??? receEnable();??? //設為接收
??? sendCount = 0;
??? receCount = 0;??? //這個很重要
??? TXSTAbits.TXEN = 0;
??? Delay10KTCYx(100);?? //延時500ms????
}
關于這個函數就不多解釋了。對比我這樣、那樣的測試,還是沒有找到錯誤的根本原因,人家只是看了一遍調試報告,就立馬找出了問題的所在。這固然有經驗的問題,但更多的是我自身對于問題的分析不夠冷靜、思維不夠嚴謹。還沒有形成自己的一套發現錯誤、分析錯誤、解決錯誤的思維體系。在遇到“比較怪”的情況時,就亂了方陣,試圖用窮舉法把可能出現錯誤的地方都測試一遍,這大大消耗了時間,并且本質上講并不能對解決問題有效的幫助。反而可能因為混亂一通的測試,遇到更多別的問題,最終偏離了正確解決問題的道路。
發現并找到一種合乎科學的編程習慣、除BUG思路是以后工作時的重中之重。
?
?
?
?
?
?
?
?
?
?