Arduino String concatenation Serial.println() 不起作用



我试图通过首先将整个文本发送到找到其长度并在 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);
    }
    

最新更新