c++ - arduino 网络客户端随机卡住

标签 c++ arduino webclient

我已经为 arduino 实现了一个 web 客户端,将数据从我的传感器发送到数据库并抛出一个 GET Http 请求。循环在 DEBUG 4

上随机卡住

这是代码的一部分,here是完整的草图链接。

有什么建议吗?

sprintf(pageAdd,"/write3.php?value0=%d&value1=%d&value2=%f&value3=%lu&value4=%f&value5=%f&value6=%f&value7=%f&value8=%f", value0, dht_humidity, temperature, pressure, altitude, gust, dir, rain, knots);

if(!getPage(server,serverPort,pageAdd)) Serial.print(F("Fail "));
else Serial.print(F("Pass "));



byte getPage(IPAddress ipBuf,int thisPort, char *page)
{
  int inChar;
  char outBuf[128];

  Serial.print(F("connecting..."));

  if(client.connect(ipBuf,thisPort))
  {

     Serial.println(F("connected"));
    sprintf(outBuf,"GET %s HTTP/1.1",page);
    Serial.println(F("DEBUG 1"));
    client.println(outBuf);
    Serial.println(F("DEBUG 2"));
    sprintf(outBuf,"Host: %s",serverName);
    Serial.println(F("DEBUG 3"));
    client.println(outBuf);
    Serial.println(F("DEBUG 4"));
    client.println(F("Connection: close\r\n"));

  } 
  else
  {
    Serial.println(F("failed"));
    return 0;
  }

最佳答案

sprintf 很危险。它将帮助您快速破解,但如果该破解发生变化,您可能会遇到难以调试的麻烦。相反,如果您写入本地缓冲区,请使用 snprintf(buffer, sizeof(buffer),..... 截断输出比破坏内存更好。

这可能是您的问题:因为 pageAdd 不是一个很大的缓冲区。

sprintf(pageAdd,"/write3.php?value0=%d&value1=%d&value2=%f&value3=%lu&value4=%f&value5=%f&value6=%f&value7=%f&value8=%f", value0, dht_humidity, 温度, 压力, 高度, 阵风, 方向, 雨, 结);

关于c++ - arduino 网络客户端随机卡住,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22055975/

相关文章:

c++ - 将屏幕输出重定向到文件可以更改 C++ 代码的结果吗?

c++ - Arduino 如何使用 ESP2668 创建 wifi 接入点?

azure - 访问麦克风读数以进行粗略的分贝测量

使用正确凭据的 C# WebClient HTTP 基本身份验证失败 401

java - Java 中是否有类似于 WebClient.DownloadString 的东西?

python - 如何终止在后端执行长时间运行的 C/C++ 代码的 python 解释器?

c++ - 如何使用 C++ 创建一个工具来解析 XML 文件

c++ - 如何在c中将文本文件转换为位图图像?

c - 在 Arduino 中读取多个字符串

c# - 如何使用 dotnet(nuget 包)httpclient 配置 TCP 连接数?