如何使用PyVisa连接Arduino Uno?查询指令超时无响应该如何解决
你遗漏的配置和需要调整的逻辑如下:
- Arduino默认不支持SCPI标准指令:你调用的
*IBN?属于工业仪器通用的SCPI标准查询指令,Arduino没有内置对应解析逻辑,必须自行在Arduino固件中编写串口指令响应规则,才能返回对应内容。 - 串口参数未显式匹配Arduino配置:PyVisa打开串口资源时的默认波特率、终止符等参数不一定和你Arduino侧
Serial.begin()的配置一致,打开资源时需要显式指定对应参数,同时你原有代码的PyVisa调用方式不符合规范,调整后的Python示例代码如下:
import pyvisa import time port = "ASRL4::INSTR" # 如使用NI Visa后端可不传参数,用pyvisa-py后端则传入'@py' rm = pyvisa.ResourceManager() # 波特率、终止符需和Arduino侧配置完全一致 device = rm.open_resource(port, baud_rate=9600, write_termination='\n', read_termination='\n')
- 未避开Arduino串口复位的等待期:Arduino Uno的硬件设计会在串口首次连接时自动触发主板复位,复位过程耗时1~2秒,这期间主板不会响应任何指令,需要在打开资源后增加延时再发起查询:
# 等待复位完成 time.sleep(2) # 注意指令内容要和你Arduino侧编写的响应规则对应 print(device.query("IBN?"))
- 补充Arduino侧的串口响应固件示例:
void setup() { // 波特率和Python侧配置保持一致 Serial.begin(9600); while (!Serial); } void loop() { if (Serial.available() > 0) { String cmd = Serial.readStringUntil('\n'); cmd.trim(); if (cmd == "IBN?") { // 收到对应指令后返回自定义内容 Serial.println("Arduino Uno R3"); } } }
内容的提问来源于stack exchange,提问作者Tijmen Groot
相关产品推荐
相关产品推荐

