我正在编写一个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上失败,并且在任何其他波特率上都不会失败。这种方法失败的唯一方法是它永远不会收到任何波特的响应,这正是它所做的。这让我觉得可能只有波特率或类似的时钟不匹配。我很想知道某些吟游诗人的错误率是否高于其他人。
答案 0 :(得分:1)
没有。
38400波特没有什么特别之处,使其不如其他传输速率稳定。由于硬件,软件或物理限制,特定设备或传输方法可能会更频繁或唯一地以此(或任何其他)速率遇到问题,但这些可能是设备和/或方法特定的限制,而不是一般来说,38400波特通信固有的。