Comunicacion Serial lcd touch industrial [SOLUCIONADO]

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.

#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"

Nuevamente, gracias por su apoyo.

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??

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

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

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?

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

#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...)

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.

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)

VGUS 4.3 User Development Guide.pdf (1.89 MB)

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

#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

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

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

En que sentido no ya funcionado?

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

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

¿cuantos?
Coloca lo que recibes y lo esperado.

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.

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

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?

Tiene todo el aspecto de estar perdiendo tramas, esto es común cuando se intenta obtener mediante una comunicación half duplex tramas Full duplex o hay un error en la configuración de la comunicación (paridad, stop, largo del byte).
Según el manual, la pantalla utiliza comunicación full duplex, pero la librería software serial es half duplex. Nunca utilice la esp32, pero me extraña la forma de declarar la comunicacion :

Serial2.begin(115200, SERIAL_8N1, RXD2, TXD2);

¿no estará utilizando alguna librería para simular la comunicación serial?

Hola surbyte,
tardé en responder, he tenido unas semanas sin descanso..

surbyte, adjunto el datasheet del fabricante de la pantalla... (junto con el anterior archivo que adjunté, es toda la información que me han suministrado)

he estado preguntándome, si la conexión está errada, he seguido lo que indica el manual, sin embargo me nace la duda.

nota:
he visto una pcb con un pic 16f1827 que usa un sn75176bp (convertidor rs422/485)
(será requerido alguna clase de convertidor?)

gracias,
gracias en verdad por su apoyo...

Datasheet+STVI101WT-01.pdf (1.44 MB)

Si tienes un adaptador usb-ttl prueba cambiar el orden de las conexiones, la pantalla a los pins 1 y 3 (creo) y el adaptador a los pines 16 y 17.

GRACIAS !!!!!

invertí los pines y nuevamente conecté el GND de la pantalla al ESP32
y FUNCIONA.....!!!!!!

Peter Gracias.
Surbyte GRACIAS !!!!

sin su apoyo, no hubiese sido posible éste logro....

ahora, seguiré con la construcción de las tramas

Gracias.......
Gracias...........