38400波特有什么不稳定的东西吗?

时间:2017-03-13 20:32:17

标签: python python-3.x baud-rate pyvisa

我正在编写一个python项目,通过USB线缆控制PyVisa设备。我取得了很大的成功。我注意到器件数据表支持9600,19200,38400,57600,115200,230400,460800波特率,因此我创建了一些用于改变波特率的功能。

但我想要一种很好的方法来检测设备设置的波特率,这样我就可以自动连接到它,而不会神奇地知道设备的波特率。设备"记得"您设置的最后一个波特率 - 它在断电时不会重置为默认波特率。如果您设置了错误的波特率,设备似乎根本没有响应。因此,给定一个随机波特率,我循环通过所有支持的波特率并发送一个短命令。如果设备应答,那就是当前设置的波特率,我用它来更多地与设备通信。

然而,在压力测试期间,我注意到当设备随机设置为38400波特并且我去检测它时,我的程序将无法检测到波特率。 (设备无法接听此波特的呼叫。)当我从支持的波特列表中删除它时,设备工作正常。

是否存在大约38400波特率的东西,使其比其他波特更不稳定?

我还认为这个用例很有趣。如果您遇到这样的问题,请尝试删除对某些bauds的支持,看看是否能解决您的错误。希望它有所帮助。

编辑:代码确实无关紧要,但有一个请求,所以......

import visa
BAUDRATES = [
    9600,
    19200,
    38400,
    57600,
    115200,
    230400,
    460800,
]
rm = visa.ResourceManager('@py')
dev = rm.open_resource('ASRLCOM7:INSTR')
for i in range(1, 101): # run 100 tests
    # select a random baud rate from the list
    rand_baud = BAUDRATES[randrange(0,len(BAUDRATES))]
    dev.write('SETBAUD' + str(rand_baud)) # Device response with 'OK'
    print('The random baud was {0}'.format(rand_baud))

# now detect the random baud by sending commands to the instrument and looking for a response
detected_baud = None
for baudrate in BAUDRATES:
    dev.baud_rate = baudrate # sets the com port baud rate
    resp = dev.query('GETINFO')
    if resp != '':
        detected_baud = baudrate
        break
print('The detected baud was {0}'.format(detected_baud))

这段代码是从真实代码中缩写的,但想法是一样的。只需循环,发送命令,并听取响应。如果使用错误的波特率发送消息或命令无法理解,仪器将不会通过COM端口发送响应。这种检测方法总是在38400上失败,并且在任何其他波特率上都不会失败。这种方法失败的唯一方法是它永远不会收到任何波特的响应,这正是它所做的。这让我觉得可能只有波特率或类似的时钟不匹配。我很想知道某些吟游诗人的错误率是否高于其他人。

1 个答案:

答案 0 :(得分:1)

没有。

38400波特没有什么特别之处,使其不如其他传输速率稳定。由于硬件,软件或物理限制,特定设备或传输方法可能会更频繁或唯一地以此(或任何其他)速率遇到问题,但这些可能是设备和/或方法特定的限制,而不是一般来说,38400波特通信固有的。