Lixo de memória no SerialMonitor

Bom dia, boa tarde, boa noite povo e pova…

Estou montando um código na IDE do Arduino para fazer o controle de um quadricóptero, este código irá se comunicar com um programa em C#. A ideia é gerar uma saída alfanumérica: A000B000C000D000 até A255B255C255D255.

Ao testar o código abaixo me aparece em tela (ACHO que é) lixo de memória.

/*
Código criado por: Guilherme Stanke Scandelari
2015/01

Projeto Quad SS01
*/

const int potMA = A0;
const int potMB = A1;
const int potMC = A2;
const int potMD = A3;

int valMA;
int valMB;
int valMC;
int valMD;

String A[3], B[3], C[3], D[3];

void setup()
{
valMA = valMB = valMC = valMD = 0;
Serial.begin(115200);
Serial.println("--------------------------------------");
Serial.println("-- Iniciando Quad SS01 --");
Serial.println("--------------------------------------");
//delay(10000);
Serial.println("-- Sistema inicializado com sucesso --");
Serial.println("--------------------------------------");
Serial.flush();
}

void leitura_pot()
{
valMA = analogRead(potMA) / 4,0156;
valMB = analogRead(potMB) / 4,0156;
valMC = analogRead(potMC) / 4,0156;
valMD = analogRead(potMD) / 4,0156;
codA(valMA);
codB(valMB);
codC(valMC);
codD(valMD);
delay(2);
}

void codA(int MA)
{
if(MA <= 9)
{
A[0] = “0”;
A[1] = “0”;
A[2] = String(MA);
}
else if (MA > 9 && MA <= 99)
{
String axMA = {
String(MA) };
A[0] = “0”;
A[1] = axMA[0];
A[2] = axMA[1];
}
else if (MA > 99 && MA <= 255)
{
String axMA = {
String(MA) };
A[0] = axMA[0];
A[1] = axMA[1];
A[2] = axMA[2];
}
}

void codB(int MB)
{
if(MB <= 9)
{
B[0] = “0”;
B[1] = “0”;
B[2] = String(MB);
}
else if (MB > 9 && MB <= 99)
{
String axMB = {
String(MB) };
B[0] = “0”;
B[1] = axMB[0];
B[2] = axMB[1];
}
else if (MB > 99 && MB <= 255)
{
String axMB = {
String(MB) };
B[0] = axMB[0];
B[1] = axMB[1];
B[2] = axMB[2];
}

}

void codC(int MC)
{
if(MC <= 9)
{
C[0] = “0”;
C[1] = “0”;
C[2] = String(MC);
}
else if (MC > 9 && MC <= 99)
{
String axMC = {
String(MC) };
C[0] = “0”;
C[1] = axMC[0];
C[2] = axMC[1];
}
else if (MC > 99 && MC <= 255)
{
String axMC = {
String(MC) };
C[0] = axMC[0];
C[1] = axMC[1];
C[2] = axMC[2];
}
}

void codD(int MD)
{
if(MD <= 9)
{
D[0] = “0”;
D[1] = “0”;
D[2] = String(MD);
}
else if (MD > 9 && MD <= 99)
{
String axMD = {
String(MD) };
D[0] = “0”;
D[1] = axMD[0];
D[2] = axMD[1];
}
else if (MD > 99 && MD <= 255)
{
String axMD = {
String(MD) };
D[0] = axMD[0];
D[1] = axMD[1];
D[2] = axMD[2];
}

}

void loop()
{

leitura_pot();
delay(10);
for(int letra = 0; letra < 4; letra++)
{
if(letra == 0 ){
Serial.print(“A”);
for(int index = 0; index <3; index++){
Serial.print(A[index]);
}
}
else if(letra == 1 ){
Serial.print(“B”);
for(int index = 0; index <3; index++){
Serial.print(B[index]);
}
}
else if(letra == 2 ){
Serial.print(“C”);
for(int index = 0; index <3; index++){
Serial.print(C[index]);
}
}
else if(letra == 3 ){

Serial.print(“D”);
for(int index = 0; index <3; index++){
Serial.print(D[index]);
}
}

}
Serial.println();
delay(10);

}

Bem… se algum puder me dar uma dica do que pode ser ou o que fazer neste caso, ficarei grato.

Atenciosamente,
Guilherme S. Scandelari

Eu tenho isso no monitor.

--------------------------------------
--       Iniciando Quad SS01        --
--------------------------------------
-- Sistema inicializado com sucesso --
--------------------------------------
A004B255C000D255
A004B255C000D255
A004B255C000D255
A004B255C000D255
A004B255C000D255
A004B255C000D255
A004B255C000D255
A004B255C000D255
A004B255C000D255
A004B255C000D255
A004B255C000D255
A004B255C000D255
A004B255C000D255
A004B255C000D255
A004B255C000D255
A004B255C000D255
A004B255C000D255
A004B255C000D255
A004B255C000D255
A004B255C000D255
A004B255C000D255
A004B255C000D255
A004B255C000D255
A004B255C000D255
A004B255C000D255
A004B255C000D255
A004B255C000D255

Você configurou o BAUD para 115200 como no setup?

O que aparece exactamente na tela? Pode colar um "print"? Penso que é mais simples de avaliar o problema se se souber exactamente o que está a acontecer.

Oh rapaziada, obrigado pelo retorno.

Não sei o que houve, após verificar pelo Serial Monitor em outra máquina o problema não ocorreu mais.

O Baudrate estava correto sim Fernando.

A minha resposta pelo Serial Monitor ficou como esperado.

