1

我正在 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) (...)

有任何想法吗?

4

2 回答 2

1

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

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

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

于 2012-05-08T08:32:11.637 回答
1

编译问题是由于对象printXxx()上可用的函数client不支持printf格式说明符。虽然不清楚它的类型client是什么,但它显然是内置 Arduino 类的子Print类。

要使用格式说明符,您必须分两步进行,例如(注意byteArduino 中的 a 实际上是 auint8_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缓冲区将溢出,破坏内存。

但是,由于(正如 unwind 指出的那样)JavaScript if 语句从浏览器的角度来看基本上是恒定的,因此在 Arduino 代码中执行此操作可能会更简单:

if (stat[0] == 1) {
    client.println("// JavaScript code to execute if stat[0] == 1");
}
于 2012-05-08T13:00:55.110 回答