Arduino与我们的服务器松散串行连接

时间:2014-06-01 00:16:18

标签: sockets serial-port arduino

我们正在尝试开发一个从arduino接收数据的Web应用程序。我们编程arduino每5秒向我们发送一些JSON(在Web服务器上)。 一切正常工作大约1-2分钟然后突然我们没有从arduino收到任何数据。实际上TX一直闪烁,但我们的控制台显示空字符串。 任何想法?谢谢 PS。波特率现在设置为9600,如果这告诉你的东西:)

Here is the link for code

2 个答案:

答案 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置于更新模式。