Arduino char* 数组[] : "vanishing" 个字符
Arduino char* array[] : "vanishing" characters
我使用char*数组[]来存储串行打印数据。
然而,数据正在从数组中"消失"。
当我多次打印同一个var时,问题似乎就出现了。
串行输出:
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.
Arduino草图:
#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, "%dn", value);
}
else {
sprintf(convertedValue, "%d", value);
}
return convertedValue;
}
让我们展开这一行以提高可读性。
_historique[_compteur] = (char*)malloc(sizeof(strlen(nouveau) + 1));
_historique[_compteur] = (char*)malloc( sizeof( strlen(nouveau) + 1 ) );
这里你取的是sizeof( strlen(nouveau) + 1 )
,它等于sizeof(int)
!
这行应该是:
_historique[_compteur] = (char*)malloc( (strlen(nouveau) + 1) * sizeof(char) );
我希望它是可读的!
相关文章:
- C++字符*缓冲区的大小
- HEX值到wchar_t字符(UTF-8)的转换
- 为什么 Serial.println(<char[]>);返回随机字符?
- 我的字符计数代码计算错误.为什么
- 字符串-C++后显示的随机字符
- 将Integer转换为4字节的unsined字符矢量(按大端字节顺序)
- 如何在C++中从字符串中分割字符
- 为什么msgrcv()将垃圾字符馈送到缓冲区
- 指向指向字符数组的指针数组的指针
- 如何用转义符替换字符串中的所有特殊字符
- 为什么 sscanf 无法从一个字符串中读取uint64_t和字符?
- 比较字符数组
- 将字符指针十六进制转换为字符串并保存在文本文件C++中
- 从矢量<无符号字符>转换为字符* 包括垃圾数据
- 如何使用Crypto++并为RSA返回可打印的字节/字符数组
- 如何在C++中确定文本文件中的元素是字符还是数字
- 如何将一个ostringstream十六进制字符串字符对转换为单个unit8t等价的二进制值
- 为字符串中每 N 个字符插入空格的函数没有按照我认为的方式工作?
- C++中无符号字符溢出
- Arduino char* 数组[] : "vanishing" 个字符