Arduino字符串连接Serial.println()不起作用

时间:2016-06-20 01:34:41

标签: arduino serial-port at-command esp8266

我试图通过首先将整个文本发送到找到其长度的函数并使用AT + CIPSEND = length来到这里以稍后打开TCP端口来读取某些文本的传递数据到服务器上。在我向响应数据添加一些额外信息之前,一切正常。 我怀疑char限制,但即使调试了几个小时也找不到原因。

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 OK\r\nContent-Type: text/html; charset=UTF-8\r\n";
  httpHeader += "Content-Length: ";
  httpHeader += content.length();
  httpHeader += "\r\n";
  httpHeader += "Connection: close\r\n\r\n";
  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

提前致谢。

1 个答案:

答案 0 :(得分:1)

这个答案实际上并没有解决你的问题。 以我为借口,我没有 Arduino ,所以我无法重现你的问题。 :)

但是,由于您使用"字符串连接" 样式,我认为您可能会受益于使用此处发布的源代码(前提是您的项目有空间)它)

这是我两年前写的 print 库周围的一个小的 c ++ - 样式 包装。它会让你写这样的东西:

io::cout << "This is a beautiful message!\n"
         << io::setprecision(3) << some_float << "\n"
         << io::setbase(BIN) << some_int << io::endl;

默认情况下,库提供io::cout,通过常规Serial进行打印。您可以将此库与实现打印接口的任何对象挂钩,例如串行软件序列

与您现在所做的不同之处在于使用&#34;&lt;&lt;&#34;您将获得与&#34; +&#34;相同的干净代码风格,但您不需要创建临时String。一切都立即下放到输出缓冲区打印出来。因此,您不应该遇到与您现在遇到的问题相同的问题。换句话说,这确实是@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 */
    
  • 测试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 #####\n\n"
                << "- 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);
    }