Ich möchte die Seriell-über-USB-Verbindung zu meinem 3D-Drucker, der mit 250000 Baud läuft, direkt überwachen. z.B. könnte ich es mit cat /dev/ttyUSB0
überwachen
Allerdings muss ich zuerst die Baudrate einstellen, zB stty -F /dev/ttyUSB0 115200
Aber wenn ich versuche, die Baudrate auf 250k einzustellen, schlägt es fehl:
stty -F /dev/ttyUSB0 250000
ergibt Ergebnis:
stty: invalid argument 250000
Es scheint, dass die Baudrate 250000 unter Ubuntu/Mint nicht unterstützt wird. Kann jemand einen alternativen Weg vorschlagen, um diese serielle Verbindung zu überwachen?
Akzeptierte Antwort:
Es gibt einige undokumentierte ioctls, die Sie verwenden können, um nicht standardmäßige Geschwindigkeiten einzustellen, vorausgesetzt, der Treiber implementiert sie. Eine einfache Art, sie anzurufen, ist mit einem kleinen Stück Python. Legen Sie zB die Datei mysetbaud.py
an und 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]))
Dies erfordert etwas Code aus pyserial
Paket mit Konstanten für die verschiedenen Werte, die von Linux-C-Include-Dateien benötigt werden, und einem Array für struct termios2
. Sie verwenden es mit einem Baudratenparameter und Ihrem Gerät auf stdin, zB von bash:
./mysetbaud.py <>/dev/ttyUSB0 250000