使用 PySerial 进行通信时,设备将无法识别命令或响应
Device will not recognize commands or respond when communicating using PySerial
我正在尝试使用 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()
得到一个 True return,但是命令没有任何反应。 *01W01A003E8
是手册中给出的示例命令之一,其中*
是识别字符,01
是我在控制器端设置的从机地址(我使用的是RS485), W01A003E8
是十六进制 ASCII 命令,用于将设定点设置为 -100。
以下是我尝试过但没有成功的其他一些方法:
尝试在 ser.write()
之前给一些睡眠时间;尝试了不同的命令,这些命令应该 return 从控制器读取值,但我总是得到一个空字节对象(ser.read()
在任何命令 returns b''
之后);尝试切换到 RS232 模式,该模式不需要命令中的从属地址;尝试了 ser.write('*01W01A003E8'.encode('ascii'))
以及 'utf-8'
.
我感觉我向控制器发送了错误的字节对象。在手册(http://www.omega.com/Manuals/manualpdf/M3397.pdf
part.5)中,听起来我可以只发送指定格式的 ASCII 码来完成这项工作。
在考虑 "dsgdfg," 的评论后,我发现了问题所在。这是一件非常简单的事情。我错过了两件事。
首先,我应该在命令中附加回车符 return。我以某种方式假设这将在 write()
方法中实现,但我错了。
其次,事实证明,为了从控制器获得响应,我需要让设备有大约 0.1 秒的时间来消化和响应。换句话说,在 read()
命令之前 time.sleep(0.1)
是必需的。
感谢有用的评论!由于我怀疑是错误的,所以我认为我应该更改 post.
的标题
我正在尝试使用 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()
得到一个 True return,但是命令没有任何反应。 *01W01A003E8
是手册中给出的示例命令之一,其中*
是识别字符,01
是我在控制器端设置的从机地址(我使用的是RS485), W01A003E8
是十六进制 ASCII 命令,用于将设定点设置为 -100。
以下是我尝试过但没有成功的其他一些方法:
尝试在 ser.write()
之前给一些睡眠时间;尝试了不同的命令,这些命令应该 return 从控制器读取值,但我总是得到一个空字节对象(ser.read()
在任何命令 returns b''
之后);尝试切换到 RS232 模式,该模式不需要命令中的从属地址;尝试了 ser.write('*01W01A003E8'.encode('ascii'))
以及 'utf-8'
.
我感觉我向控制器发送了错误的字节对象。在手册(http://www.omega.com/Manuals/manualpdf/M3397.pdf
part.5)中,听起来我可以只发送指定格式的 ASCII 码来完成这项工作。
在考虑 "dsgdfg," 的评论后,我发现了问题所在。这是一件非常简单的事情。我错过了两件事。
首先,我应该在命令中附加回车符 return。我以某种方式假设这将在 write()
方法中实现,但我错了。
其次,事实证明,为了从控制器获得响应,我需要让设备有大约 0.1 秒的时间来消化和响应。换句话说,在 read()
命令之前 time.sleep(0.1)
是必需的。
感谢有用的评论!由于我怀疑是错误的,所以我认为我应该更改 post.
的标题