我试图通过首先将整个文本发送到找到其长度并在 cipsend = 长度的函数中读取某些文本的数据传递到服务器。em>以后打开一个TCP端口。在我在响应数据中添加一些其他信息之前,一切都很好。我怀疑炭极限,但是即使调试了几个小时,也找不到原因。
serial.println()没有显示任何输出,并且字符串串联似乎并不健康。问题是文本没有通过,因此Cipsend不起作用。相应的代码部分及其输出如下所示。
void sendHTTPResponse(int connectionId, String content) {
Serial.println("SENDHTTPRESPONSE1: " + content);
// build HTTP response
String httpResponse;
String httpHeader;
// HTTP Header
httpHeader = "HTTP/1.1 200 OKrnContent-Type: text/html; charset=UTF-8rn";
httpHeader += "Content-Length: ";
httpHeader += content.length();
httpHeader += "rn";
httpHeader += "Connection: closernrn";
Serial.println("SENDHTTPRESPONSE2: " + httpHeader);
httpResponse = httpHeader + content + " "; // There is a bug in this code: the last character of "content" is not sent, I cheated by adding this extra space
Serial.println("HTTPRESPONSE3: " + httpResponse);
sendCIPData(connectionId, httpResponse);
}
和串行监视器输出。httpresponse3似乎是空的?
SENDHTTPRESPONSE1: {"data":[{"id":"100"}]}{"data":[{"id":"100"}]}{"data":[{"id":"100"}]}{"data":[{"id":"100"}]}
SENDHTTPRESPONSE2: HTTP/1.1 200 OK
Content-Type: text/html; charset=UTF-8
Content-Length: 92
Connection: close
DATA LENGTH:
======================================================
Executing command: AT+CIPSEND=0,0
HTTP/1.1
CoAT+CIPSEND=0,0
预先感谢。
这个答案实际上无法解决您的问题。以我的借口,我没有 arduino ,所以我无法再现您的问题。:)
但是,由于您喜欢"字符串串联" 样式,我认为您可能会从这里使用此处发布的源代码受益(前提是您的项目有空间)
这是我两年前写的 print 库的小型 c - 样式包装。它会让您写这样的东西:
io::cout << "This is a beautiful message!n"
<< io::setprecision(3) << some_float << "n"
<< io::setbase(BIN) << some_int << io::endl;
默认情况下,库提供了通过通常的Serial
打印的io::cout
。您可以使用实现打印接口的任何对象将此库挂钩,例如。序列和软件序列。
与您现在所做的事情的区别在于使用"&lt;&lt;"您将获得与" "相同的干净代码风格,但是您不需要创建临时字符串。一切都立即放在输出缓冲区以打印出来。结果,您不应该在现在遇到的同一问题中遇到。换句话说,这可以做@olaf在评论中的建议,但以一种奇特的方式。;)
注意:您可能需要修复 test-iocout.ino 文件中的包含的内容。
cout.h
#ifndef __COUT_H__ #define __COUT_H__ #include <Arduino.h> namespace io { /** * marker to end a message * (prints newline) */ struct Endl {}; const Endl endl = Endl(); /** * marker to modify way in which numbers are * printed on output stream */ struct setbase { uint8_t base; setbase(uint8_t v = DEC): base(v) {} }; /** * marker to modify number of digits of doubles * printed on output stream */ struct setprecision { uint8_t precision; setprecision(uint8_t v = 2): precision(v) {} }; /** * class out * * Provides a C++-like interface for printing stuff on * an output Stream, e.g. Serial, SoftwareSerial objects * Assumes a separated Stream initialization handling */ class out { public: out(Print& print = Serial, uint8_t fmt = DEC, uint8_t dgt = 2); out(const out& other); out& operator =(const out& other); virtual ~out(); inline out& operator<<(const String& msg) { __print.print(msg); return *this; }; inline out& operator<<(const char msg[]) { __print.print(msg); return *this; }; inline out& operator<<(char c) { __print.print(c); return *this; }; inline out& operator<<(unsigned char uc) { __print.print(uc, __base); return *this; }; inline out& operator<<(int n) { __print.print(n, __base); return *this; }; inline out& operator<<(unsigned int un) { __print.print(un, __base); return *this; }; inline out& operator<<(long l) { __print.print(l, __base); return *this; }; inline out& operator<<(unsigned long ul) { __print.print(ul, __base); return *this; }; inline out& operator<<(double d) { __print.print(d, __precision); return *this; }; inline out& operator<<(const __FlashStringHelper *fsh) { __print.print(fsh); return *this; }; inline out& operator<<(const Printable& pr) { __print.print(pr); return *this; }; inline out& operator<<(const Endl& el) { __print.println(""); __base = DEC; __precision = 2; return *this; }; inline out& operator<<(const setbase& p) { __base = p.base; return *this; }; inline out& operator<<(const setprecision& p) { __precision = p.precision; return *this; }; inline int getWriteError() { return __print.getWriteError(); }; inline void clearWriteError() { __print.clearWriteError(); }; private: Print& __print; ///< output stream, must be separately initalized uint8_t __base; ///< base with which print numerical data uint8_t __precision; ///< number of fractional digits of float/double values }; /** * Global io::cout object */ extern out cout; } /* namespace io */ #endif
cout.cpp
#include "cout.h" namespace io { out cout; out::out(Print& print, uint8_t fmt, uint8_t dgt): __print(print), __base(fmt), __precision(dgt) { // nothing to do }; out::out(const out& other): __print(other.__print), __base(other.__base), __precision(other.__precision) { // nothing to do }; out& out::operator =(const out& other) { if (this != &other) { __print = other.__print; __base = other.__base; __precision = other.__precision; } return *this; }; out::~out() { // nothing to do }; } /* namespace io */
test-iocout.ino
#include <Arduino.h> #include "src/cout.h" /******************************************************************************/ /*** PINS & GLOBALS ***/ /******************************************************************************/ const uint32_t SERIAL_BAUDRATE = 4800; /******************************************************************************/ /*** RESOURCES ***/ /******************************************************************************/ /******************************************************************************/ /*** MAIN ***/ /******************************************************************************/ /** * setup: * sets up the resources used within the arduino */ void setup() { /* Initialize serial */ Serial.begin(SERIAL_BAUDRATE); while (!Serial) { /* Needed by Arduino Leonardo */ } /* new c++-like access to serial! */ io::cout << "##### Arduino Station #####nn" << "- io::cout test 1.0" << io::endl; } /** * loop: * */ void loop() { /* compute deltaTime */ uint32_t curr_time = millis(); static uint32_t start_time = curr_time; // note: initialized once! uint32_t deltaTime = curr_time - start_time; start_time = curr_time; io::cout << "n> Last loop duration was: "; io::cout << io::setprecision(3) << deltaTime/1000.0f << " s." << io::endl; io::cout << "> 1025 in binary is: " << io::setbase(BIN) << 1025 << io::endl; delay(10000); }