一些背景知识:我正在实现一个通过 GPIB 与设备交互的 GUI。这种方法会出现问题:
from tkinter import *
from tkinter import ttk
import visa #PyVisa Package. pyvisa.readthedocs.io
from time import sleep
import numpy as np #NumPy Package. Scipy.org
def oneDSweep():
Voltage =[]
Current =[]
Source = []
try:
#Gate = parseGate(Gate1Input.get()) #Not implemented yet.
Min = float(Gate1MinInput.get()) #Add a check for valid input
#if Min < .001:
#Throw exception
Max = float(Gate1MaxInput.get()) #Add a check for valid input
VoltageInterval = .02 #Prompt user for interval?
rm = visa.ResourceManager()
SIM900 = rm.open_resource("GPIB0::1::INSTR") #Add a check that session is open.
x = 0
Volt = Min
while Volt <= Max:
SIM900.write("SNDT 1, 'VOLT " + str(Volt) + "'") #Set voltage.
SIM900.write("SNDT 7, 'VOLT? 1'") #Ask a port for voltage.
Vnow = SIM900.query("GETN? 7, 50") #Retrieve data from previous port.
Vnow = Vnow[6:15]
Vnow = float(Vnow) ############Error location
Voltage = np.append(Voltage, Vnow)
SIM900.write("SNDT 1, 'VOLT?'") #Ask a different port for voltage.
Snow = SIM900.query("GETN? 1, 50") #Retrieve data.
print(Snow) #Debugging method. Probably not problematic.
Snow = Snow[4:]
Snow = float(Snow)
sleep(1) #Add a delay for science reasons.
#The code below helps the while loop act like a for loop.
x = x+1
Volt = Min + VoltageInterval*x
Volt = float(truncate(Volt, 7))
finally:
print(Voltage)
print(Source)
Voltage.tofile("output.txt.",sep=",")
SIM900.write("FLSH")#Flush the ports' memories to ensure no bad data stays there.
在 while 循环的第一遍中,我在标记的位置得到一个简单的 ValueError ;Python 说它不能将字符串转换为浮点数(稍后会详细介绍)。但是,只需删除这五行代码:
SIM900.write("SNDT 1, 'VOLT?'")
Snow = SIM900.query("GETN? 1, 50")
print(Snow)
Snow = Snow[4:]
Snow = float(Snow)
并且程序运行完美。我了解错误的来源。添加这些行后,当我将这两行发送到我的仪器时:
SIM900.write("SNDT 7, 'VOLT? 1'")
Vnow = SIM900.query("GETN? 7, 50")
我基本上得到一个空错误。#3000
返回,这是机器在被要求输出数据并且没有输出数据时发送的空白消息。然而,同样的两行会产生类似于#3006 00.003
我提到的四行被排除在程序之外的情况。换句话说,只需将这四行添加到我的程序中,就会更改在 while 循环开始时发送到仪器的消息,尽管它们是在接近结尾处添加的。
我确信 Python 的解释器在这里有问题。早些时候,我正在清理我的代码并发现一组特定的引号,当从 更改为'
时"
,会产生同样的错误,尽管没有其他引号对表现出这种行为,即使在同一行中也是如此。我的问题是,为什么我的代码执行取决于对代码的不相关更改(也希望得到修复)?我知道考虑到我的具体应用程序,这个问题很难复制,所以如果我可以提供更多有用的信息,请告诉我。
编辑:从命令提示符转移到 IDLE 后,功能得到了改进。我仍然对所发生的事情感到困惑,但由于我的命令提示技能微薄,我无法提供任何证据。请关闭这个问题。