在发展阶段比较早,Arduino IDE报低的SRAM存储器编译代码时。有几种方法来克服这一。
限制数据的串口接收
GSM模块将所有消息发送到微控制器的串口报告。当收到一些短信,收到的消息的总长度可以超过200个字符。这可以很快消耗掉所有的SRAM可在AtMega芯片,并且会导致稳定性问题。
为了避免这种情况,只有前200个字符的任何消息接收GSM模块将使用。下面的示例显示了如何通过计算接收到的字符变反了。
/ /扫描软件串口
/ -----------------------------------------------
rxstring =“”数据;
反= 0;
而(sserial。available()){
延迟(1);/ /短时间延迟给新的数据放在缓冲区
/得到新的特征
RXCHAR =字符(sserial。read());
/先添加200字符的字符串
如果(反<200){
rxstring .concat(RXCHAR);
计数器计数器+ 1 =
减少print()编码序列。
虽然方便在开发过程中,Arduino串口监控,使用了大量的SRAM。代码是使用尽可能少的代码开发print()系列。代码一一个部分进行了测试工作,所有的序列。print()代码从代码的那一部分删除。
使用串口打印(F((“”))的代码
很多通常显示在Arduino串口监控信息更有意义,当描述添加。看看下面的例子:
串行out.println(“等待具体行动”);
字符串“等待具体行动”是固定的,不能改变的。
代码的编译时,编译器将包含字符串“在闪存等具体行动”。
此外,编译器认为该字符串是一个常数,由“串行使用。打印”或“打印指令序列。”。该微启动期间,这个常数也放置到SRAM存储器。
通过使用“F”前缀序列。print()功能,它告诉编译器该字符串在闪存是唯一可用的。在这个例子中,字符串包含28个字符。这是28个字节,可以释放在SRAM。
串行。println(F(“等待具体行动”));
这种方法也适用于softwareserial print()命令。作为GSM模块工作在命令代码包含众多softwareserial。打印(“XXXX”)命令。使用“F”前缀释放了近300字节的SRAM。
不使用硬件串口
经过调试,硬件串口的串口print()命令移除所有残疾人。这让一些额外的字节的SRAM。
没有任何序列。print()命令代码中的左,一个额外的128字节的SRAM是可用的。这是从代码中删除硬件串口完成。弗莱德的64位字节的发送64字节的接收缓冲区。
/ /串口。开始(9600);//硬件串行端口禁用
使用EEPROM的字符串
每个输入和输出,三弦需要拯救。他们的频道名,频道在字符串时,字符串当通道关闭。
共有8个I/O通道,他们将
-
8字符串包含频道名称,每10个字符长
-
8字符串包含描述的通道,每10个字符长
-
8字符串包含信道下的描述,每10个字符长
这个广告多达240字节的SRAM。而不是存储这些字符串在SRAM,它们被存储在EEPROM。这释放了一个额外的240字节的SRAM。
宣布与正确的长度的字符串
变量通常是在开始的代码声明。一个常见的错误,当声明一个字符串变量,是我们不正确的字符数声明字符串。
字符串gsm_nr =“”;
字符串gsm_name =“”;
字符串gsm_msg =;
在启动过程中,微控制器将不在SRAM的这些变量分配内存。这可能导致不稳定的时候,这些字符串的使用。
为了防止这一点,声明字符串正确数量的字符的字符串将使用该软件。
字符串gsm_nr =“1000000000”;
字符串gsm_name =“2000000000”;
字符串gsm_msg =“;
注意,我没有申报的字符串相同的字符。如果你将这些字符串都说“1234567890”,编译器将在三变量相同的字符串,只分配足够的内存SRAM中的一个字符串。