Como monitorar uma conexão serial @ 250000 baud?

3

Eu gostaria de monitorar diretamente a conexão serial-sobre-usb para a minha impressora 3D, que funciona a 250000 baud. por exemplo, eu posso monitorá-lo com cat /dev/ttyUSB0

No entanto, primeiro preciso definir a taxa de transmissão, por exemplo, stty -F /dev/ttyUSB0 115200

Mas se eu tentar definir a taxa de transmissão para 250k, ela falhará:

stty -F /dev/ttyUSB0 250000

dá resultado:

stty: invalid argument 250000

Parece que a taxa de transmissão 250000 não é suportada no Ubuntu / Mint. Alguém pode sugerir uma maneira alternativa de monitorar essa conexão serial?

    
por Mtl Dev 30.11.2016 / 23:03

2 respostas

4

Existem alguns ioctls não documentados que você pode usar para definir velocidades não padrão, desde que o driver os implemente. Uma maneira simples de chamá-los é com um pequeno pedaço de python. Por exemplo, coloque no arquivo mysetbaud.py e chmod +x it:

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

Isso leva algum código do pacote pyserial com constantes para os vários valores necessários dos arquivos de inclusão do Linux C e uma matriz para o struct termios2 . Você o usa com um parâmetro de taxa de transmissão e seu dispositivo em stdin, por exemplo, de bash:

./mysetbaud.py <>/dev/ttyUSB0 250000
    
por 01.12.2016 / 18:03
3
setserial -a /dev/ttyUSB0 spd_cust
setserial -a /dev/ttyUSB0 divisor 96

Agora defina a porta para 38400 para obter 250000

stty -F /dev/ttyUSB0 38400

(ou use-o como 38400 em um aplicativo, por exemplo, ser2net)

Tenho minhas informações do link

    
por 14.12.2017 / 01:47