Banner publicitario de PCBWay

Controlar Monedero con protocolo MDB con PIC

Saludos amigos de forosdeelectronica como el tema lo dice necesito controlar un monedero MDB con un pic solo que no conozco mucho de este protocolo pido a alguien que este un poco familiarizado que me pueda orientar investigue un poco y se que es un protocolo serial solo que con 9 bits si saben algo agradezco su ayuda.
 
Hola Alex, pues es el protocolo estándard para las máquinas de despacho, MDB, qué otro protocolo aplica para dichas máquinas? saludos desde México
 
Saludos gilig17... Si tu idea es realizar una interfaz usando un pic para controlar un monedero... pues el protocolo a emplear dependeria de tu aceptador de monedas, generalmente los aceptadores de monedas son multiplataforma es decir trabajan en rs232, paralelo, cctalk, mdb etc que son seleccionados por hardware o software...

Si lo que quieres es ponerle una interfaz a una maquina que tiene una placa electronica que funciona con MDB pues no hay de otra que utilizar dicho protocolo...

Voy a investigar sobre el protocolo MDB a ver si encuentro algo(y)
 
hola a todos!
alguien pudo realizar alguna prueba?
actualmente estoy haciendo pruebas con un monedero cashflow 690 y una expendedora marca necta.
Leo los bits con un osciloscopio digital tektronix pero no logro entender.
alguien pudo hacer andar alguna comunicacion en executivo o en mdb? hay algun pic para hacer esto?
muchas gracias
 
Compra un analizador lógico, hay económicos casi al precio de un pic (incluyendo horas hombre)


Amigo lo que intento decirte es que con un analizador lógico seleccionas el protocolo y ves lo que esta pasando, o que se están diciendo los dispositivos, obviamente tienes que comprar uno que tenga dicho protocolo, sino tendrás que buscarlo en la página del fabricante....
Es lógico que un analizador fue inventado por que los osciloscopios no tienen esa propiedad...

Siquiera buscaste si hay alguno que te sirva?
Viste esto y no te sirve?
http://www.vending.org/technical/MDB_3.0.pdf
 
Última edición por un moderador:
No se amigo, solo estoy intentando darte alternativas, y se que es posible que si es una comunicación usart se pueda, puse un link del protocolo mdb3.0 en mi mensaje anterior pero no lo lei. Dale una buscada si no te sirve, sin la informacion directa del fabricante es muy complejo descifrar cualquier protocolo sea cual sea.
 
Hola a todos los entusiastas de la electronica, tengo una duda de como se comunican el Microcontrolador de una maquina de vending con el monedero electronico tipo compacto Ejecutivo o MBD que aparte de encargarse de la aceptacion de las monedas tambien se encarga de la devolucion del cambio, es en esencia un microcontrolador, este es un dispositivo que esta estandarizado y hay varias marcas, la conexion entre los dos dispositivos es alimentacion y un cable de TX y otro de RX, pareciera que fuera una comunicacion UART o similar
Saludos
 
Yo he hecho varias Vending, pero solo uso los pulsos que envía el monedero.
No he usado los monederos que regresan cambio, pero tal vez próximamente.
En cuanto a la comunicación USART, sí he notado esos terminales pero no he visto la hoja de datos.
Los monederos los configura el dueño conforme al tipo de monedas, así que mis programas solo leen pulsos.

Sucede que cierta vez un amigo se emocionó cuando le dije que sus sistemas los podía hacer configurables por Wi-Fi o Bluetooth.
Así que usé los monederos que él tenía y solo actualicé sus antiguas tarjetas.
Ahora él puede configurar los costos, los tiempos, las leyendas, y saber el total acumulado desde su teléfono.

Si quieres saber para qué sirve el USART, busca la hoja de datos de algún monedero en particular.
 
Gracias por la respuesta, si ya conozco ese tipo de monederos aqui en España se le dice
validadores aunque se utilizan poco y los que mas se hacen servir son los compactos ejecutivos, es decir los que tu dices que regresan cambio
Hay muy poca informacion dobre ellos en la red y las marcas tambien son reacias a darla
Saludos
 
