极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 14204|回复: 6

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

[复制链接]
发表于 2014-3-9 20:36:08 | 显示全部楼层 |阅读模式
用w5100 读sd卡,初始化时能正确打开,但运行其他代码后,打开错误,
程序去掉一部分Serial.println语句,能正常工作,怎么解决?
回复

使用道具 举报

发表于 2014-3-9 21:39:36 | 显示全部楼层
前2天有个给sd读卡模块加元件改造的帖子,也许会有用。我的读卡器也不是很稳定,自己执行程序有时候都没有文件。或者是乱码名字的文件。

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

使用道具 举报

 楼主| 发表于 2014-3-10 09:07:00 | 显示全部楼层
我觉得不是程序执行的问题,有些根据条件不被执行的print语句,屏蔽掉,就正常了,和使用语句多少有关系吗?
回复 支持 反对

使用道具 举报

发表于 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
如果用 println("xxxxxxxx") 形式调用的话,这些字符串在程序载入的过程中是会被拷贝到avr的sram里去的,多 ...

高手,非常感谢,问题解决了
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-3-10 14:48:38 | 显示全部楼层
histamine 发表于 2014-3-10 09:29
如果用 println("xxxxxxxx") 形式调用的话,这些字符串在程序载入的过程中是会被拷贝到avr的sram里去的,多 ...

print(F(""))怎么写成变量形式?
如:
String s="123";
print(F(s))
类似如此
回复 支持 反对

使用道具 举报

发表于 2014-3-10 15:39:07 | 显示全部楼层
本帖最后由 histamine 于 2014-3-10 15:43 编辑
麦浪 发表于 2014-3-10 14:48
print(F(""))怎么写成变量形式?
如:
String s="123";


F()是一个宏定义,在编译时起作用,而不是在运行时

其本质上是通过PROGMEM关键词声明了一个存储在flash中的一个以\0结尾的字符数组,然后取这个字符数组的地址,强行转换为const __FlashStringHelper *类型
  1. class __FlashStringHelper;
  2. #define F(string_literal) (reinterpret_cast<const __FlashStringHelper *>(PSTR(string_literal)))

  3. # define PSTR(s) (__extension__({static char __c[] PROGMEM = (s); &__c[0];}))
复制代码


如果又想要节省内存又想要有String各种方便的操作,可以考虑使用以下方法(只能在ARDUINO 1.5.3 BETA版本以后的arduino中使用,见https://github.com/arduino/Ardui ... 1b48f5892b308f7aab6
  1. {
  2.     String s = F("aaaaaaaaaa");
  3. }
复制代码
在作用域内String s初始化时会把"aaaaaaaaaa"从flash拷贝到动态分配的内存中,退出作用域时String s动态分配的内存将会被销毁。

使用时请保证String s的生命周期足够短。

有关PROGMEM关键词,详见:http://www.arduino.cc/en/Reference/PROGMEM
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|联系我们|极客工坊

GMT+8, 2026-6-13 22:38 , Processed in 0.042781 second(s), 21 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表