2013-02-02 107 views
11

我最近買了一個Arduino Uno,現在我正在試驗一下它。我有幾個18B20傳感器和一個ENC28J60網絡模塊連接到它,然後我畫一個草圖讓我從瀏覽器連接到它,並以簡單的網頁或JSON讀出溫度。這使得網頁的代碼如下所示:Arduino的內存限制

client.print("Inne: "); 
client.print(tempin); 
client.println("<br />"); 
client.print("Ute: "); 
client.print(tempout); 
client.print("<br /><br />"); 
client.println(millis()/1000); 
// client.print("<a href=\"/json\">j</a>"); 

奇怪的是:如果我去掉最後一行,草圖編譯罰款,上傳罰款,但我不能連接到主板。如果我在其他一些打印輸出中添加更多字符,也會發生同樣的情況。因此,它看起來好像我遇到了某種內存限制(草圖的總大小約爲15   KB,並且在代碼的其他地方還有一些其他字符串 - 是的,我知道,我會重寫它以使用一個數組來存儲臨時對象,我剛剛從示例中盜取了一些代碼)。

是否有任何限制,我可以用多少內存來存儲字符串在Arduino中,有沒有辦法解決這個問題? (在具有GCC-AVR 4.3.5和AVR Libc 1.6.8的Debian PC上使用GUI v 1.0.1)。

回答

17

RAM很小,UNO的328只有2K。你可能只是用完了RAM。我瞭解到,當它耗盡時,它只是坐在那裏。

我建議您從這個庫中讀取readme以獲得FreeRAM。它提到「.print」如何使用RAM和ROM。

我現在總是使用(Arduino的IDE 1.0 +)

Serial.print(F("HELLO")); 

Serial.print("HELLO"); 

,因爲它可以節省內存,這應該lcd.print是真實的。我總是在那裏放一個

Serial.println(freeMemory(), DEC); // print how much RAM is available. 

在代碼的開頭,並留意。注意到需要有足夠的空間來運行實際的代碼,並重新詛咒它的子程序。

對於1.0.0之前的IDE,庫提供了getPSTR())。

IDE 1.0.3現在開始在編譯結束時顯示RAM的預期用法。但是,我發現它通常很短,因爲它只是一個估計。


我還建議你看看Webduino,因爲它有一個支持JSON庫。它的例子非常迅速。但它不直接支持ENC28J60。

+0

「只是一種SIST那裏」是的,沒錯。謝謝!我會檢查你的建議 – MortenSickel

+0

「F」技巧非常出色,通過串行打印修復了許多奇怪的錯誤。 – jjz

1

您可以使用名爲memoryFree的小庫檢查內存使用情況。

當有內存殘留時,您可能會推送串行緩衝區限制而不是內存限制。如果是這樣,你可以(在Windows機器上C:\Program Files (x86)\Arduino\hardware\arduino\cores\arduino)增加SERIAL_BUFFER_SIZEHardwareSerial.cpp

要當心不過,RAM和串行緩衝器都存儲在SRAM。增加串行緩衝區會導致變量的可用內存變少。

對於在Arduino上玩JSON,有一個非常好的lib,叫aJson

+0

這個傢伙知道更多關於[hardware serial buffer](http://www.hobbytronics.co.uk/arduino-serial-buffer-size) – mrv

0

添加此函數並在setup中調用它,然後在您的循環中每隔一段時間調用一次,以確保RAM沒有被用完。

// Private function: from http://arduino.cc/playground/Code/AvailableMemory 
int freeRam() { 
    extern int __heap_start, *__brkval; 
    int v; 
    return (int) &v - (__brkval == 0 ? (int) &__heap_start : (int) __brkval); 
} 

你需要調用它,例如打印內部: Serial.println(freeRam());

2

我用下面的代碼來獲取免費可用的RAM

int getFreeRam() 
{ 
    extern int __heap_start, *__brkval; 
    int v; 

    v = (int) &v - (__brkval == 0 ? (int) &__heap_start : (int) __brkval); 

    Serial.print("Free RAM = "); 
    Serial.println(v, DEC); 

    return v; 
}