Yo he hecho varias Vending, pero solo uso los pulsos que envía el monedero.
No he usado los monederos que regresan cambio, pero tal vez próximamente.
En cuanto a la comunicación USART, sí he notado esos terminales pero no he visto la hoja de datos.
Los monederos los configura el dueño conforme al tipo de monedas, así que mis programas solo leen pulsos.

Sucede que cierta vez un amigo se emocionó cuando le dije que sus sistemas los podía hacer configurables por Wi-Fi o Bluetooth.
Así que usé los monederos que él tenía y solo actualicé sus antiguas tarjetas.
Ahora él puede configurar los costos, los tiempos, las leyendas, y saber el total acumulado desde su teléfono.

Si quieres saber para qué sirve el USART, busca la hoja de datos de algún monedero en particular.
Buenas D@rkbytes, estoy intentando realizar un proyecto para poder leer los pulsos de la maquina en MDB con una ESP32-S3 pero no soy capaz de leerlos porque siempre me da datos diferente en la misma balda de la vending, podrias darme algun tipo de indicacion???
 
Que des más datos de lo que estás usando y cómo lo estás haciendo.
Por ejemplo: manual del monedero, código fuente de la rutina de lectura y diagrama del circuito de entrada.
Este es el esquema de conexiones que estoy usando, el monedero es un cashflow 690 series (adjunto el manual).

1775490178593.png
Que des más datos de lo que estás usando y cómo lo estás haciendo.
Por ejemplo: manual del monedero, código fuente de la rutina de lectura y diagrama del circuito de entrada.
Respecto al código, he ido haciendo algunos pero con ninguno he conseguido resultados claros, este ha sido uno de ejemplo:
C++:
#include <Arduino.h>

#include "driver/uart.h"

#define RX_PIN 18

#define TX_PIN 17

#define UART_PORT UART_NUM_1


void setup() {

  Serial.begin(115200);

 

  uart_config_t uart_config = {

    .baud_rate = 9600,

    .data_bits = UART_DATA_8_BITS,

    .parity = UART_PARITY_DISABLE,

    .stop_bits = UART_STOP_BITS_1,

    .flow_ctrl = UART_HW_FLOWCTRL_DISABLE,

    .source_clk = UART_SCLK_DEFAULT,

  };


  uart_driver_install(UART_PORT, 2048, 0, 0, NULL, 0);

  uart_param_config(UART_PORT, &uart_config);

 

  // Inversión necesaria para el optoacoplador 6N137

  uart_set_line_inverse(UART_PORT, UART_SIGNAL_RXD_INV);

  uart_set_pin(UART_PORT, TX_PIN, RX_PIN, UART_PIN_NO_CHANGE, UART_PIN_NO_CHANGE);

 

  Serial.println("\n[SISTEMA DE MAPEADO FILTRADO]");

  Serial.println("Esperando selección en la máquina...");

}


void loop() {

  uint8_t b[256];

  int len = uart_read_bytes(UART_PORT, b, 256, 40 / portTICK_PERIOD_MS);


  if (len > 0) {

    // Buscamos dentro de la ráfaga de datos el patrón de selección que hemos visto en tus logs

    for (int i = 0; i < len - 5; i++) {

    

      // Filtramos por el inicio de trama 1E FF o 9E FF que detectó tu ESP32

      if ((b == 0x1E || b == 0x9E) && b[i+1] == 0xFF) {

        

        Serial.println("\n========================================");

        Serial.println("¡DETECCIÓN DE SELECCIÓN ENCONTRADA!");

        

        // Según tus datos, el ID del muelle está en la posición 3 y 4 de la trama

        Serial.printf("ID ESPIRAL (Mapeo): %02X %02X\n", b[i+2], b[i+3]);

        

        Serial.print("TRAMA DE VENTA: ");

        for(int j=0; j<6; j++) Serial.printf("%02X ", b[i+j]);

        Serial.println("\n========================================");

        

        delay(500); // Evitar duplicados

        return;

      }

    }

  }

}
 

