Probando STM32 USB CDC TX y RX con 2 terminales Linux

0

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
    
pregunta dplamp

1 respuesta

0

stty -F /dev/ttyACM1 raw le dice al terminal que procese los caracteres uno por uno. Si desea trabajar con líneas, utilice el modo cocinado en lugar de sin formato.

    
respondido por el Dmitry Grigoryev

Lea otras preguntas en las etiquetas