我正在尝试使用PySerial模块与Omega CNi16D温度控制器进行通信。使用制造商提供的基本通信软件,我能够向控制器写入一些设置,这可以确保我正确地完成了硬件配置和设置。但是,当我尝试使用PySerial在Python 3.4中执行此操作时遇到问题。我怀疑是我没有以适当的形式发送字节代码。这是我试过的:
import serial
ser = serial.Serial('COM3', 9600, bytesize = 7, stopbits=1, timeout=0.1,\
parity=serial.PARITY_ODD) #these are the settings on my controller
print(ser.isOpen())
ser.write(b'*01W01A003E8')
我从isOpen()
获得了真正的回报,但该命令没有任何反应。 *01W01A003E8
是手册中给出的示例命令之一,其中*
是识别字符,01
是我在控制器端设置的从属地址(我使用的是RS485), W01A003E8
是一个十六进制ASCII命令,用于将设定值设置为-100。
以下是我试过的其他一些没有成功的事情:
试过在ser.write()
之前给一些睡眠时间;尝试了应该从控制器返回读取值的不同命令,但是在任何命令返回ser.read()
后,我总是得到一个空字节对象(b''
。);尝试切换到RS232模式,该模式在命令中不需要从地址;尝试ser.write('*01W01A003E8'.encode('ascii'))
以及'utf-8'
。
我感觉我正在向控制器发送错误的字节对象。在手册(http://www.omega.com/Manuals/manualpdf/M3397.pdf
part.5)中,听起来我只能以指定格式发送ASCII代码才能使其正常工作。
答案 0 :(得分:0)
在考虑来自" dsgdfg的评论后,"我解决了这个问题。这是一件非常简单的事情。我错过了两件事。
首先,我应该在命令上附加回车符。我以某种方式假设这将在write()
方法中实现,但我错了。
其次,事实证明,为了从控制器获得响应,我需要允许设备消化和响应约0.1秒。换句话说,在time.sleep(0.1)
命令被请求之前read()
。
感谢您提供有用的评论!由于我怀疑是错误的,我想我应该改变帖子的标题。