Go Down

Topic: Comunicacion Serial lcd touch industrial [SOLUCIONADO] (Read 684 times) previous topic - next topic

NCLAVIJO

Hola Amigos,
en ésta ocasión les quiero preguntar acerca de la comunicacion serial ttl/cmos.

No sé si aplique acá el topic,
estoy trabajando con un módulo lolin esp 32d (por la capacidad de memoria)
estoy tratando de comunicarme con la pantalla lcd touch,  ésta se comunica por puerto serial y la trama es Hex.

entonces, tengo conectado el esp32 a la pantalla,
el diseño del GUI tiene varios botones y al tratar de recibir datos solo recibo una trama (no interesa qué botón oprima)

"fe f7 fd ff f7 0 2d a9 be"

mientras que debería recibir (por ejemplo)
"a5 5a 06 83 00 04 00 02"

como estoy apenas empezando con éste desarrollo, el código es el básico,
he ensayado la lectura con variables int, bool, uint8_t, float, y nó encuentro lógica en la trama recibida.

asumo que lo que se sucede es un error en el protocolo de lectura...

(al tratar igual de enviar una trama como HEX, la pantalla no reacciona)

el string "hand" es una trama que segun el manual de la pantalla debería enviarse al iniciar el dispositivo, lo he incluido en el setup, pero igual, nada sucede.

"rojo1" y "negro1" son las tramas que envío para cambiar el color de letra de un texto en pantalla
(para éste ejemplo en particular, no estoy escribiendo nada)
me estoy concentrando en leer y/o entender la trama.

Code: [Select]

#include <SoftwareSerial.h>

#define RXD2 16 //gris
#define TXD2 17 //morado

byte trama[9];
byte hand[6]={0xAA,0x00,0xCC,0x33,0xC3,0xC3};
byte rojo1 [8]={0xA5,0x5A,0x05,0X82,0X10,0X03,0XF8,0X00};
byte negro1 [10]={0xA5,0x5A,0x00,0x05,0x82,0X10,0X03,0X00,0X00};
 
void setup() {
  // Note the format for setting a serial port is as follows: Serial2.begin(baud-rate, protocol, RX pin, TX pin);
  Serial.begin(115200);
    Serial2.begin(115200, SERIAL_8N1, RXD2, TXD2);
  Serial.println("Serial Txd is on pin: "+String(TXD2));
  Serial.println("Serial Rxd is on pin: "+String(RXD2));
  //Serial2.write (hand,6);
}
 
void loop() { //Choose Serial1 or Serial2 as required
  for(int i=0; i<=10; i++){
  
  if(Serial2.available()){
    trama[i] = Serial2.read();
    Serial.println(trama[i], HEX);
    }  
  }
}



La Pantalla es una LCD touch 10.1"
http://www.stone-hmi.com/product/278082013

Nuevamente, gracias por su apoyo.

NCLAVIJO

he estado siguiendo el desarrollo,
quiero hacer una actualización del tema a ver si logro algun apoyo de la comunidad....

Revisando el manual de la pantalla TFT en cuestion me indica que la información es enviada por el modelo de high byte first (big_endian), y tanto arduino y el ESP32 trabajan en little_endian....

entonces, mi siguiente pregunta es:  Aexiste alguna librería o código através del IDE para indicarle al esp32 que trabaje en big_endian??

Kike_GL

En tu código es posible que tu for() se inicie antes que la recepción de datos. Te recomiendo hacer esto:

Code: [Select]

String frase = "";
void loop(){
   while (Serial2.available()){
      char caracter = Serial2.read();
      frase.concat(caracter);
      delay(10);
   }
   if (frase != ""){
      Serial.println(frase, HEX);
      frase = "";
   }
}
Saludos, Kike_GL

surbyte

Hola, NCLAVIJO me confirmas como es el hardware entre tu Nextion y tu ESP32. como estan conectados, tienes adaptadores de nivel de 3.3V a 5V?

NCLAVIJO

#4
May 28, 2019, 04:56 pm Last Edit: May 29, 2019, 01:32 am by surbyte
Hola
Surbyte,

Te comento:
Tengo conectada la pantalla directamente al puerto UART2 (Tx y RX  a los pines RX y TX respectivamente) del esp32 a la pantalla (no es una nextion, es una pantalla industrial), precisamente, hace unos meses hice un desarrollo donde conecté una nextion de 7" directamente a un arduino mega 328 y trabajó perfectamente desde el inicio.....


el catálogo del fabricante de la pantalla me indica que su nivel lógico es:

3.3v  a 0.1v de salida de datos.
2.1v a 0.9v de entrada de datos. (adjunto la imagen)


De igual forma, dentro de las especificaciones del esp32 me indica que los voltajes de operación de los GPIO son 3.3V, Por tal motivo, no he usado un level shifter, será que estoy cometiendo el error ahí?

