2016-04-10 16 views
1

Seri yazdırılmış verileri saklamak için char * array [] kullanıyorum. Bununla birlikte, veriler diziden "kayboluyor".Arduino char * dizi []: "ufuk" karakterleri

Aynı verinin birkaç kez yazdırılması durumunda sorun oluşuyor gibi görünüyor.

Seri çıkışı:

Hello world ! 
Lorem ipsum dolor sit amet, consectetur adipiscing elit. 
0 - Archivage de : Lorem ipsum dolor sit amet, consectetur adipiscing elit. 
Affichage de l'historique : 
0Lorem ipsum dolor sit amet, consectetur adipiscing elit. 
Lorem ipsum dolor sit amet, consectetur adipiscing elit. 
1 - Archivage de : Lorem ipsum dolor sit amet, consectetur adipiscing elit. 
Affichage de l'historique : 
0Lorem ip 
1Lorem ipsum dolor sit amet, consectetur adipiscing elit. 
Lorem ipsum dolor sit amet, consectetur adipiscing elit. 
2 - Archivage de : Lorem ipsum dolor sit amet, consectetur adipiscing elit. 
Affichage de l'historique : 
0Lorem ip 
1Lore 
2Lorem ipsum dolor sit amet, consectetur adipiscing elit. 
Affichage de l'historique : 
0Lorem ip 
1Lore 
2Lorem ipsum dolor sit amet, consectetur adipiscing elit. 

çaba isteyen kroki:

#include <SPI.h> 
#include <Ethernet.h> 

#include <shutterSerial.h> 

ShutterSerial s = ShutterSerial(); 

void setup() { 

    s.begin(115200); 
    s.setVerboseLevel(DEBUG); 
    String test("Lorem ipsum dolor sit amet, consectetur adipiscing elit."); 
    s.print("Hello world !", INFO, true); 
    s.print(test, INFO, true); 
    s.print(test, INFO, true); 
    s.print(test, INFO, true); 


    s.historique_print(); 

} 


void loop() { 
} 

shutterSerial.h

#ifndef shutterSerial 
#define shutterSerial 

#include <SPI.h> 

#define HISTORYSIZE 20 

enum Level { 
    ERROR, 
    INFO, 
    STACK, 
    DEBUG, 
    }; 

class ShutterSerial { 

    public: 

    /*Constructeur*/ 
    ShutterSerial(); 
    static void begin(unsigned int baudRate); 

    static void setVerboseLevel(unsigned int level); 
    static unsigned int getVerboseLevel(); 

    static void print(String msg, int level, bool crlf); 
    static void print(int msg, int level, bool crlf); 
    static void print(char* msg, int level, bool crlf); 

    static void historique_reset(); 
    /*Historique des messages séries. On ne conserve que les messages d'INFO et d'ERROR*/ 
    static char* _historique[HISTORYSIZE]; 
    static void historique_put(char* nouveau); 
    static void historique_print(); 
    static unsigned int _compteur; 

    static char* intToCharArray(int value, bool crlf); 

    private: 
    static Level _verbosite; 

}; 
#endif 

shutterSerial.cpp

#include "shutterSerial.h" 

ShutterSerial::ShutterSerial() {} 

/*Initialisation du niveau de verbosité à INFO*/ 
Level ShutterSerial::_verbosite = INFO; 

char* ShutterSerial::_historique[HISTORYSIZE]; 
unsigned int ShutterSerial::_compteur = 0; 
static char temp[128]; 


void ShutterSerial::begin(unsigned int baudRate) { 
    Serial.begin(baudRate); 
    /*Ces deux lignes permettent d'éviter de perdre le premier caractère affiché 
    L'arduino à tendance à ne pas afficher le premier caractère. 
    */ 
    while(!Serial); 
    Serial.println(""); 
} 

unsigned int ShutterSerial::getVerboseLevel() { 
    return (unsigned int)_verbosite; 
} 

void ShutterSerial::setVerboseLevel(unsigned int level) { 
    _verbosite = (Level) level; 
} 

void ShutterSerial::print(String msg, int level, bool crlf) { 
    if(level <= _verbosite) { 
    if (crlf) { 
     Serial.println(msg); 
     if(level <= INFO) { 
     msg += "\n"; 
     msg.toCharArray(temp, msg.length()); 
     historique_put(temp); 
     } 
    } 
    else { 
     Serial.print(msg); 
     if(level <= INFO) { 
     msg.toCharArray(temp, msg.length()); 
     historique_put(temp); 
     } 
    } 
    } 
} 
void ShutterSerial::print(int msg, int level, bool crlf) { 
    if(level <= _verbosite) { 
    if (crlf) { 
     Serial.println(msg); 
     if(level <= INFO) { 
     // historique_put(ShutterSerial::intToCharArray(msg, true)); 
     } 
    } 
    else { 
     Serial.print(msg); 
     if(level <= INFO) { 
     // historique_put(ShutterSerial::intToCharArray(msg, false)); 
     } 
    } 
    } 
} 
void ShutterSerial::print(char* msg, int level, bool crlf) { 
    if(level <= _verbosite) { 
    if (crlf) { 
     Serial.println(msg); 
     if(level <= INFO) { 
     // strcat(msg, "\n"); 
     // historique_put(msg); 
     } 
    } 
    else { 
     Serial.print(msg); 
     if(level <= INFO) { 
     // historique_put(msg); 
     } 
    } 
    } 
} 


/*Manipulation de l'historique*/ 

void ShutterSerial::historique_reset() { 
    _compteur = 0; 
} 

void ShutterSerial::historique_put(char* nouveau) { 
    Serial.print(_compteur); 
    Serial.print(" - Archivage de : "); 
    Serial.println(nouveau); 
    _historique[_compteur] = (char*)malloc(sizeof(strlen(nouveau) + 1)); 
    memcpy(_historique[_compteur], nouveau, strlen(nouveau) + 1); 
    _compteur = _compteur + 1; 
    historique_print(); 

} 

void ShutterSerial::historique_print() { 
    int cpt = 0; 
    Serial.println("Affichage de l'historique : "); 

    if(_compteur > 0) { 
    for(cpt = 0; cpt < _compteur; cpt++) { 
     Serial.print(cpt); 
     Serial.println(_historique[cpt]); 
    } 
    } 
    else { 
    Serial.println("L'historique est vide."); 
    } 
} 

char* ShutterSerial::intToCharArray(int value, bool crlf) { 
    char* convertedValue = (char*)malloc(sizeof(char)); 
    if(crlf) { 
    sprintf(convertedValue, "%d\n", value); 
    } 
    else { 
    sprintf(convertedValue, "%d", value); 
    } 
    return convertedValue; 
} 
+0

Neden malloc ve yeni değil - veya daha iyisi, make_unique? – xaxxon

cevap

0

en fazla okunabilirlik için bu satırı genişletelim.

_historique[_compteur] = (char*)malloc(sizeof(strlen(nouveau) + 1)); 

_historique[_compteur] = (char*)malloc( sizeof(strlen(nouveau) + 1) ); 

Burada sizeof(int) eşittir sizeof(strlen(nouveau) + 1) alıyor!

Bu satır olmalıdır:

_historique[_compteur] = (char*)malloc((strlen(nouveau) + 1) * sizeof(char) ); 

Ben okunabilir umut!