lcd.print serial.println多了,程序不正常
用w5100 读sd卡,初始化时能正确打开,但运行其他代码后,打开错误,程序去掉一部分Serial.println语句,能正常工作,怎么解决? 前2天有个给sd读卡模块加元件改造的帖子,也许会有用。我的读卡器也不是很稳定,自己执行程序有时候都没有文件。或者是乱码名字的文件。
另外一个因素,也许在println之前先把文件卡的文件close掉,之后再重新open?也许是个思路 我觉得不是程序执行的问题,有些根据条件不被执行的print语句,屏蔽掉,就正常了,和使用语句多少有关系吗? 如果用 println("xxxxxxxx") 形式调用的话,这些字符串在程序载入的过程中是会被拷贝到avr的sram里去的,多了以后sram就用爆了
建议改成 println(F("xxxxxxxxxxxx")) 形式,这样字符串只会保存在flash中,而不会被拷贝到sram里面,当需要用到的时候再从flash中取出来,不会导致sram用爆
详见: http://playground.arduino.cc/Learning/Memory histamine 发表于 2014-3-10 09:29 static/image/common/back.gif
如果用 println("xxxxxxxx") 形式调用的话,这些字符串在程序载入的过程中是会被拷贝到avr的sram里去的,多 ...
高手,非常感谢,问题解决了 histamine 发表于 2014-3-10 09:29 static/image/common/back.gif
如果用 println("xxxxxxxx") 形式调用的话,这些字符串在程序载入的过程中是会被拷贝到avr的sram里去的,多 ...
print(F(""))怎么写成变量形式?
如:
String s="123";
print(F(s))
类似如此 本帖最后由 histamine 于 2014-3-10 15:43 编辑
麦浪 发表于 2014-3-10 14:48 static/image/common/back.gif
print(F(""))怎么写成变量形式?
如:
String s="123";
F()是一个宏定义,在编译时起作用,而不是在运行时
其本质上是通过PROGMEM关键词声明了一个存储在flash中的一个以\0结尾的字符数组,然后取这个字符数组的地址,强行转换为const __FlashStringHelper *类型
class __FlashStringHelper;
#define F(string_literal) (reinterpret_cast<const __FlashStringHelper *>(PSTR(string_literal)))
# define PSTR(s) (__extension__({static char __c[] PROGMEM = (s); &__c;}))
如果又想要节省内存又想要有String各种方便的操作,可以考虑使用以下方法(只能在ARDUINO 1.5.3 BETA版本以后的arduino中使用,见https://github.com/arduino/Arduino/commit/1130fede3a2b0af2182131b48f5892b308f7aab6){
String s = F("aaaaaaaaaa");
}在作用域内String s初始化时会把"aaaaaaaaaa"从flash拷贝到动态分配的内存中,退出作用域时String s动态分配的内存将会被销毁。
使用时请保证String s的生命周期足够短。
有关PROGMEM关键词,详见:http://www.arduino.cc/en/Reference/PROGMEM
页:
[1]