我无法让我的Windows 7笔记本电脑与Newport CONEX-PP motion controller通话。我尝试过python(Spyder / Anaconda)和一个名为Termite的串口流程序,在任何一种情况下结果都是一样的:设备没有响应。最终目标是使用python与控制器通信。
控制器通过USB线缆连接到我的计算机,他们向我出售明确用于此设备的电缆。连接器有一对灯,当设备接收数据(红色)或发送数据(绿色)时闪烁。该设备附带的打包GUI程序似乎工作正常。我没有尝试过每一个按钮,我尝试过的按钮都有预期的结果。
访问此设备的文档旁边是不存在的。框中的CD有一种连接方式,上面链接的网页有不同的方式。第一种方式(来自盒子的CD)创建了一个模块层次结构,它以一个它无法识别的模块结束(这是Newport提供的代码片段):
import sys
sys.path.append(r'C:\Newport\MotionControl\CONEX-PP\Bin')
import clr
clr.AddReference("Newport.CONEXPP.CommandInterface")
from CommandInterfaceConexPP import *
import System
instrument="COM5"
print 'Instrument Key=>', instrument
myPP = ConexPP()
ret = myPP.OpenInstrument(instrument)
print 'OpenInstrument => ', ret
result, response, errString = myPP.SR_Get(1)
最后一行返回:
追踪(最近一次呼叫最后一次):
档案"< ipython-input-2-5d824f156d8f>",第2行,in 结果,响应,errString = myPP.SR_Get(1)
TypeError:没有方法匹配给定的参数
我猜测这是因为各种模块引用在某些方面都很棘手。但我不知道,我对python来说比较新,而且我唯一一次用它来进行串口通信,供应商提供的示例文件只是起作用。
与控制器通信的第二种方式是通过签证模块(CONEX_SMC_common模块导入签证模块):
import sys
sys.path.append(r'C:\Newport\NewportPython')
class CONEX(CONEXSMC): def __init__(self):
super(CONEX,self).__init__() device_key = 'com5'
self.connect=self.rm.open_resource(device_key, baud_rate=57600, timeout=2000, data_bits=8, write_termination='\r\n',read_termination='\r\n')
mine.connect.read()
最后一个mine.connect.read()命令返回:
VisaIOError:VI_ERROR_TMO(-1073807339):操作完成前超时已到期。
相反,如果我写入端口mine.connect.write('VE')
,连接器上的指示灯会闪烁红色,就像收到一些数据并返回一样:
(4L,< StatusCode.success:0>)
如果我要求提供"我的字典"对象mine.__dict__
,我得到:
{' connect':<' SerialInstrument'(u' ASRL5 :: INSTR')>, ' device_key':你' ASRL5 :: INSTR', ' list_of_devices':(u' ASRL5 :: INSTR',), ' rm':)>}
VISA的ASRL5 :: INSTR资源至少与控制器有关,因为当我从笔记本电脑上拔下设备时,它会消失,GUI程序将停止工作。
也许有一些简单的我在这里失踪了。我安装了NI VISA,而且我不只是运行来自网站的DLL。哦,我发现了一个Github问题/答案with this exact problem,但最终结果毫无意义,在hgrecco告诉他使用" open_resource"之后线程被关闭了。这正是我正在使用的。
使用白蚁的结果是相同的,我显然可以连接到控制器并使灯光闪烁红色,但它永远不会通过白蚁或执行请求的操作做出响应。
我也试过过pySerial:
import serial
ser = serial.Serial('com5')
ser.write('VE\r\n')
ser.read()
Python只是永远在那里等待,我假设因为我没有设置超时限制。
所以,如果有人对这个特定的运动控制器,Newport设备或一般的串口通信有任何经验,并且可以对这个问题有所了解,我非常感激。大约7个小时之后,我没有想法。
答案 0 :(得分:2)
在用新鲜的眼睛回来并发现this GitHub discussion之后,我决定给pySerial另一个镜头,因为我的问题中的其他方法都没有起作用。以下代码有效:
import serial
ser = serial.Serial('com5',baudrate=115200,timeout=1.0,parity=serial.PARITY_NONE, stopbits=serial.STOPBITS_ONE, bytesize=serial.EIGHTBITS)
ser.write('1TS?\r\n')
ser.read(10)
并返回
' 1TS000033 \ r'
该字符串长度为9个字符,因此我随意选择的10个字符读取最终获取了一个终止字符。
问题在于,设备附带的或网站上提供的python文件最多是不完整的,不应该被任何信任。 GUI手册具有所需的波特率。我使用了Termite来确定停止位设置 - 或者至少有一个有效。
答案 1 :(得分:0)
3.5年后...
Here is a gist具有支持Conex-CC的类
花了我几个小时才能解决!
我的设备是Conex-CC,而不是PP,但这似乎是相同的想法。
对我来说,串行解决方案不起作用,因为通过代码或直接的TeraTerm访问,串行端口绝对没有响应。
因此,我正在尝试将您的代码适应我的设备(因为对于Conex-CC,甚至没有提供您正在尝试的代码!)。
重要的是要说import clr
是基于pip install pythonnet
而不是pip install clr
的,这会带来与颜色有关的东西。
收到错误后,我正在寻找此Pythonnet错误并找到了this答案,这使我找到了最终解决方案:
import clr
# We assume Newport.CONEXCC.CommandInterface.dll is copied to our folder
clr.AddReference("Newport.CONEXCC.CommandInterface")
from CommandInterfaceConexCC import *
instrument="COM4"
print('Instrument Key=>', instrument)
myCC = ConexCC()
ret = myCC.OpenInstrument(instrument)
print('OpenInstrument => ', ret)
response = 0
errString = ''
result, response, errString = myCC.SR_Get(1, response, errString)
print('Positive SW Limit: result=%d,response=%.2f,errString=\'%s\''%(result,response,errString))
myCC.CloseInstrument()
这是我得到的结果:
Instrument Key=> COM4
OpenInstrument => 0
Positive SW Limit: result=0,response=25.00,errString=''