可以写入rs232串口乐器,但无法从中读取

时间:2014-04-03 16:25:20

标签: python

我有一个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

2 个答案:

答案 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带来了一些突破 语法变化。尽管如此,一般形式仍然非常相似。


对于串行通信,发送正确的终止符至关重要 在每个命令的末尾。预期的终止字符(或字符序列)为 通常由设备制造商指定。

最常见的终止符是:

  • \rCR:回车
  • \nLF:换行符
  • \r\nCRLF:以上两个序列

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'解决了这个问题。