2014-02-06 54 views
1

我正在處理arduino,並且我想存儲一些從web服務傳入的字符。 代碼將自行解釋:在循環函數中存儲傳入的字符

void loop() { 
    static int i = 0; 
    static int count = 0; 
    static char tmp[100]; 

    if (wifly.avaible()) { 
     char c = wifly.read(); 
     Serial.print(c); 
     tmp[i] = c; 
     i++; 
     if (c == '"') 
     count++; 
     if (count == 2) 
     { 
     Serial.print("Received : "); 
     Serial.println(tmp); 
     } 
    } 
} 

如果我只讓這樣的代碼:

void loop() { 
    if (wifly.avaible()) { 
     char c = wifly.read(); 
     Serial.print(c); 
    } 
} 

所有工作正常,所有字符都寫。但我需要存儲所有傳入的字符來解析整個字符串。

你有沒有想過爲什麼,當我試圖庫存他們時,程序停止工作,什麼都不寫?

+1

緩衝區溢出一旦你得到你的第101個字符,也許? – Jarod42

+1

你確定你會從服務中獲得最多99個字符嗎?代碼中沒有任何東西可以防止緩衝區溢出。 – suspectus

+0

可能不相關,但完成後需要將'i'和'count'重置爲0。 – molbdnilo

回答

0

您必須防止緩衝區溢出。緩衝器tmp必須以零值字節結尾。 tmp是靜態的,所以是零填充。使用標記值(BufferMaxChars)確保緩衝區的最後一個字節爲零值終止。

我猜在這裏 - 但可能你想打印出用引號括起來的字符串值。如果是這樣的話,tmp緩衝區只會被分配一次count == 1(當找到第一個引號字符時)。

void loop() { 
    const int BufferMaxChars = 100-1; 
    static int i = 0; 
    static int count = 0; 
    static char tmp[BufferMaxChars]; 

    if (wifly.avaible()) { 
     char c = wifly.read(); 
     Serial.print(c); 
     tmp[i] = c; 
     i++; 
     if (c == '"') 
     count++; 
     if (i >= BufferMaxChars || count == 2) 
     { 
     Serial.print("Received : "); 
     Serial.println(tmp); 
     } 
    } 
} 
+0

對不起,我遲到了。但你是對的,我是愚蠢的...這是一個緩衝區溢出。非常感謝 ! – carndacier

+0

很高興現在正在工作 - 我們都犯了類似的錯誤! – suspectus