2013-08-16 34 views
0

我試圖編寫一個函數,將從不同的來源(以太網客戶端/串行/等等)文本拉到一行,然後比較他們並根據他們運行其他功能。簡單..Arduino Serial.println()輸出一個空行,如果不在循環中()

雖然這個工程,我試圖調用一個簡單的Serial.println()從一個非循環()函數的問題。

到目前爲止,我有大約140行代碼,但在這裏是造成我的問題部分的下調版本:

boolean fileTerm; 

setup() { 
    fileTerm = false; 
} 

loop() { 
char character; 
String content=""; 
while (Serial.available()) { 
    character = Serial.read(); 
    content.concat(character); 
    delay(1); 
} 

if (content != "") { 
Serial.println("> " + content); 

/** Error from Serial command string. 
    * 0 = No error 
    * 1 = Invalid command 
    */ 
    int err = testInput(content); 
} 

int testInput(String content) { 
    if (content == "term") { 
    fileTerm = true; 
    Serial.println("Starting Terminal Mode"); 
    return 0; 
    } 

    if (content == "exit" && fileTerm == true) { 
    fileTerm = false; 
    Serial.println("Exiting Terminal Mode"); 
    return 0; 
    } 
    return 1; 
} 

(在http://pastebin.com/prEuBaRJ完整的源)

所以問題是捕捉「term」命令並輸入某種文件系統終端模式(最終訪問和操作SD卡上的文件)。 「exit」命令將離開終端模式。

但是,每當我實際編譯和類型與其他這些命令轉換爲串行監視器,我看到:

> hello 
> term 

> test for index.html 
> exit 

> test 
> foo 
> etc... 

我的數字功能是捕捉那些保留條款和實際妥善處理它們,但不管是什麼原因,不會通過串行總線發送所需的響應。

只是爲了正確的語法,我還在一個單獨的頭文件中聲明瞭testInput()函數,儘管我懷疑這對這個特定的錯誤是否會發生有任何影響。

任何可以解釋的原因?

謝謝。

型號:Arduino的烏諾R3,IDE版本:1.0.4,但這種行爲也發生在某些情況下,V1.0.5 ..

回答

3

這是有點兒猜測的,你怎麼最後決定將延遲(1)在您的代碼中,這是解決代碼中的錯誤的解決方法。但是你沒有正確解決它。你可能看到的是,在你輸入完畢之前,你的代碼太急於處理命令了。所以你放慢了速度。

但是,這不是正確的修復,你真正想要做的是等待整個命令輸入。直到您按下鍵盤上的Enter鍵。

這是您的代碼中的錯誤,內容變量不僅包含「term」,還包含由您的終端的Enter鍵生成的字符。這就是爲什麼你不匹配。

因此,修復你的代碼,添加一個測試來檢查你是否得到了Enter鍵字符。然後然後處理該命令。

+0

非常好!我現在不在我的試驗檯附近,但是我一會兒就會測試一下。 – depwl9992

+0

但是,我只記得Arduino串口監視器無論如何都是緩衝的,並沒有完全按照你輸入的方式進行處理。因此,在我看來,輸入密鑰代碼可能永遠不會傳遞給要處理的單元,因爲它只用於告訴軟件「將緩衝區存儲到com端口」。這是一個正確的假設嗎? – depwl9992

+0

不在Arduino中。如果它發生在任何地方,它應該或延遲(1)是不夠的,那麼它可能發生在你正在使用的任何終端程序中。 –

相關問題