#!/bin/bash # Test comunicazione con Voltronic Axpert MKS IV provando diversi baudrate # Il MKS IV potrebbe usare un baudrate diverso dal classico 2400 DEVICE="${1:-/dev/ttyUSB0}" echo "=== Test Baudrate per Voltronic Axpert MKS IV su $DEVICE ===" echo "" # Verifica device if [ ! -e "$DEVICE" ]; then echo "ERROR: Device $DEVICE non trovato!" exit 1 fi # Array di baudrate da testare # Il MKS IV potrebbe usare: 2400, 9600, 19200, 38400 o 115200 BAUDRATES=(2400 9600 19200 38400 115200) for BAUD in "${BAUDRATES[@]}"; do echo "============================================" echo "Testing BAUDRATE: $BAUD" echo "============================================" # Configura device sudo stty -F $DEVICE $BAUD cs8 -cstopb -parenb -echo raw sudo chmod 666 $DEVICE # Test con Python python3 << PYTHON_EOF import sys import serial import time def calc_crc(data): """Calcola CRC secondo protocollo Voltronic""" crc_ta = [ 0x0000,0x1021,0x2042,0x3063,0x4084,0x50a5,0x60c6,0x70e7, 0x8108,0x9129,0xa14a,0xb16b,0xc18c,0xd1ad,0xe1ce,0xf1ef ] crc = 0 for byte in data: da = ((crc >> 8) >> 4) crc = (crc << 4) & 0xFFFF crc ^= crc_ta[da ^ (byte >> 4)] da = ((crc >> 8) >> 4) crc = (crc << 4) & 0xFFFF crc ^= crc_ta[da ^ (byte & 0x0F)] return crc.to_bytes(2, 'big') try: ser = serial.Serial( port='$DEVICE', baudrate=$BAUD, bytesize=8, parity='N', stopbits=1, timeout=2 ) print(f"Porta aperta a {$BAUD} baud") # Flush buffers ser.reset_input_buffer() ser.reset_output_buffer() time.sleep(0.3) # Test comando QMOD (semplice, 5 bytes di risposta) cmd = 'QMOD' print(f"Invio comando: {cmd}") cmd_bytes = cmd.encode('ascii') crc = calc_crc(cmd_bytes) full_cmd = cmd_bytes + crc + b'\r' print(f" Hex: {full_cmd.hex()}") # Invia ser.write(full_cmd) ser.flush() time.sleep(0.5) # Leggi risposta response = ser.read(200) if len(response) > 0: print(f" [OK] RISPOSTA RICEVUTA ({len(response)} bytes)") print(f" Hex: {response.hex()}") try: ascii_text = response.decode('ascii', errors='replace') print(f" ASCII: {ascii_text.strip()}") # Verifica se è una risposta valida (inizia con '(' e non è NAK) if response[0:1] == b'(' and b'NAK' not in response: print(f" *** BAUDRATE CORRETTO: {$BAUD} ***") sys.exit(0) # Success elif b'NAK' in response: print(f" [X] NAK ricevuto (inverter non comprende)") else: print(f" [X] Risposta non valida") except: print(f" [X] Risposta non decodificabile") else: print(f" [X] Nessuna risposta (timeout)") ser.close() except Exception as e: print(f" [X] Errore: {e}") sys.exit(1) PYTHON_EOF if [ $? -eq 0 ]; then echo "" echo "╔═══════════════════════════════════════════╗" echo "║ BAUDRATE CORRETTO TROVATO: $BAUD ║" echo "╚═══════════════════════════════════════════╝" echo "" echo "Aggiorna /etc/inverter/inverter.conf se necessario" echo "Modifica sources/inverter-cli/inverter.cpp:" echo " Cambia: speed_t baud = B$BAUD;" exit 0 fi sleep 1 done echo "" echo "============================================" echo "NESSUN BAUDRATE FUNZIONANTE TROVATO" echo "============================================" echo "" echo "Possibili cause:" echo "1. Inverter spento o disconnesso" echo "2. Cavo USB/RS232 difettoso" echo "3. Device errato (prova /dev/ttyUSB1 o /dev/hidraw0)" echo "4. Inverter in modalità incompatibile" echo ""