我们正在尝试开发一个从arduino接收数据的Web应用程序。我们编程arduino每5秒向我们发送一些JSON(在Web服务器上)。 一切正常工作大约1-2分钟然后突然我们没有从arduino收到任何数据。实际上TX一直闪烁,但我们的控制台显示空字符串。 任何想法?谢谢 PS。波特率现在设置为9600,如果这告诉你的东西:)
答案 0 :(得分:0)
根据这个ajson库的github issue page,似乎print(aJsonObject *)
函数中存在内存泄漏,它返回一个用malloc()
分配的缓冲区字符数组,所以你'负责再次致电free()
。您正在调用函数print(aJsonObject *, aJsonStream *),
,然后调用printValue
,最后调用print(aJsonObject *)
,但它不会保留对已分配数组的引用,因此不会释放它。
似乎让aJson直接将数据发送到流只有在修改调用print(aJsonObject *)
以释放内存的所有函数时才会起作用。
或者,您可以自己调用print(aJsonObject *)
,将char数组的内容发送出串口,然后释放内存。这可能比修改库本身的许多函数调用更容易。
编辑:这似乎确实是问题,我刚刚在Mega2560上尝试了你的代码并在打印完每个JSON对象后打印出了可用内存(在this library的帮助下),得到了这个:
{"value1":500,"value2":1000,"value3":1500,"value4":2000} freeMemory = 7755
{"value1":500,"value2":1000,"value3":1500,"value4":2000} freeMemory = 7644
<snip>
{"value1":500,"value2":1000,"value3":1500,"value4":2000} freeMemory = 540
{"value1":500,"value2":1000,"value3":1500,"value4":2000} freeMemory = 429
{"value1":500,"value2":1000,"value3":1500,"value4":2000} freeMemory = 318
{"value1":500,"value2":1000,"value3":1500,"value4":2000} freeMemory = 207
{"value1":500,"":1000} freeMemory = 153
freeMemory = 153
freeMemory = 153
freeMemory = 153
但是,还有另外一件事情,即在json对象上调用aJson.deleteItem()
,因为这也会导致内存泄漏。尝试将循环中的代码更改为:
aJsonObject *msg = createMessage();
char *json = aJson.print(msg);
Serial.print(json);
Serial.println();
free(json);
aJson.deleteItem(msg);
现在,每次循环迭代后可用内存保持不变:
{"value1":500,"value2":1000,"value3":1500,"value4":2000} freeMemory = 7884
{"value1":500,"value2":1000,"value3":1500,"value4":2000} freeMemory = 7884
{"value1":500,"value2":1000,"value3":1500,"value4":2000} freeMemory = 7884
<snip>
编辑2:看起来使用流也可以,但是在打印数据后仍然需要调用aJson.deleteItem(msg)
。
答案 1 :(得分:0)
您如何物理连接串口?如果您在UNO或MEGA上使用USB端口,我看到DTR信号(通过电容连接到atmega328复位引脚)可以将arduino置于更新模式。