在Arduino上使用Javascript共享C变量

时间:2012-05-08 07:58:30

标签: javascript c arduino

我在Arduino上编写一个简单的Web服务器。我基本上通过C代码中的方法向客户端发送HTML,CSS和Javascript。现在我在Javascript if-case中需要一个C变量,我需要在不使用ASP.NET的情况下完成它。

client.println("if (%c == 1) {",stat[0]);

我尝试更改数据类型,我尝试使用带有加号的Java风格,我甚至尝试先将其存储在字符串中,然后将其发送出去;什么都行不通。

stat [0]被声明并随时间而变化。

我从编译器得到的错误:

Webserver4.cpp:217:40:错误:调用重载'println(const char [15],byte&)'是不明确的 C:\ mpide-0023-windows-20111221 \ hardware \ pic32 \ cores \ pic32 / Print.h:66:7:注意:候选人是:void Print :: println(char,int) (...)

有什么想法吗?

2 个答案:

答案 0 :(得分:1)

正如评论者所指出的那样,在发出的Javascript代码中它应该是if (%c == 1)

另外,请注意您发出的表达式是不变的,因此您也可以重新计算C代码以发出正确的代码(如果if计算结果为true,则采用的代码)直接,并降低发出的代码的复杂性。

你没有显示stat的C声明,这使得很难确定你做得对。对于%c格式代码和数组索引,它应该是一个字符数组,这有点奇怪,因为您发出的代码是与整数进行比较。

答案 1 :(得分:1)

编译问题是由printXxx()对象上不支持client格式说明符的printf函数引起的。虽然client的类型并不明显,但它显然是内置的Arduino Print类的子类。

要使用格式说明符,您必须分两步执行此操作(请注意,Arduino中的byte实际上是uint8_t,而PRIu8是此格式说明符型):

#define __STDC_LIMIT_MACROS 1
#include <inttypes.h>

// ...

char ifStatement[13];
sprintf(ifStatement, "if (%" PRIu8 " == 1) {", stat[0]);
client.println(ifStatement);

client.println("// JavaScript code to execute if stat[0] == 1");

client.println("}");

另请注意,这假设stat[0]始终是一位数。如果它有两个或更多个数字,ifStatement缓冲区将溢出,破坏内存。

但是,由于(as unwind points out)JavaScript if语句从浏览器的角度来看基本上是不变的,所以在Arduino代码中执行此操作可能更简单:

if (stat[0] == 1) {
    client.println("// JavaScript code to execute if stat[0] == 1");
}