Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/arduino/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 将字符缓冲区转换为字符串_C++_Arduino - Fatal编程技术网

C++ 将字符缓冲区转换为字符串

C++ 将字符缓冲区转换为字符串,c++,arduino,C++,Arduino,我需要将字符缓冲区数组转换为字符串 我的代码: #include "ESP8266.h" #define CH_PD 44 #define RST 46 #define GPIO0 48 //Coloque nos campos indicados o nome e senha da sua rede WiFi #define SSID "XXXXXXXX" #define PASSWORD "XXXXXXXX" //Cria objeto de conexão wif

我需要将字符缓冲区数组转换为字符串

我的代码:

#include "ESP8266.h"

#define CH_PD 44
#define RST 46
#define GPIO0 48

//Coloque nos campos indicados o nome e senha da sua rede WiFi
#define SSID        "XXXXXXXX"
#define PASSWORD    "XXXXXXXX"

//Cria objeto de conexão wifi com o módulo, usando a Serial1 do Mega.
ESP8266 wifi(Serial1);

void setup(void)
{
    pinMode(CH_PD,OUTPUT);
    pinMode(RST,OUTPUT);
    pinMode(GPIO0,OUTPUT);
    digitalWrite(CH_PD,HIGH); //setado em ALTO - operacao normal
    digitalWrite(RST,HIGH); //setado em ALTO - operhttps://www.embarcados.com.br/arduino-mega-2560/acao normal
    digitalWrite(GPIO0,HIGH); //setado em ALTO - operacao normal

    Serial1.begin(115200);
    Serial.begin(9600);
    Serial.println("Iniciando Setup.");

    Serial.print("Versao de Firmware ESP8266: ");
    //A funcao wifi.getVersion() retorna a versao de firmware informada pelo modulo no inicio da comunicacao
    Serial.println(wifi.getVersion().c_str());

    //Vamos setar o modulo para operar em modo Station (conecta em WiFi) e modo AP (é um ponto de WiFi tambem)
    if (wifi.setOprToStationSoftAP()) {
        Serial.println("Station e AP OK.");
    } else {
        Serial.println("Erro em setar Station e AP.");
    }

    //Agora vamos conectar no ponto de WiFi informado no inicio do codigo, e ver se corre tudo certo
    if (wifi.joinAP(SSID, PASSWORD)) {
        Serial.println("Conectado com Sucesso.");
        Serial.println("IP: ");
        //rotina wifi.getLocalIP() retorna o IP usado na conexao com AP conectada.
        Serial.println(wifi.getLocalIP().c_str());    
    } else {
        Serial.println("Falha na conexao AP.");
    }

    //Agora vamos habiliar a funcionalidade MUX, que permite a realizacao de varias conexoes TCP/UDP
    if (wifi.enableMUX()) {
        Serial.println("Multiplas conexoes OK.");
    } else {
        Serial.println("Erro ao setar multiplas conexoes.");
    }

    //Inicia servidor TCP na porta 8080 (veja depois a funcao "startServer(numero_porta)", que serve para UDP!
    if (wifi.startTCPServer(8080)) {
        Serial.println("Servidor iniciado com sucesso.");
    } else {
        Serial.println("Erro ao iniciar servidor.");
    }    
    Serial.println("Setup finalizado!");
}

//Na conexao TCP, basicamente a funcionalidade a ser mostrada sera a de "echo", ou seja, a aplicacao ira retornar todos os //dados enviados para ela via socket TCP.
void loop(void)
{
    //Variavel para buffer de dados de trasmissao
    uint8_t buffer[128] = {0};

    //Como usamos multiplas conexoes, cada conexao tem sua ID, e precisa ser armazenada para referencia no programa. Usamos    //essa variavel para isso.
    uint8_t mux_id;

    //E esta variavel len serve para armazenar o comprimento de dados recebidos por meio da rotina wifi.recv(), que tambem     //associa ao buffer os dados recebidos e ao mux_id a id responsavel pela transmissao
    uint32_t len = wifi.recv(&mux_id, buffer, sizeof(buffer), 100);
    if (len > 0) {
        Serial.print("Status:[");
        Serial.print(wifi.getIPStatus().c_str());
        Serial.println("]");

        Serial.print("Recebido de :");
        Serial.print(mux_id);
        Serial.print("[");
        for(uint32_t i = 0; i < len; i++) {
            Serial.print((char)buffer[i]);
        }
        Serial.print("]\r\n");

        //Agora envia de volta. A referencia para o socket TCP criado é o mux_id, ou id da conexao, usado aqui na rotina
        //wifi.send, veja abaixo:
        if(wifi.send(mux_id, buffer, len)) {
            Serial.print("Enviado de volta...\r\n");
        } else {
            Serial.print("Erro ao enviar de volta\r\n");
        }

        //E, como sempre, liberar a conexao TCP, de modo a permitir que novas conexoes sejam realizadas.
        if (wifi.releaseTCP(mux_id)) {
            Serial.print("Liberando conexao TCP com ID: ");
            Serial.print(mux_id);
            Serial.println(" OK");
        } else {
            Serial.print("Erro ao liberar TCP com ID: ");
            Serial.print(mux_id);
        }

        Serial.print("Status:[");
        Serial.print(wifi.getIPStatus().c_str());
        Serial.println("]");
    }
}
(char)缓冲区[i]
结果:

0[GET/peso:200/ativar:1/tempo:15000/HTTP/1.1


如何将
(char)buffer[I]
转换为字符串?

似乎Arduino没有附带
std::string
。您可以将其复制到分配的字符数组中,如下所示:

uint8_t buffer[128] = {0};

uint8_t mux_id;

uint32_t len = wifi.recv(&mux_id, buffer, sizeof(buffer), 100);
if (len > 0) {

    char* s = new char[len + 1]; // one extra space for the null terminator
    strncpy(s, (char*)buffer, len);
    s[len] = '\0'; // Don't forget to terminate the string with null

    // use s here


    delete[] s; // Don't forget to delete[] it after
}

buffer[i]
是一个单字节。您是在尝试将字节转换为字符串,还是在尝试将所有
缓冲区
转换为字符串?您打算用它做什么?
std::stringstream
可能是一个更有用的工具/容器。我正在尝试将整个缓冲区转换为字符串@FrançoisAndrieuxI需要分离f的值rom
0[GET/weight:200/enable:1/time:15000/HTTP/1.1]
example:weight:200@user4581301i它是以null结尾的数据吗?当我编译时,它显示以下错误:
Wifi Teste:85:error:'string'不是'std'std::string s{(char*)buffer,len}
@IgorLessa您是否
#包括
?当我包括Arduino IDE的库时,我正在使用它error@IgorLessa看起来Arduino没有
std::string
,您可以分配
char
数组。我编辑了答案。
uint8_t buffer[128] = {0};

uint8_t mux_id;

uint32_t len = wifi.recv(&mux_id, buffer, sizeof(buffer), 100);
if (len > 0) {

    char* s = new char[len + 1]; // one extra space for the null terminator
    strncpy(s, (char*)buffer, len);
    s[len] = '\0'; // Don't forget to terminate the string with null

    // use s here


    delete[] s; // Don't forget to delete[] it after
}