pySerial:如何检查当前波特率

时间:2016-08-13 23:38:09

标签: python serial-port pyserial

我有一个设备(GT511C3 fingerprint scanner),我正在连接到Raspberry Pi并使用Python Serial module对其进行编程。 GT511设备的默认波特率为9600,并且可以更改它。更改GT511波特率后,它会保持此设置直到下次重新启动。

问题是我是否有办法检查所连接设备的当前波特率(如果设备已经编程,并由另一台主机连接)。我知道可以使用stty

来实现
$> stty < /dev/ttyAMA0
speed 57600 bud; line = 0
...

有没有办法使用Python序列或任何其他模块来完成,或者我是否必须编写迭代检查程序来查找它?

更新1: 我用当前的解决方案来找到可接受的波特率:

ser = serial.Serial('/dev/ttyAMA0')
ser.timeout = 0.5
for baudrate in ser.BAUDRATES:
    if 9600 <= baudrate <= 115200:
        ser.baudrate = baudrate
        ser.write(packet)
        resp = ser.read()
        if resp != '':
            break
if ser.baudrate > 115200:
    raise RuntimeError("Couldn't find appropriate baud rate!")

更新2: 请停止提示serial.baudrate - 这是我要问的内容。

2 个答案:

答案 0 :(得分:1)

也许你应该使用stty,直到找到更好的选择。 您可以从Python代码中调用它并解析结果以获得所需内容。 这是一个基本的例子(未经测试):

import subprocess
import shlex

def get_baudrate(device):
    command = 'stty < {0}'.format(device)
    proc_retval = subprocess.check_output(shlex.split(command))
    baudrate = int(proc_retval.split()[1])
    return baudrate

答案 1 :(得分:0)

在搜索时发现了您的问题,这对我很有用:

import serial

def baud_rate_test(serial_port, packet = b' '):
    ser = serial.Serial(serial_port)
    ser.timeout = 0.5
    for baudrate in ser.BAUDRATES:
        if 300 <= baudrate <= 57600:
            ser.baudrate = baudrate
            ser.write(packet)
            resp = ser.readall()
            if resp == packet:
                return baudrate
    return 'Unknown'

a = baud_rate_test('/dev/ttyUSB1')
print(a)

到目前为止我已经检查过的设备没有问题地回显“b''”。随着时间的推移,我确实计划在更多设备上对其进行测试,我想我可能需要更改“测试数据包”和响应标准。 resp != '': 行对我不起作用 - 因为以不同的波特率返回不同的“奇怪”字符。