2016-06-20 37 views
0

我想首先发送整个文本到认定其长度和使用AT + CIPSEND = 长度的函数读取一些文本服务器的通数据来这里稍后打开TCP端口。在我的响应数据中添加一些额外的信息之前,一切正常。 我怀疑的字符限制,但无法找到一个理由,即使调试几个小时。Arduino的字符串连接Serial.println()不工作

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 

在此先感谢。

+0

Arduino是不是C!而你的代码并不适合这么小的设备。将桌面编程技术应用于像Arduino这样的裸机嵌入式设备是一个不错的主意。 – Olaf

+0

你有什么建议?或者请链接一些参考。 – eden

+0

这是没有辅导网站。但是,你为什么不直接发送文本? – Olaf

回答

1

这个答案并不真正解决您的问题。 为了我的借口,我没有Arduino的和我在一起,所以我无法重现您的问题。 :)

不过,既然你都成“字符串连接”的风格,我想你可能使用这里发布的源代码中获益(前提是你的项目有空间的话)

这是一个小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打印。您可以将该库与任何实现打印界面的对象挂钩,例如串行软件序列

与您现在正在做的不同之处在于,通过使用“< <”,您将获得与“+”相同的干净的代码样式,但不需要创建临时String。所有东西都会立即下达到输出缓冲区以打印出来。因此,您不应该遇到与您现在正在经历的相同问题。换句话说,这就是@Olaf在评论中提出的建议,但以一种奇特的方式。 ;)

注意:你可能需要修复包括在测试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); 
    } 
    
+1

谢谢你的回答。然而,我发现了一个更简单的解决方案,每当我使用Serial.println时,函数内部的字符串将填充一部分内存。我使用了一个外部库F()来解决我的问题。 – eden

+1

@EnieJakiro你应该发表你的评论作为答案,因为评论可能最终被删除。如果它仍然适用于您,您也应该接受它。 :) –

+0

你的解决方案也适用于我,它更有说服力。干杯:) – eden