Adjuntos

  • MANUALMEICASHFLOE7000 (1).pdf
    4.9 MB · Visitas: 2
Última edición por un moderador:
No conozco mucho sobre la programación en arduino y la verdad es que nunca me ha gustado ese IDE.
Lo que te recomiendo es que utilices interrupciones, en este caso por UART.
Sucede que en un sistema Vending hay muchas cosas que hacer y una rutina por poleo se puede atorar atendiendo algo.
Es mejor atender los sensores y pulsadores mediante interrupciones y utilizar banderas para comprobar estados.

Yo para no complicarme las cosas opté por usar los pulsos para contar la cantidad y me ha funcionado correctamente.
 
No conozco mucho sobre la programación en arduino y la verdad es que nunca me ha gustado ese IDE.
Lo que te recomiendo es que utilices interrupciones, en este caso por UART.
Sucede que en un sistema Vending hay muchas cosas que hacer y una rutina por poleo se puede atorar atendiendo algo.
Es mejor atender los sensores y pulsadores mediante interrupciones y utilizar banderas para comprobar estados.

Yo para no complicarme las cosas opté por usar los pulsos para contar la cantidad y me ha funcionado correctamente.
Okey, mirare lo que me has recomendado, muchas gracias
 
C++:
#include <Arduino.h>

#include "driver/uart.h"

#define RX_PIN 18

#define TX_PIN 17

#define UART_PORT UART_NUM_1


void setup() {

  Serial.begin(115200);

 

  uart_config_t uart_config = {

    .baud_rate = 9600,

    .data_bits = UART_DATA_8_BITS,

    .parity = UART_PARITY_DISABLE,

    .stop_bits = UART_STOP_BITS_1,

    .flow_ctrl = UART_HW_FLOWCTRL_DISABLE,

    .source_clk = UART_SCLK_DEFAULT,

  };


  uart_driver_install(UART_PORT, 2048, 0, 0, NULL, 0);

  uart_param_config(UART_PORT, &uart_config);

 

  // Inversión necesaria para el optoacoplador 6N137

  uart_set_line_inverse(UART_PORT, UART_SIGNAL_RXD_INV);

  uart_set_pin(UART_PORT, TX_PIN, RX_PIN, UART_PIN_NO_CHANGE, UART_PIN_NO_CHANGE);

 

  Serial.println("\n[SISTEMA DE MAPEADO FILTRADO]");

  Serial.println("Esperando selección en la máquina...");

}


void loop() {

  uint8_t b[256];

  int len = uart_read_bytes(UART_PORT, b, 256, 40 / portTICK_PERIOD_MS);


  if (len > 0) {

    // Buscamos dentro de la ráfaga de datos el patrón de selección que hemos visto en tus logs

    for (int i = 0; i < len - 5; i++) {

  

      // Filtramos por el inicio de trama 1E FF o 9E FF que detectó tu ESP32

      if ((b == 0x1E || b == 0x9E) && b[i+1] == 0xFF) {

      

        Serial.println("\n========================================");

        Serial.println("¡DETECCIÓN DE SELECCIÓN ENCONTRADA!");

      

        // Según tus datos, el ID del muelle está en la posición 3 y 4 de la trama

        Serial.printf("ID ESPIRAL (Mapeo): %02X %02X\n", b[i+2], b[i+3]);

      

        Serial.print("TRAMA DE VENTA: ");

        for(int j=0; j<6; j++) Serial.printf("%02X ", b[i+j]);

        Serial.println("\n========================================");

      

        delay(500); // Evitar duplicados

        return;

      }

    }

  }

}