Hice un cambio mayor en el código trabajando la lectura por bytes, adicioné el time out de 200ms (la pantalla tiene un periodo de operación (configurable) de 200ms.

como el catálogo me indica que trabaja por el método "high byte first" invertí el orden del frame header de 0xA5 0x5A por 0x5A 0xA5 seguido del frame y logré recibir una respuesta (errada, pero tiene partes de frame enviado)

2D A9 BE 42   A5 05 82 00 03     0D 0A

otras veces (al azar) recibo un byte mas "A4" después del A5  

2D A9 BE A5 4A 05 82 00 03 0D 0A


Code: [Select]

#define DEBUG(a) Serial.println(a);
#define RXD2 16 //gris
#define TXD2 17 //morado

byte rojo1 [8]={0xA5,0x5A,0x05,0X82,0X10,0X03,0XF8,0x00};
byte rojo [8]={0x5A,0xA5,0x05,0X82,0X10,0X03,0XF8,0x00};



void setup()
{
  delay (500);
  Serial.begin(115200, SERIAL_8N1);
  Serial2.begin(115200,SERIAL_8N1, RXD2, TXD2);
  Serial2.setTimeout(1000);
  
}

void pool() {
  Serial2.flush();
  Serial2.write (rojo,8);
  //Serial2.write (hand,2);
  //delay (400);
  Serial2.flush();
  String data = Serial2.readString();
  DEBUG (data);
  }

void loop()
{
   while (Serial2.available())
   {
      pool();
   }
}



sigo entonces en duda, el inconveniente será en el código? o como lo indica surbyte debo incluir un adaptador de nuvel?


Kike, hice la prueba con el código coo lo indicaste, pero la respuesta de la pantalla fué una trama totalmente desconocida... (0xfe f7 fd ff f7...)


surbyte

Porque no pones el manual completo con los comandos que se le debe enviar a la pantalla?
Estamos trabajando sobre tus supuestos y clarmente no estan bien o no estan completos.

NCLAVIJO

Hola Surbyte.
adjunto el manual de uso de la pantalla donde se indican los parámetros, inicia el tema en el capítulo 2 y en particular al final de la página 19 habla de las funcions 0x82, 0x82 que son las que estoy usando.

como te comenté
cuando conecto la pantalla directo al PC (usando una tarjeta DLB07) recibe las tramas perfectamente,
pero cuando conecto la pantalla al esp32 (por TX y RX) recibo respuestas no acordes (iba a adjuntar la imagen pero por tamaño no me lo permite)


PeterKantTropus

Prueba algo mas simple, yo lo uso cuando tengo problemas de comunicación


Code: [Select]
#define RXD2 16 //gris
#define TXD2 17 //morado
void setup() {
   Serial.begin(115200);
   Serial2.begin(115200, SERIAL_8N1, RXD2, TXD2);
}
void loop() {
    Serial2.print( Serial.read());
    Serial.print(Serial2.read());    
  }



Simplemente el Arduino (en tu caso el esp32) se comporta como un simple adaptador usb-ttl

Saludos
"Si no entra como tornillo, entra como clavo"

NCLAVIJO

Hols peter,
Ya he realizado ese procedimiento, pero no ha funcionado...

PeterKantTropus

Hols peter,
Ya he realizado ese procedimiento, pero no ha funcionado...
En que sentido no ya funcionado?
"Si no entra como tornillo, entra como clavo"

NCLAVIJO

la respuesta que recibo son números de dos digitos.....

PeterKantTropus

la respuesta que recibo son números de dos digitos.....
¿cuantos?
Coloca lo que recibes y lo esperado.
 
"Si no entra como tornillo, entra como clavo"

surbyte

Sentido común NCLAVIJO, si alguien te ayuda, date cuenta que no ve TU pantalla por lo tanto debes suministrar toda la información posible que facilite las cosas.

Por eso yo te pedí el manual porque lo primero que hago es revisar que has hecho y Peter que tiene su enfoque requiere que le respondas con datos puntuales.

NCLAVIJO

Hola, surbyte, gracias por la anotación,

Peter,

La trama que debería recibir al oprimir un botón (que está programado en la pantalla mediante del GUI) debería ser:

A5 5A 06 83 00 04 01 00 01,donde:

A5 5A es el frame header
06 es la longitud de datos
00 04 ya es la variable que tengo programada en la pantalla
01 00 01 es un valor fijo, que indica que se activó dicho botón....

pero al recibir la trama con el programa que ha indicado peter, pues, se recibe (en HEX) con variaciones...

si uso el monitor "Terminal" me arroja 0x2d 0x31
si uso el monitor "SSCOM32e" me arroja 0x6A 0x8A
si uso el monitor SERIAL DEL ARDUINO IDE me arroja -1

seguramente no me expliqué bien....
al recibir diferentes tramas de diferentes monitores serial, lo expresé como recibir diferentes dígitos

surbyte

Acabo de ver el manual pero me falta algo para poder responderte.
Tienes otro manual que indique como son las conexiones de hardware via UART?

Go Up