Go Down

Topic: Enviar y recibir multiples bytes por puerto serial [SOLUCIONADO] [COMO] (Read 5 times) previous topic - next topic

flico

Trabajando en ...

    * Control Domotico (En montaje ...)
    http://casitadomotica.blogspot.com/
 

[url=https://bitbucket.org/fmalpartida

SrDonGato

no es el timeout que pretendías hacer, esperas a que se llene con 12 bites para interpretar la linea completa.
en el caso de que pierdas comunicación y se pierdan caracteres y recibas luego otra trama completa no funcionaría
por ejemplo si recibes
!123 y despumes de un tiempo recibes !123456789

tu programa interpretaría la linea completa !123!1234567

y no como lo que he entendido que pretendías que desechara !123 y empezara de nuevo por !1234567890 que es la siguiente trama correcta que recibes

como te he comentado es lo suyo


DrJuano

Efectivamente, no produce el efecto completo que mencionas de desechar. Por un momento creí que si, pero no desecha. Aunque no sé porqué no lo hace, ya que al final de la secuencia el contador se pone en cero y el buffer del puerto serial se elimina, haya no haya comando en la string[].

SrDonGato

eso lo hace siempre y cuando el contador llegue a 12 y no antes.

un timeout la unicaforma de hacerlo en controlando tiempos

cada vez que lees un caracter pones

referencia_timeout=millis();

el if que tienes con contrador  ==  12 está bien , quita la ultima parte de

    Serial.flush(); // vacía el buffer del puerto serie

si mientras el micro procesa la linea que pretendes llega una trama buena, un caracter por ejemplo, con esa linea la borras, por lo que pierdes informacion.

y ahora haces el reset del contador si se supera cierto tiempo

if (( millis()-referenciatimeout ) > tiempotimeout){ contador=0;}



DrJuano

#9
May 04, 2012, 07:12 pm Last Edit: May 04, 2012, 07:14 pm by DrJuano Reason: 1
Quedaría algo así:

Code: [Select]
void loop() {

 while (Serial.available() > 0) {
   EntradaByte[contador] = Serial.read(); // Lee el byte y lo mete en la String[]
   contador++; // Suma un valor
   timeout = millis();  // carga timeout
 }

 if (( millis() - timeout ) > 800) { contador=0; }  // si pasaron más de 800 milisegundos, entonces, vuelve a poner el contador a cero

 if (contador == 12) { // Si el valor llega a 12 // si el contador llego exitosamente a 12, entonces ejecuta el proceso del comando
   if (EntradaByte[0] == 0x21 && EntradaByte[11] == 0x21) { // Si el primer byte y el ultimo es 0x21 (!)
     switch (EntradaByte[1]) { // Ve el segundo byte, que es la orden
       case 82: //Letra R // Si el segundo byte es R entonces hace...
        // HAZ ALGO
        Serial.println(0x21); //Responde 0x21 (!)
        break;
     }
   }
   contador = 0; // Pone el contador a cero para evitar repeticiones
 }
 
}


Probado y funciona perfecto. Gracias SrDonGato. Es dificil a veces comprender el tema del loop. Recién empiezo con Arduino y estoy experimentando bastante. Tengo en mente algun proyecto comercial. Espero que esto ayude a otro que venga por lo mismo. Ahora voy a tratar de generar algo que verifique la secuencia recibida (CRC).

Go Up