Deseo monitorear directamente la conexión serie a través de USB a mi impresora 3D, que funciona a 250000 baudios. por ejemplo, podría monitorearlo con cat /dev/ttyUSB0
Sin embargo, primero necesito establecer la velocidad en baudios, por ejemplo, stty -F /dev/ttyUSB0 115200
Pero si intento establecer la velocidad de transmisión en 250k, falla:
stty -F /dev/ttyUSB0 250000
da resultado:
stty: invalid argument 250000
Parece que la velocidad en baudios de 250000 no es compatible con Ubuntu/Mint. ¿Alguien puede sugerir una forma alternativa de monitorear esta conexión en serie?
Respuesta aceptada:
Hay algunos ioctls no documentados que puede usar para establecer velocidades no estándar, siempre que el controlador los implemente. Una forma sencilla de llamarlos es con un pequeño trozo de python. Por ejemplo, poner en el archivo mysetbaud.py
y chmod +x
es:
#!/usr/bin/python
# set nonstandard baudrate. http://unix.stackexchange.com/a/327366/119298
import sys,array,fcntl
# from /usr/lib/python2.7/site-packages/serial/serialposix.py
# /usr/include/asm-generic/termbits.h for struct termios2
# [2]c_cflag [9]c_ispeed [10]c_ospeed
def set_special_baudrate(fd, baudrate):
TCGETS2 = 0x802C542A
TCSETS2 = 0x402C542B
BOTHER = 0o010000
CBAUD = 0o010017
buf = array.array('i', [0] * 64) # is 44 really
fcntl.ioctl(fd, TCGETS2, buf)
buf[2] &= ~CBAUD
buf[2] |= BOTHER
buf[9] = buf[10] = baudrate
assert(fcntl.ioctl(fd, TCSETS2, buf)==0)
fcntl.ioctl(fd, TCGETS2, buf)
if buf[9]!=baudrate or buf[10]!=baudrate:
print("failed. speed is %d %d" % (buf[9],buf[10]))
sys.exit(1)
set_special_baudrate(0, int(sys.argv[1]))
Esto toma algo de código del pyserial
paquete con constantes para los diversos valores necesarios de los archivos de inclusión de Linux C y una matriz para struct termios2
. Lo usa con un parámetro de velocidad en baudios y su dispositivo en stdin, por ejemplo, desde bash:
./mysetbaud.py <>/dev/ttyUSB0 250000