麦浪 发表于 2014-3-9 20:36:08

lcd.print serial.println多了,程序不正常

用w5100 读sd卡,初始化时能正确打开,但运行其他代码后,打开错误,
程序去掉一部分Serial.println语句,能正常工作,怎么解决?

shihaipeng04 发表于 2014-3-9 21:39:36

前2天有个给sd读卡模块加元件改造的帖子,也许会有用。我的读卡器也不是很稳定,自己执行程序有时候都没有文件。或者是乱码名字的文件。

另外一个因素,也许在println之前先把文件卡的文件close掉,之后再重新open?也许是个思路

麦浪 发表于 2014-3-10 09:07:00

我觉得不是程序执行的问题,有些根据条件不被执行的print语句,屏蔽掉,就正常了,和使用语句多少有关系吗?

histamine 发表于 2014-3-10 09:29:38

如果用 println("xxxxxxxx") 形式调用的话,这些字符串在程序载入的过程中是会被拷贝到avr的sram里去的,多了以后sram就用爆了

建议改成 println(F("xxxxxxxxxxxx")) 形式,这样字符串只会保存在flash中,而不会被拷贝到sram里面,当需要用到的时候再从flash中取出来,不会导致sram用爆

详见: http://playground.arduino.cc/Learning/Memory

麦浪 发表于 2014-3-10 14:36:00

histamine 发表于 2014-3-10 09:29 static/image/common/back.gif
如果用 println("xxxxxxxx") 形式调用的话,这些字符串在程序载入的过程中是会被拷贝到avr的sram里去的,多 ...

高手,非常感谢,问题解决了

麦浪 发表于 2014-3-10 14:48:38

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:39:07

本帖最后由 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]
查看完整版本: lcd.print serial.println多了,程序不正常