Programé una comunicación simple USB CDC (puerto COM virtual) en un STM32L476RG con STM32CubeMX y HAL: cuando el MCU recibe el comando "LDRT", enciende un LED rojo en la placa y envía su estado a USB: " Activar LED rojo "o" Activar LED rojo ".
Mi código no funciona muy bien cuando envío y recibo desde 2 terminales Linux, pero funciona como se esperaba cuando hago lo mismo desde un simple script de Python. ¿Podría alguien explicar por qué?
1 / PRUEBAS DESDE EL TERMINAL DE LINUX
Recepción: Prueba de la recepción (del host a MCU): $ echo "LDRT" > / dev / ttyACM OK: el LED cambia, el osciloscopio muestra 1 RX + 1 eventos de TX.
Recepción y transmisión:
Terminal 1:
$ cat /dev/ttyACM1
Terminal 2:
$ echo "LDRT" > /dev/ttyACM1
FALLO (tipo de): el LED cambia de 4 a 5 veces, el terminal 1 captura tantos eventos TX. El osciloscopio también confirma los eventos 4-5 RX y TX.
2 / PRUEBAS CON UN ESCRITOR PYTHON
Después de más de 2 días de volverme loco con este código STM32, finalmente sospeché algo extraño con Linux. De hecho, todo funciona bien con esta secuencia de comandos de Python rápida y sucia, confirmada por el osciloscopio.
import serial
import time
import re
import argparse
# Parse command-line arguments :
parser = argparse.ArgumentParser()
parser.add_argument("-p", metavar="PORT", dest="port", help="Serial port")
parser.add_argument("cmd", metavar="CMD", help="Command to the STM32")
args = parser.parse_args()
port = serial.Serial(args.port, 115200, serial.EIGHTBITS, serial.PARITY_NONE)
time.sleep(0.2) # s
port.write(args.cmd)
resp = port.readline()
print("Reply : "+resp)
# Clean up :
port.close()
Y la respuesta es la esperada:
$ ./stm32-txrx.py -p /dev/ttyACM1 "LDRT"
Reply : Toggle red LED ON