Obrigado FernandoGarcia e lusilva.

Atenciosamente,
Guilherme S. Scandelari


Bom galera,

dei um upgrade no código e acredito sanar alguns problemas bobos como o lixo de memória.

criei uma outra array String de tamanho 17, sendo o index 0,4,8,12 - Letras, index 1,2,3,5,6,7,9,10,11,13,14,15 para números respectivos do valor lido nas portas A0, A1, A2 e A3 e, index 16 para o caracter “\0” que finalizará meu array dizendo que este index é o ponto final da leitura, evitando assim que se acumule lixo de memória.

Segue código e aproveitem a ideia. Logo mais postarei o código que será o responsável por receber este array e tratar a informação.

/*
Código criado por: Guilherme Stanke Scandelari
2015/01

Projeto Quad SS01
*/

const int potMA = A0;
const int potMB = A1;
const int potMC = A2;
const int potMD = A3;

int valMA, valMB, valMC, valMD;

String A[3], B[3], C[3], D[3], cmdOut[17];

void setup()
{
valMA = valMB = valMC = valMD = 0;
for(int l = 0; l < 17; l++)
cmdOut[l] = “\0”;
Serial.begin(115200);
Serial.println("--------------------------------------");
Serial.println("-- Iniciando Quad SS01 --");
Serial.println("--------------------------------------");
//delay(10000);
Serial.println("-- Sistema inicializado com sucesso --");
Serial.println("--------------------------------------");
Serial.flush();
}

void leitura_pot()
{
valMA = analogRead(potMA) / 4,0156;
valMB = analogRead(potMB) / 4,0156;
valMC = analogRead(potMC) / 4,0156;
valMD = analogRead(potMD) / 4,0156;
codA(valMA);
codB(valMB);
codC(valMC);
codD(valMD);
delay(2);
}

void codA(int MA)
{
if(MA <= 9)
{
A[0] = “0”;
A[1] = “0”;
A[2] = String(MA);

}
else if (MA > 9 && MA <= 99)
{
String axMA = {
String(MA) };
A[0] = “0”;
A[1] = axMA[0];
A[2] = axMA[1];
}
else if (MA > 99 && MA <= 255)
{
String axMA = {
String(MA) };
A[0] = axMA[0];
A[1] = axMA[1];
A[2] = axMA[2];
}

cmdOut[0] = “A”;
cmdOut[1] = A[0];
cmdOut[2] = A[1];
cmdOut[3] = A[2];

}

void codB(int MB)
{
if(MB <= 9)
{
B[0] = “0”;
B[1] = “0”;
B[2] = String(MB);
}
else if (MB > 9 && MB <= 99)
{
String axMB = {
String(MB) };
B[0] = “0”;
B[1] = axMB[0];
B[2] = axMB[1];
}
else if (MB > 99 && MB <= 255)
{
String axMB = {
String(MB) };
B[0] = axMB[0];
B[1] = axMB[1];
B[2] = axMB[2];
}
cmdOut[4] = “B”;
cmdOut[5] = B[0];
cmdOut[6] = B[1];
cmdOut[7] = B[2];

}

void codC(int MC)
{
if(MC <= 9)
{
C[0] = “0”;
C[1] = “0”;
C[2] = String(MC);
}
else if (MC > 9 && MC <= 99)
{
String axMC = {
String(MC) };
C[0] = “0”;
C[1] = axMC[0];
C[2] = axMC[1];
}
else if (MC > 99 && MC <= 255)
{
String axMC = {
String(MC) };
C[0] = axMC[0];
C[1] = axMC[1];
C[2] = axMC[2];
}
cmdOut[8] = “C”;
cmdOut[9] = C[0];
cmdOut[10] = C[1];
cmdOut[11] = C[2];

}

void codD(int MD)
{
if(MD <= 9)
{
D[0] = “0”;
D[1] = “0”;
D[2] = String(MD);
}
else if (MD > 9 && MD <= 99)
{
String axMD = {
String(MD) };
D[0] = “0”;
D[1] = axMD[0];
D[2] = axMD[1];
}
else if (MD > 99 && MD <= 255)
{
String axMD = {
String(MD) };
D[0] = axMD[0];
D[1] = axMD[1];
D[2] = axMD[2];
}
cmdOut[12] = “D”;
cmdOut[13] = D[0];
cmdOut[14] = D[1];
cmdOut[15] = D[2];
cmdOut[16] = “\0”;
}

void loop()
{
leitura_pot();
delay(5);
for(int index = 0; index < 17; index++)
Serial.print(cmdOut[index]);
Serial.println();
delay(5);

}

Atenciosamente,
Guilherme S. Scandelari.

Acho que há aí uma grande confusão entre "string" e "String", não?

luisilva:
Acho que há aí uma grande confusão entre "string" e "String", não?

Ou array de Strings... LOL

:sweat_smile: desculpe… acho que devo ter me expressado errado ou meu pouco conhecimento me caracteriza como um novato…

rsrs

:smiley: :smiley: :smiley:

Para que serve a variável 'A':

String A[3], B[3], C[3], D[3], cmdOut[17];

para armazenar 3 strings, ou para armazenar uma string de 3 caracteres?

Bem... eu havia tentado usar um char X... mas quando tento usar ele no código para fazer as comparações o sistema dizia dar erro. Não é uma especificação do meu escopo nem nada... e também acredito não comer memória do meu Arduino.

Esse código está sendo usado já e está funcionando como deveria.

Grato pela ajuda!

As comparacoes com char A, sao feitas com uma funcao chamada strcmp, ou strncmp...