tuve un dolor de cabeza similar, pero con CashFlow de la serie SC que son para billetes.
Para trabajar con CashFlow (protocolo MDB), el desafío es que usa 9 bits (8 de datos + 1 de modo). El ESP32 puede manejarlo, pero la configuración cambia según lo que quieras hacer.
Imaginate que vos sos el monedero, el bus MDB es forosdeelectronica donde todos hablan a la vez en este mismo topico. Para que el monedero sepa cuándo le están hablando a el y no enviándole simples datos, se usa un 9º bit...

Bit 9 en "1" (Modo Dirección): Es como si el ESP32 gritara: "Che!, jjac2004, te estoy hablando a vos!". El primer byte (de izquierda a derecha) de cada comando (la dirección) siempre lleva este bit en 1.
Bit 9 en "0" (Modo Datos): Es la información normal. Una vez que el monedero ya está prestando atención a quien le habla, el resto de la frase se envía con el 9no bit en 0.
Como el ESP32 suele usar solo 8 bits, engañamos/truncamos al sistema cambiando la paridad (Mark/Space) para forzar ese noveno bit.

Otro dolor de cabeza que subestime en un principio: "El Checksum"... Es una suma de control para asegurar que el mensaje no se corrompió en el camino. Como lo haces? Simplemente sumas todos los bytes que enviaste antes del final tomando como regla:

Si la suma pasa de 255 (FF en hexadecimal), "volves a empezar" desde cero (te quedas solo con los últimos dos dígitos).

Ejemplo rápido:
Si quieres enviar 08 11 02, sumas: 08 + 11 + 02 = 1B
Tu trama completa tendria que quedar: 08 11 02 1B
Si el monedero recibe la trama y su propia suma no da 1B, va a ignorar el comando por seguridad

Ahora, vamos a tu sketch. lo que veo ahora, es un simple el error en la lógica de acceso al array dentro de tu if. Estás comparando el puntero del array (b) en lugar del elemento específico en la posición i.
Los puntos críticos a corregir:
Error de sintaxis en tu linea: if ((b == 0x1E || b == 0x9E)...) debe ser if ((b == 0x1E || b == 0x9E)...). Sin el índice , el código nunca entrará a la condición y de seguro te van aparecer cosas raras...
Protocolo MDB (Nivel Físico): Los monederos CashFlow usan el protocolo MDB, que trabaja a 9600 baudios pero con 9 bits de datos (el 9º bit es el "Mode Bit"). El hardware del ESP32 soporta 9 bits, pero tu configuración actual está en UART_DATA_8_BITS, o sea, vos mismo te estas generando un cuello de botella con la contradiccion.
Lo otro que note, es que en tu logica del loop es que al usar uart_read_bytes con un timeout, podrías estar cortando tramas a la mitad. Para MDB, lo ideal es usar el modo de 9 bits y detectar el bit de dirección. En este punto coincido con Dark.
Primer paso:

Código:
// Cambia la línea del IF por esta:
if ((b[i] == 0x1E || b[i] == 0x9E) && b[i+1] == 0xFF) {

Te muestro dos ejemplos sencillos para que hagas pruebas de comunicacion... Si solo queres escucharlo, un sketch base podria ser este:

CSS:
#include <Arduino.h>
#include "driver/uart.h"


#define RX_PIN 18
#define TX_PIN 17
#define UART_PORT UART_NUM_1


void setup() {
  Serial.begin(115200);


  uart_config_t uart_config = {
    .baud_rate = 9600,
    .data_bits = UART_DATA_8_BITS,
    .parity = UART_PARITY_DISABLE, // En sniffer, ignoramos el 9º bit por ahora
    .stop_bits = UART_STOP_BITS_1,
    .flow_ctrl = UART_HW_FLOWCTRL_DISABLE,
    .source_clk = UART_SCLK_DEFAULT,
  };


  uart_driver_install(UART_PORT, 2048, 0, 0, NULL, 0);
  uart_param_config(UART_PORT, &uart_config);
 
  // Inversión para el optoacoplador 6N137
  uart_set_line_inverse(UART_PORT, UART_SIGNAL_RXD_INV);
  uart_set_pin(UART_PORT, TX_PIN, RX_PIN, UART_PIN_NO_CHANGE, UART_PIN_NO_CHANGE);


  Serial.println(">>> MODO SNIFFER MDB ACTIVO");
}


void loop() {
  uint8_t data[128];
  int length = uart_read_bytes(UART_PORT, data, 128, 20 / portTICK_PERIOD_MS);


  if (length > 0) {
    Serial.print("Trama detectada: ");
    for (int i = 0; i < length; i++) {
      // Corregido: Acceso por índice [i]
      if (data[i] == 0x1E || data[i] == 0x9E) {
          Serial.print("[DIR] ");
      }
      Serial.printf("%02X ", data[i]);
    }
    Serial.println();
  }
}

Ahora, veo que estas usando el 6N137 y no se si estas teniendo en cuenta que la señal TX se invierte; Fijate en este ejemplo para escuchar y controlar, te añadí una linea justamente para trabajar esto "UART_SIGNAL_TXD_INV"... Mas que nada es para que el monedero entienda lo que el ESP32 envía.

CSS:
#include <Arduino.h>
#include "driver/uart.h"
#define RX_PIN 18
#define TX_PIN 17
#define UART_PORT UART_NUM_1

// Función para enviar comando MDB (Primer byte con bit de modo en 1)
void mdb_send_command(uint8_t addr, uint8_t* data, uint8_t len) 
    {
    // 1. Enviar Dirección con bit de modo en 1 (usando paridad MARK)
    uart_set_parity(UART_PORT, UART_PARITY_MARK);
    uart_write_bytes(UART_PORT, (const char*)&addr, 1);
    uart_wait_tx_done(UART_PORT, 10);
    // 2. Enviar Datos con bit de modo en 0 (usando paridad SPACE)
    if (len > 0) {
        uart_set_parity(UART_PORT, UART_PARITY_SPACE);
        uart_write_bytes(UART_PORT, (const char*)data, len);
        uart_wait_tx_done(UART_PORT, 10);
    }
     // Calcular y enviar Checksum aquí si es necesario...
}
void setup() 
   {
  Serial.begin(115200);
  uart_config_t uart_config = 
   {
    .baud_rate = 9600,
    .data_bits = UART_DATA_8_BITS,
    .parity = UART_PARITY_MARK, // Iniciamos en modo dirección
    .stop_bits = UART_STOP_BITS_1,
    .flow_ctrl = UART_HW_FLOWCTRL_DISABLE,
    .source_clk = UART_SCLK_DEFAULT,
  };
  uart_driver_install(UART_PORT, 1024, 1024, 0, NULL, 0);
  uart_param_config(UART_PORT, &uart_config);
  uart_set_line_inverse(UART_PORT, UART_SIGNAL_RXD_INV | UART_SIGNAL_TXD_INV); // Invertir ambos para 6N137
  uart_set_pin(UART_PORT, TX_PIN, RX_PIN, UART_PIN_NO_CHANGE, UART_PIN_NO_CHANGE);
}
void loop() 
{
  // Ejemplo: Enviar comando POLL al monedero (Dirección 0x08 para CashFlow)
  if (Serial.available()) {
    char c = Serial.read();
    if (c == 'p') { // Si presionas 'p' en el monitor serial
      Serial.println("Enviando POLL...");
      uint8_t poll_cmd = 0x08;
      mdb_send_command(poll_cmd, NULL, 0);
    }
  }
  // Lectura de respuesta
  uint8_t buffer[64];
  int len = uart_read_bytes(UART_PORT, buffer, 64, 10 / portTICK_PERIOD_MS);
  if (len > 0) 
   {
    Serial.print("Respuesta Monedero: ");
    for(int i=0; i<len; i++) Serial.printf("%02X ", buffer[i]);
    Serial.println();
  }
}

No obvies el MDB Checksum... Tene en cuenta que cada trama MDB termina con un byte de Checksum (la suma de todos los bytes anteriores truncada a 8 bits) como te explique anteriormente. Sin esto, el monedero va a ignorar tus comandos.
 
tuve un dolor de cabeza similar, pero con CashFlow de la serie SC que son para billetes.
Para trabajar con CashFlow (protocolo MDB), el desafío es que usa 9 bits (8 de datos + 1 de modo). El ESP32 puede manejarlo, pero la configuración cambia según lo que quieras hacer.
Imaginate que vos sos el monedero, el bus MDB es forosdeelectronica donde todos hablan a la vez en este mismo topico. Para que el monedero sepa cuándo le están hablando a el y no enviándole simples datos, se usa un 9º bit...



Otro dolor de cabeza que subestime en un principio: "El Checksum"... Es una suma de control para asegurar que el mensaje no se corrompió en el camino. Como lo haces? Simplemente sumas todos los bytes que enviaste antes del final tomando como regla:



Ahora, vamos a tu sketch. lo que veo ahora, es un simple el error en la lógica de acceso al array dentro de tu if. Estás comparando el puntero del array (b) en lugar del elemento específico en la posición i.
Los puntos críticos a corregir:
Error de sintaxis en tu linea: if ((b == 0x1E || b == 0x9E)...) debe ser if ((b == 0x1E || b == 0x9E)...). Sin el índice , el código nunca entrará a la condición y de seguro te van aparecer cosas raras...
Protocolo MDB (Nivel Físico): Los monederos CashFlow usan el protocolo MDB, que trabaja a 9600 baudios pero con 9 bits de datos (el 9º bit es el "Mode Bit"). El hardware del ESP32 soporta 9 bits, pero tu configuración actual está en UART_DATA_8_BITS, o sea, vos mismo te estas generando un cuello de botella con la contradiccion.
Lo otro que note, es que en tu logica del loop es que al usar uart_read_bytes con un timeout, podrías estar cortando tramas a la mitad. Para MDB, lo ideal es usar el modo de 9 bits y detectar el bit de dirección. En este punto coincido con Dark.
Primer paso:

Código:
// Cambia la línea del IF por esta:
if ((b[i] == 0x1E || b[i] == 0x9E) && b[i+1] == 0xFF) {

Te muestro dos ejemplos sencillos para que hagas pruebas de comunicacion... Si solo queres escucharlo, un sketch base podria ser este:

CSS:
#include <Arduino.h>
#include "driver/uart.h"


#define RX_PIN 18
#define TX_PIN 17
#define UART_PORT UART_NUM_1


void setup() {
  Serial.begin(115200);


  uart_config_t uart_config = {
    .baud_rate = 9600,
    .data_bits = UART_DATA_8_BITS,
    .parity = UART_PARITY_DISABLE, // En sniffer, ignoramos el 9º bit por ahora
    .stop_bits = UART_STOP_BITS_1,
    .flow_ctrl = UART_HW_FLOWCTRL_DISABLE,
    .source_clk = UART_SCLK_DEFAULT,
  };


  uart_driver_install(UART_PORT, 2048, 0, 0, NULL, 0);
  uart_param_config(UART_PORT, &uart_config);
 
  // Inversión para el optoacoplador 6N137
  uart_set_line_inverse(UART_PORT, UART_SIGNAL_RXD_INV);
  uart_set_pin(UART_PORT, TX_PIN, RX_PIN, UART_PIN_NO_CHANGE, UART_PIN_NO_CHANGE);


  Serial.println(">>> MODO SNIFFER MDB ACTIVO");
}


void loop() {
  uint8_t data[128];
  int length = uart_read_bytes(UART_PORT, data, 128, 20 / portTICK_PERIOD_MS);


  if (length > 0) {
    Serial.print("Trama detectada: ");
    for (int i = 0; i < length; i++) {
      // Corregido: Acceso por índice [i]
      if (data[i] == 0x1E || data[i] == 0x9E) {
          Serial.print("[DIR] ");
      }
      Serial.printf("%02X ", data[i]);
    }
    Serial.println();
  }
}

Ahora, veo que estas usando el 6N137 y no se si estas teniendo en cuenta que la señal TX se invierte; Fijate en este ejemplo para escuchar y controlar, te añadí una linea justamente para trabajar esto "UART_SIGNAL_TXD_INV"... Mas que nada es para que el monedero entienda lo que el ESP32 envía.

CSS:
#include <Arduino.h>
#include "driver/uart.h"
#define RX_PIN 18
#define TX_PIN 17
#define UART_PORT UART_NUM_1

// Función para enviar comando MDB (Primer byte con bit de modo en 1)
void mdb_send_command(uint8_t addr, uint8_t* data, uint8_t len)
    {
    // 1. Enviar Dirección con bit de modo en 1 (usando paridad MARK)
    uart_set_parity(UART_PORT, UART_PARITY_MARK);
    uart_write_bytes(UART_PORT, (const char*)&addr, 1);
    uart_wait_tx_done(UART_PORT, 10);
    // 2. Enviar Datos con bit de modo en 0 (usando paridad SPACE)
    if (len > 0) {
        uart_set_parity(UART_PORT, UART_PARITY_SPACE);
        uart_write_bytes(UART_PORT, (const char*)data, len);
        uart_wait_tx_done(UART_PORT, 10);
    }
     // Calcular y enviar Checksum aquí si es necesario...
}
void setup()
   {
  Serial.begin(115200);
  uart_config_t uart_config =
   {
    .baud_rate = 9600,
    .data_bits = UART_DATA_8_BITS,
    .parity = UART_PARITY_MARK, // Iniciamos en modo dirección
    .stop_bits = UART_STOP_BITS_1,
    .flow_ctrl = UART_HW_FLOWCTRL_DISABLE,
    .source_clk = UART_SCLK_DEFAULT,
  };
  uart_driver_install(UART_PORT, 1024, 1024, 0, NULL, 0);
  uart_param_config(UART_PORT, &uart_config);
  uart_set_line_inverse(UART_PORT, UART_SIGNAL_RXD_INV | UART_SIGNAL_TXD_INV); // Invertir ambos para 6N137
  uart_set_pin(UART_PORT, TX_PIN, RX_PIN, UART_PIN_NO_CHANGE, UART_PIN_NO_CHANGE);
}
void loop()
{
  // Ejemplo: Enviar comando POLL al monedero (Dirección 0x08 para CashFlow)
  if (Serial.available()) {
    char c = Serial.read();
    if (c == 'p') { // Si presionas 'p' en el monitor serial
      Serial.println("Enviando POLL...");
      uint8_t poll_cmd = 0x08;
      mdb_send_command(poll_cmd, NULL, 0);
    }
  }
  // Lectura de respuesta
  uint8_t buffer[64];
  int len = uart_read_bytes(UART_PORT, buffer, 64, 10 / portTICK_PERIOD_MS);
  if (len > 0)
   {
    Serial.print("Respuesta Monedero: ");
    for(int i=0; i<len; i++) Serial.printf("%02X ", buffer[i]);
    Serial.println();
  }
}

No obvies el MDB Checksum... Tene en cuenta que cada trama MDB termina con un byte de Checksum (la suma de todos los bytes anteriores truncada a 8 bits) como te explique anteriormente. Sin esto, el monedero va a ignorar tus comandos.
Okey muchas gracias, estaré trabajando en ello estos días, de todas formas ahora mismo mi objetivo principal está siendo mapear la máquina, es decir poder ver en mi esp32 el código correcto que manda la máquina cuando vende cada espiral, en el código está TX porque en un principio lo iba a hacer todo junto pero he decidido ir haciéndolo paso por paso, ahora mismo mi problema al 'escuchar' el bus MDB es que leo códigos que no son correctos porque al pulsar la espiral 11, 13, 15 y 16 me da cada vez un código distinto y no tienen parentesco entre ellos, supongo que será algún error del código.
Haré las mejoras en el código que me comentaste y también usaré lo que me propocionaste a ver si consigo ver bien los códigos.
Muchas gracias
 
Atrás
Arriba