如何监控 250000 波特率的串行连接?

如何监控 250000 波特率的串行连接?

我希望直接监控与我的 3D 打印机的串行 USB 连接,该打印机以 250000 波特率运行。例如我可以用以下方式监控它cat /dev/ttyUSB0

但首先我需要设置波特率,例如stty -F /dev/ttyUSB0 115200

但如果我尝试将波特率设置为 250k,则会失败:

stty -F /dev/ttyUSB0 250000

给出结果:

stty: invalid argument 250000

Ubuntu/Mint 下似乎不支持波特率 250000。任何人都可以建议一种替代方法来监视此串行连接吗?

答案1

您可以使用一些未记录的 ioctl 来设置非标准速度,前提是驱动程序实现了它们。调用它们的一个简单方法是使用一小段Python。例如放入文件mysetbaud.pychmod +x

#!/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]))

这从pyserial包中获取一些代码,其中包含 Linux C 包含文件所需的各种值的常量,以及struct termios2.您可以将其与波特率参数和标准输入上的设备一起使用,例如来自 bash:

./mysetbaud.py <>/dev/ttyUSB0 250000

答案2

setserial -a /dev/ttyUSB0 spd_cust
setserial -a /dev/ttyUSB0 divisor 96

现在将端口设置为38400即可获得250000

stty -F /dev/ttyUSB0 38400

(或在应用程序中将其用作 38400,例如 ser2net)

我的信息来自http://www.linurs.org/linux/SerialPort.html

相关内容