我有一个rs232串口设备,我正在尝试使用它来读取和写入 python与pyVISA。我可以使用“写”来编写命令 如果我尝试向我们“阅读”或“询问”,我会收到超时错误。
我可以通过labview或tera术语轻松阅读和写入,但我无法使用python阅读。
以下是无效的python代码:
import visa as v
si = v.SerialInstrument("COM1", delay = 0.1)
si.clear()
si.timeout = 3
si.baud_rate = 9600
si.data_bits = 8
si.stop_bits = 1
command = '0'
while command != 'end':
rorw = raw_input('ask, read, or write? >>')
command = raw_input('enter command code >>')
if rorw == 'write':
write1 = si.write(command)
print write1
elif rorw == 'read':
read1 = si.read()
print read1
else:
ask1 = si.ask(command)
print ask
答案 0 :(得分:1)
我的猜测是你有一个问题。尝试将term_chars设置为\ n或\ r \ n 如果这不起作用串行通信很容易与pyserial。 您将需要使用write和readline定义一个等效于pysvisa的ask的自定义方法,如果出现任何问题,可能需要 del 方法来关闭端口 祝你好运
答案 1 :(得分:1)
更新-2020年5月:所以6年后,我遇到了同样的问题。
在撰写本文时,最新版本为 PyVisa 1.10.1
。
注意这一点很重要,因为PyVisa 1.5
带来了一些突破
语法变化。尽管如此,一般形式仍然非常相似。
对于串行通信,发送正确的终止符至关重要 在每个命令的末尾。预期的终止字符(或字符序列)为 通常由设备制造商指定。
最常见的终止符是:
\r
或CR
:回车\n
或LF
:换行符\r\n
或CRLF
:以上两个序列 PyVisa库对于不同子类(例如SerialInstrument
)使用的默认termchar有点模糊。如果您可以写工具但不能读它,则可能是您定义的read_termination
字符不正确。
以下是设置仪器的示例,其终止符为\r
。
import pyvisa
rm = pyvisa.ResourceManager()
device = rm.open_resource('ASRL3::INSTR', baud_rate = 57600) # same as COM3 on Window$
device.write_termination = '\r'
device.read_termination = '\r'
上面的内容也可以写成一行:
device = rm.open_resource('ASRL3::INSTR', baud_rate = 57600,
write_termination = '\r',
read_termination = '\r')
如果出现非对称通信问题(即您可以写入但无法读取),则终止符可能根本不正确,但与主机PyVisa相比,设备更容易受到问题的影响。这是我最近遇到的一个导致很多头部抓挠的问题:
# I set up my instrument like so:
device = rm.open_resource('COM3', baud_rate = 57600, write_termination = '\r\n', read_termination = '\r\n')
# '@021FF0' is just a command to set the outputs of my device
device.query('@021FF0') #< threw a time-out error
device.write('@021FF0') #< worked fine I could see the change in output,
device.read() #< but trying to read back the response from the device
#< gave me a time-out error once again.
最后,事实证明,预期的term-char只是一个\r
。但是,尽管我的仪器足够灵活(或笨拙,取决于角度)以简单地丢弃\n
中多余的\r\n
,但PyVisa坚持严格执行\r\n
的整个序列以终止,这当然是它从未收到的,因为它不是乐器提供的。
设置read_termination = write_termination = '\r'
解决了这个问题。