2010-11-13 47 views
2

我正在使用PIC18F,並試圖通過超級終端發送數據。當我每半秒鐘按一個鍵以慢速發送數據時,它會收到數據並正確回顯,但當我以更快的速度開始按鍵時,MCU會鎖定。不知道是什麼原因造成的。如果快速發送數據,PIC18F鎖定

while(index<length){ 
    while(PIR1bits.RCIF==0); // Wait till char recieved 
    sendData(str2,9); // confirm reception 

    Delay1KTCYx(5); //delay because without it, it messes up. 
    rxData[index]= RCREG; //char array 
    index++; 
} 

波特率是2400在PIC和超級終端上。

這是我們的接收循環。 sendData只是我們發送的「接收」調試代碼。這是我們如何知道它何時凍結的。

它不會每次都以相同數量的循環凍結,而只是我們輸入數據的速度有多快。

+0

你怎麼知道PIC是鎖定的?代碼來自您的ISR?或者當你收到一個字節時你有額外的ISR嗎? – AndreKR 2010-11-13 23:42:30

+2

這是在中斷服務程序中?不要循環,不要發送,不要拖延。 – 2010-11-13 23:52:48

回答

2

(我做了MCU的工作,但還沒有與太平洋島國的交易,所以我會盡力幫助常見問題)

  1. 你不檢查任何接收器錯誤標誌。接收器可能會鎖定在溢出錯誤狀態,並且不會進一步接收,直到您清除溢出標誌。添加檢查錯誤條件並解決它們符合PIC文檔。

  2. 好的做法是在接收完成時儘可能早地讀取接收到的字節,因此請儘量在while(PIR1bits.RCIF==0);之後移動rxData[index]= RCREG;。這降低了可能性

  3. 您沒有顯示sendData的代碼。可能會錯過檢查TX就緒狀態和錯誤情況,所以它也可能鎖定。

  4. 無心的延遲表明你已經在某處出錯了。嘗試刪除它,然後調試代碼。

  5. 你應該測試你的接收和分開發送。首先,檢查發送器:嘗試通過UART輸出長文本而不接收。 (說,寫「Hello world!」程序:))

  6. 單獨檢查接收代碼:從程序中刪除傳輸,連接LED(電壓表,示波器,無論你有什麼)來釋放GPIO引腳,然後使其切換邏輯每當它接收到一個字節時,它就會在它上面。是否只需要幾個時鐘週期來做,它不應該干預接收或鎖定。

0

也許當您在發送2個字符的同時發送「收到」其中一個被丟棄,並且您永遠不會到達您的length

0

在大多數微控制器上,UART接收器溢出將導致新接收的字節被丟棄並且標誌被置位,但接收器將繼續正常工作。在PIC上,接收器溢出會導致UART死機,直到CREN位被清零並重新置位。