2017-05-25 100 views
-1

我需要將char緩衝區數組轉換爲字符串。將char緩衝區轉換爲字符串

我的代碼:

#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)buffer[i]轉換爲一個字符串:

for(uint32_t i = 0; i < len; i++) { 
       Serial.print((char)buffer[i]); 
      } 

(char)buffer[i]結果:

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

如何轉換(char) buffer [i]字符串?

+0

'buffer [i]'是一個單字節。你是否試圖將字節轉換爲字符串,還是試圖將所有'buffer'轉換爲字符串? –

+0

你打算用它做什麼? 'std :: stringstream'可能是一個更有用的工具/容器。 – user4581301

+0

我試圖將整個緩衝區轉換爲字符串@FrançoisAndrieux –

回答

2

看來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 
} 
+0

編譯時顯示如下錯誤:'Wifi-Teste:85:error:'string'不是'std'的成員 std :: string s {(char *)buffer,len};' –

+0

@ IgorLessa你有沒有'#include '? – Galik

+0

請參見['std :: string'構造函數4](http://en.cppreference.com/w/cpp/string/basic_string/basic_string) –