viernes, 21 de agosto de 2015

Arduino. Leer cadena de caracteres en Serail Software

Un codigo estandar para leer una cadena de caracteres en Arduino podria ser este:


#include <SoftwareSerial.h>
SoftwareSerial mySerial(2, 3); // RX, TX
const int MAX = 256;
void setup() {
  mySerial.begin(9600);

}

void loop() {
   int cont = 0;
 while (mySerial.available() && cont < MAX) {
    read[cont]=mySerial.read();
    cont++;
  } 

// do something with the read characteres



Este codigo funciona puede no funcionar correctamente debido a muchos factores:

  • El tipo de microcontrolador. Un arduino tiene un microcontrolador ATmega168 o superior; este microcontrolador soporta perfectamente este codigo pero puede que sea neceario que este codigo funcione en otro microcontrolador menos potente (menos frecuencia y/o capacidad) por lo que puede que un codigo funcione en Arduino no tiene porque funcionar en otro microcontrolador.
  • El origen de datos. El puerto SoftwareSerial esta conectado a algun dispositivo que suministra la informacion de este codigo. El Arduino lee correctamente (forma y velocidad) los caracteres del puerto SoftwareSerial pero en otros sistemas puede que el dispositivo transmita mas lento/rapido. Ademas puede que aparezca mas o menos basura.
En resumen, cuando se desarrolla un codigo para un sistema (que no esta basado en Arduino) con un Arduino se debe adecuar el codigo al sistema final. La forma mas normal de adecuar el codigo es incluir retardos. 

Si el sistema final lee los caracteres demasiado rapido entonces de debe incluir un retardo entre lectura y lectura:


void loop() {
   int cont = 0;
 while (mySerial.available() && cont < MAX) {
    read[cont]=mySerial.read();
   delay (10); // retardo para leer el caracter correcto 
    cont++;
  } 


Si el sistema final lee los caracteres correctamente pero los caracteres se establecen en la variable "read" demasiado lento entonces de debe incluir un retardo entre lectura y lectura:


void loop() {
   int cont = 0;
 while (mySerial.available() && cont < MAX) {
    read[cont]=mySerial.read();
    cont++;
  } 

 delay (10); // retardo para darle tiempo a los caracteres a establecerse en la variable "read"

// do something with the read characteres



El valor del retardo depende del sistema final.

No hay comentarios: