Go Down

Topic: Problemas con lectura serial data (Read 119 times) previous topic - next topic

johnnynemonic

Buenas tardes,
 
Tengo un proyecto entre manos en el que ahora mismo me encuentro atascado y necesitaria un poco de luz.

Tengo un RS232toTTL conectado a un ESP32 y un visor de peso que envia por puerto serie lo siguiente:
En hexadecimal seria así
2D 2D 2D 2D 2D 2D 0A 20 20 20 57 45 49 20 20 20 0A 0A 65 3A 20 20 20 35 20 20 20 0A 2D 2D 2D 2D 2D 2D 0A 0A 57 45 49 20 20 20 32 30 30 20 20 20 31 30 30 20 20 20 34 30 30 20 20 20 0A 0A 2D 2D 2D 2D 2D 2D

Que traducido a character seria algo así

------        // LINEA 1
   WEI       // LINEA 2
                // LINEA 3
e:   5       // LINEA 4
------     // LINEA 5
              // LINEA 6
WEI   200   100   400   // LINEA 7
                                   // LINEA 8
------                          // LINEA 9

Ya he conseguido leer lo que se envia y encontrar el caracter 0A que sería el '\n'.

Lo que estoy buscando es que cada vez que encuentre un 0A '\n' guardar todo lo que ha leido hasta el momento en una variable linea(x)

Por tanto al final deberia tener
linea1 = -----
linea2 = WEI
Linea3 =
Linea4 =e: 5
linea5 = ----
linea6 =
linea7 = WEI   200   100   400
linea8 =
linea9 = ----

Al final lo que quiero aislar es el 400 que es el peso y que variará cada vez que se pese algo y se envie por RS232, por si os hace falta, el peso empezaria en el caracter nº 29 y acaba en el 32. Luego ya quedaría hacer un trim del string para eliminar los espacios delanteros y traseros en caso de haberlos.

Y aquí está el código que uso y que me tiene bloqueado.

Code: [Select]

/*  ESP32 PARSING DATA */

//==============================
//   DEFINICION DE VARIABLES   
//==============================

const byte numChars = 5000;
const byte lineaChars = 41;
char receivedChars[numChars];
char tempChars[numChars];
char lineapeso[numChars];
String pesotemp;

char messageFromPC[numChars] = {0};
char temp0[numChars];
char temp1[numChars];
char temp2[numChars];
char temp3[numChars];
char temp4[numChars];
char temp5[numChars];
char temp6[numChars];
char temp7[numChars];
boolean newData = false;
HardwareSerial Mettler(1);
 
//===================================
// VOID SETUP VOID SETUP VOID SETUP
//===================================

void setup() {
  Serial.begin(115200);
  Mettler.begin (9600);
 }


//================================
// VOID LOOP VOID LOOP VOID LOOP 
//================================

void loop() {
  RecWithStartEndMarkers();
  if (newData == true) {
    //strcpy(lineapeso, receivedChars);
    //String pesotemp(lineapeso);
    //pesotemp.trim();
    //lineapeso.replace(" ","");
    //showParsedData();
    newData = false;
  }
}

//=========================================
// FUNCIONES FUNCIONES FUNCIONES FUNCIONES
//=========================================

void RecWithStartEndMarkers(){
 
 static boolean recvInProgress = true;
 static byte ndx = 0;
 static byte linea = 0;
 char endMarker = '\n';
 char rc; 
 if (Mettler.available()>0){
   while (Mettler.available() >0 && newData== false) {
     rc = Mettler.read();
     //rc = (char(Mettler.read());
     if (recvInProgress == true) {
       if (rc != endMarker) {
          Serial.print(rc);
          receivedChars[ndx]=rc;
          ndx++;
          delay(1);
          if (ndx >=lineaChars) {
             ndx = lineaChars -1;
          }
       }
       else {
        strcpy(lineapeso,receivedChars);
        receivedChars[ndx] ='\0';
        //Serial.println(lineapeso);
        if (linea ==7){
           //Serial.println(lineapeso);
           recvInProgress = false;
           ndx =0;
           newData = true;
        }
        else {
         linea++;
         recvInProgress = true;
         newData = false;
        }
       }
     }
   }
 }


//===========================================
// MOSTRAR LINEA MOSTRAR LINEA MOSTRAR LINEA 
//===========================================

void showParsedData() {
 
 Serial.println(lineapeso);
 Serial.println(pesotemp);



TonyDiana

No he podido mirarlo en profundidad, si luego puedo lo miro más, pero al principio ya tienes un error


Code: [Select]
const byte numChars = 5000;

Byte va de 0 a 255, 256 valores

johnnynemonic

Si, bueno es que ya no se por donde tirar. Ahora he reducido el código a lo siguiente, que me saca la misma salida que el anterior y creo que está mas optimizado. Sigo sin encontrar la forma de que cada vez que encuentra un 0A o '\n' me guarde todo ese array de caracteres en una variable linea(x) siendo x = 0 a 9.

Code: [Select]

const byte numChars = 200;
char receivedChars[numChars]; // an array to store the received data
boolean newData = false;
HardwareSerial Mettler(1);
void setup() {
  Serial.begin(115200);
  Mettler.begin (9600);
}

void loop() {
 recvWithEndMarker();
 showNewData();
}

void recvWithEndMarker() {
 static byte ndx = 0;

 char endMarker = '\n';
 char rc;
 
 if (Mettler.available() > 0) {
     while (Mettler.available() > 0 && newData == false) {
       rc = Mettler.read();
       if (rc != endMarker) {
        receivedChars[ndx] = rc;
        ndx++;
         if (ndx >= numChars) {
          ndx = numChars - 1;
         }
       }
       else {
        receivedChars[ndx] = '\0'; // terminate the string
        ndx = 0;
        newData = true;
       }
     }
 }
}
void showNewData() {
 if (newData == true) {
   Serial.println(receivedChars);
   newData = false;
 }
}

bosoft

#3
Nov 22, 2020, 07:36 pm Last Edit: Nov 22, 2020, 07:37 pm by bosoft
Hola
Yo cambiaría a String. Una función simple podría ser:
Code: [Select]

String receivedChars; // declarado goblal

void recvWithEndMarker() {
String temp;
int newpos,oldpos=1

 
 if (Mettler.available() > 0) {
      receivedChars = Mettler.readString();
      newpos=receivedChars.indexOf("\n");
     while(pos!=-1){
temp=receivedChars.substring(oldpos,pos-1);
Serial.println(temp); // linea
oldpos=newpos;
receivedChars[newpos=' '); // cambio 0A por 32 (espacio)
newpos=receivedChars.indexOf("\n");
}

}


No está probado, pueden haber errores

Saludos

johnnynemonic

Cabria la posibilidad de concatenar todos los caracteres que llegan y si detecta un 0A que no haga nada y luego hacer un substring de la cadena que me ha llegado?

while mettler.read() > 0 then

if (character != '\n') {
concatena
}

Es decir que fuera contantenando todo y quedara algo así

-------WEI-----e:5-------


Go Up