Dados recebidos pela serial

Opzzz, bele?

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;

#include <LiquidCrystal.h>
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);

void setup() {
Serial.begin(57600);
}

void loop() {
if (Serial.available() > 0) {
serialIn = Serial.read();

if(serialIn == 13) {
value = 0;
}
else
value = value * 10 + serialIn - 0x30;

// -->NESTE PONTO TRANFORMARIA value EM SUBSTRING <--

lcd.print(value);
delay(170);
lcd.clear();
}
}

:frowning:

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.

ok, obrigado, vou tentar mais tarde!
Hora de ir pro trabalho!

Fala Kotch! Vou te dar um mamão:

#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;
    }

}