动态写一个char,包括一个变量int Arduino

时间:2016-06-29 06:56:58

标签: arrays arduino

如何编写一个未知长度的char [],包括一个变量整数(整数的长度是可变的),如下所示:

char data[] = "{""LDRValue"":" + LDRReading + "}";

LDRReading是唯一的变量。

这是代码:

int LDRReading = analogRead(LDR);
int d = LDRReading;
int b = d - c;
if (b > 50 || b < -50) {
  c = d;
//    String data = "{""LDRValue"": ";
//    data = data + LDRReading;
//    data = data + "}";
  char data[] = "{\"LDRValue\": 300}";
  Serial.println("\nStarting connection to LDR server...");
  if (client.connect(server, 8060)) {
    Serial.println("connected to LDR post server");
    client.println("POST /api/sensor HTTP/1.1");
    client.println("Host: 192.168.2.123");
    client.println("Content-Type: application/json");
    client.print("Content-Length: ");
    client.println(strlen(data));
    client.println();
    client.print("{\"LDRValue\":");
    client.print(LDRReading);
    client.print("}");
    delay(300);
   }
  Serial.println(d);
  client.stop();

2 个答案:

答案 0 :(得分:2)

EthernetClient,它是您正在使用的对象类,是Client的子类,它是Stream的子类,它是{{1}的子类因此,通过客户端实例打印 String 对象,因为Print具有以下方法:

Print

因此,这应该有效:

size_t print(const String &);
size_t print(const char[]);
size_t println(const String &s);
size_t println(const char[]);

请注意我在代码中添加的注释:我认为您应该使用int LDRReading = analogRead(LDR); int d = LDRReading; int b = d - c; if (b > 50 || b < -50) { c = d; String data = "{\"LDRValue\": "; // FIXED: escaped " symbols data = data + LDRReading; data = data + "}"; Serial.println("\nStarting connection to LDR server..."); if (client.connect(server, 8060)) { Serial.println("connected to LDR post server"); client.println("POST /api/sensor HTTP/1.1"); client.println("Host: 192.168.2.123"); client.println("Content-Type: application/json"); client.print("Content-Length: "); client.println(data.length()); client.println(); client.print(data); // FIXME: why don't you use println() here? client.flush(); // NOTE: this is strongly advised to push all // data in a stream out if you don't add // a line feed. delay(300); } Serial.println(d); client.stop(); } 或之后调用println()以确保您在流上打印的数据被有效推出。我写了client.flush()只是为了不改变你的原始代码。

如果由于某些特定原因,您认为将数据打印为字符串存在特定问题,那么您始终可以获取其 char [] 等效项在其上调用client.print()

data.c_str();

答案 1 :(得分:-2)

为什么不使用std :: string?

std::string s("{""LDRValue"":" + LDRReading + "}");
const char* szData = s.c_str();

如果您因任何原因无法使用std :: string,您可以先使用 strlen 确定内容的长度,然后通过调用 new