2016-02-11 61 views
1

我正嘗試使用PySerial模塊與Omega CNi16D溫度控制器進行通信。使用製造商提供的基本通信軟件,我能夠將一些設置寫入控制器,這確保了我正確地完成了硬件配置和設置。但是,當我嘗試使用PySerial在Python 3.4中執行此操作時遇到了問題。我的懷疑是我沒有以適當的形式發送字節碼。這裏是我的嘗試:使用PySerial進行通信時,設備無法識別命令或響應

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,但沒有用命令發生。 *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第5部分),聽起來我可以用指定格式的ASCII碼發送,以使其工作。

+0

我很困惑,'ascii'不需要字節數組。你的行結束分隔符在哪裏?(例如:回車符表示'\ r \ n')如果在'ascii/no modbus'模式下使用設備,不要使用字節模式。 – dsgdfg

+0

我認爲PySerial的'write()'方法需要一個字節對象作爲輸入。 PySerial中是否有其他模式/方法? –

回答

0

在考慮了「dsgdfg」的評論後,我想出了問題。這是一件非常簡單的事情。我錯過了兩件事。

首先,我應該在命令後附加回車符。我以某種方式假定這將在write()方法中實施,但我錯了。其次,事實證明,爲了獲得控制器的響應,我需要允許設備消化和響應大約0.1秒。換句話說,請求read()命令之前的time.sleep(0.1)

感謝您的有用評論!由於我懷疑是錯誤的,我想我應該改變帖子的標題。