Recibir datos de un dispositivo Rs232 con Arduino Mega

hola, antes que nada me gustaría aclarar que soy novata en Arduino disculpen si mis preguntas no son tan claras como espero y agradezco de antemano su ayuda.

Mi proyecto consiste en controlar un dispositivo llamado Barcode Tikcet Reader, conectado por puerto serial con su respectivo Max232 a mi arduino Mega, hasta el momento he logrado con éxito enviar los comandos al dispositivo y reacciona como espero, el problema está cuando intento leer la respuesta del mismo, he intentado todo lo que encontré en el foro y diferentes páginas pero no me funciona.

El objetivo es controlar esa respuesta, que hasta el momento no logro ver en el monitor serial ni saber si estoy leyéndola de manera correcta aquí un ejemplo simple de dos comandos enviados y una de las maneras que he intentado para leer la respuesta:

byte insert[]={0x12,0x02,0x42,0x3C,0x03,0x04};// comando para insertar un ticket 
byte leer[]={0x12,0x02,0x42,0x23,0x03,0x04};// comando para leer código de barras 

void setup()
{
 Serial.begin(9600);
 Serial1.begin(9600);
 Serial.println("Start");
}

void loop(void)
{
  while(Serial1.available()>0) {
     byte inByte = Serial1.read();
     Serial.println("Respuesta: ");
     Serial.print(inByte); 
     delay(10);
   }
    Serial1.write(insert,6);// insertar un ticket
    delay(500);
    Serial1.write(leer,6);// leer codigo de barras
    delay(500);
}

y la respuesta que obtengo de este es siempre la siguiente:

Start
Respuesta: 
6
Respuesta: 
6
Respuesta: 
17
Respuesta: 
17

Cuando la respuesta que espero es el código de barras leído por el aparato.

Aquí esta un link con la descripción del aparato

http://www.eltrasistemi.com/es/downloads/pdf/EL0000_SERIES%20.pdf

Adjunto dos imágenes del manual donde explica lo que el aparato espera recibir y la respuesta que envía, espero que alguien pueda ayudarme.

Alma.


Prueba de este modo

void loop(void)
{
    Serial1.write(insert,6);// insertar un ticket
    leoSerial();
    delay(500);

    Serial1.write(leer,6);// leer codigo de barras
    leoSerial();
    delay(500);
}

void leoSerial() {
    while (Serial1.available()>0) {
           byte inByte = Serial1.read();
           delay(10);
    }
    if (inbyte == 6)
        Serial.println("Respuesta Correcta");
    if (inbyte == 17)
        Serial.println("Respuesta Incorrecta");
}

Con el código que me sugiere obtengo "respuesta correcta" y "respuesta incorrecta", quiero decir obtengo una vez más el "6" y "17" que no se que significan, pero no el código de barras que estoy esperando leer...

significa que estoy leyendo correctamente el puerto serial sin embargo el aparato no me está enviando bien la información?

de donde has sacado esa información que esta en las imágenes?
No tiene nada que ver con el link que pusiste del equipo.

La información de las imágenes las saque del manual de usuario del aparato, en el link solo viene su información técnica y la puse para que supieran de que aparato hablo.

El manual no está en la red ya que me lo mando el fabricante como información confidencial :o

Quiero comentar que logré que el aparato me mande la información que pedía de la siguiente manera, resulta que necesita códigos de confirmación después del "comando lectura de código de barras" el aparato responde "06" y un "10"y espera un "comando de confirmación" al cual llame "ok" (es 12 05 en Hex).
si lo hago de la manera siguiente logro leer la información completa!

byte readbc[]={0x12,0x02,0x42,0x23,0x03,0x30,0x30,0x04};// comando para leer código de barras readbarcode 
byte ok[]={0x12,0x05};// comando de confirmación


byte inByte;
void setup()
{
 Serial.begin(9600);
 Serial1.begin(9600);
 Serial.println("Start");
 delay(10);

}
void loop(void)
{
  Serial1.write (readbc,8);
  delay(100);
  if (inByte == 06)
      {
         Serial1.write(ok,2);//comando ok 
          delay(100);
      }
      if (inByte == 10)
      {
         Serial1.write(ok,2);//comando ok 
          delay(100);
          
      }
     leoSerial();
     delay(5000);   
     
}
void leoSerial() {
    while (Serial1.available()>0) {
           inByte = Serial1.read();
           delay(100);
           Serial.println(inByte);
    }
}

así logro ver en el monitor serial la siguiente respuesta

Start
6
6
2
66
35
48
48
48
48
48
48
48
49
51
50
48
49
55
49
48
50
51
49
52
49
49
50
51
3
53
50
4

y es la información que esperaba ya que el código de barras es "00001320171023141123"
la trama completa sería cómo en la siguiente imagen:

ahora el desafío es controlarla guardarla en una variable saber separarla etcétera, ya he encontrado información en el foro, así que trabajo en ello y la pregunta principal (saber si estoy leyendo de manera correcta el puerto serial) está resuelta, muchísimas gracias por la atención y ayuda Ricardo.

1 Like