recebo varios dados pela serial no seguinte formato: A323E23A324E23A321*E22...
onde *= line feed
preciso criar duas variaveis:
onde a primeira variavel pegue depois do A, até o line feed, ou seja só os numeros.
e a segunda variavel pegue depois do E até o line feed , ou seja só os numeros.
pensei em converter a variavel value em uma string
e criar uma substring:
resultado = value.substring(3,6)
e converter novamente para numerico, mas achei muito deselegante desta forma.
Alguem tem uma boa ideia?
ESTOU USANDO O SEGUINTE PROGRAMA:
byte serialIn = 0;
int value = 0;
Seria problemático fazer um padding aos valores para teres sempre três digitos enviados após uma letra? Isso facilitaria imenso o código.
char received;
char convert[4];
int A, E;
int i;
convert[3] = '/0';
received = Serial.read(); //Não sincronizei a comunicação.
switch (received) {
case 'A': {
for (i=0; i<3; i++) {
convert[i] = Serial.read(); }
if (Serial.read() == '*') {//confirmar que a trama está completa e tirar o '*' do buffer
A = atoi(convert);}
break; }
case 'E': {
for (i=0; i<3; i++) {
convert[i] = Serial.read(); }
if (Serial.read() == '*') {//confirmar que a trama está completa e tirar o '*' do buffer
E = atoi(convert);}
break; }
} //end switch
Senão, usas a mesma estrutura, mas com outra condição, tipo:
case 'A': {
i = 0;
while (((received = Serial.read()) != '*') & (i <3)) {
convert[i++] = received;
}
convert[3] = '/0';
if (Serial.read() == '*') {//confirmar que a trama está completa e tirar o '*' do buffer
A = atoi(convert);}
break; }
}
No entanto, esta forma tem bugs. Se for enviado um valor com 4 digitos por exemplo, isto não funciona.
Podias tentar fazer isto com strtok, mas acho que ia ser menos eficiente.
#define PARSEVAR 1
#define PARSEVAL 2
int parsePhase = 0;
int chegouA = false;
int value = 0;
void loop() {
if (Serial.available() <= 0) continue; // fica aqui até chegar alguma coisa
int input = Serial.read();
switch (input) {
case 'A':
parsePhase = PARSEVAL;
chegouA = true;
break;
case 'E':
parsePhase = PARSEVAL;
chegouA = false;
break;
case '0':
case '1':
case '2':
case '3':
case '4':
case '5':
case '6':
case '7':
case '8':
case '9':
if (parsePhase == PARSEVAL) {
value = value * 10 + input - 0x30;
} else {
parsePhase = 0;
}
break;
case '\r':
//
// faz aqui o que você tem que fazer com o chegouA e com o value
//
parsePhase = 0;
chegouA = false;
value = 0;
break;
default:
chegouA = false;
value = 0;
parsePhase = PARSEVAR;
}
}