在Arduino上与Javascript共享C变量
我正在Arduino上编写一个简单的web服务器。我基本上是通过C代码中的方法将HTML、CSS和Javascript发送到客户端。现在我需要在Javascript if中使用一个C变量,我需要在不使用ASP.NET的情况下使用它在Arduino上与Javascript共享C变量,javascript,c,arduino,Javascript,C,Arduino,我正在Arduino上编写一个简单的web服务器。我基本上是通过C代码中的方法将HTML、CSS和Javascript发送到客户端。现在我需要在Javascript if中使用一个C变量,我需要在不使用ASP.NET的情况下使用它 client.println("if (%c == 1) {",stat[0]); 我试着改变数据类型,我试着使用带有加号的Java风格,我甚至试着先将它存储在字符串中,然后再发送进来;什么都不管用 stat[0]已声明并随时间变化 我从编译器中得到的错误: Web
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)
(……)
有什么想法吗?正如一位评论者所指出的,如果(%c==1)在发出的Javascript代码中,它可能是
另外,请注意,您发出的表达式是常量,因此您也可以重新计算您的C代码的因子,以直接发出正确的代码(如果if
的计算结果为true,则采用该代码),并降低发出代码的复杂度
您没有显示stat
的C声明,这使得您很难确定是否正确地执行了该操作。对于%c
格式化代码和数组索引,它应该是一个字符数组,这有点奇怪,因为您发出的代码与整数进行比较。编译问题是由于printXxx()
客户端上可用的功能不支持printf
格式说明符。虽然不清楚客户机的类型是什么,但它显然是内置Arduino类的子类
要使用格式说明符,必须分两步进行,例如(请注意,Arduino中的字节实际上是uint8\t
,而PRIu8
是此类型的格式说明符):
如果(%c==1)
,这不应该是吗?虽然编译错误没有注意到Javascript错误,但您完全正确,我将更改它。:)我把问题改成了=
。不过,可以说,因为这是Javascript,所以最好是==
…如果您的意思是这样的话,那么直接将If case与C-code结合使用会有点问题。Stat是一个声明为字节的数组(我尝试了%b),Stat[0]是0或1。Stat[0]始终是1或0。我本质上希望Javascript代码的不同部分根据stat[0]是什么运行;它是什么将不时地改变。如果我使用你的第二个建议,这意味着在刷新站点时不会注册stat[0]中的任何更改,对吗?它不应该保持不变,因为我可以直接在网页上打印:“client.println(stat[0]);”。所有这些都封装在一个创建客户端连接的方法中。所以我稍后会尝试你的第一个想法,谢谢你的提示!我假设刷新站点会导致Arduion代码重新生成JavaScript代码,在这种情况下,将注册对stat[0]
的更改。如果不是这样,我会更新答案。谢谢编译器抱怨PRIu8之前缺少括号。“错误:在'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("}");
if (stat[0] == 1) {
client.println("// JavaScript code to execute if stat[0] == 1");
}