簡體   English   中英

通過 USB 串行 python 庫與數字百分表通信失敗

[英]Failing to communicate with digital dial indicator via USB serial python library

I have this digital dial indicator: Helios-Preisser Digimet 1722-502". It comes with a capacity to output its reading over a USB serial cable. The USB cable is a special 4 pin connector on the end that plugs into the calipers and a另一端正常 USB。

雖然該設備帶有特殊軟件,但我正在嘗試編寫一個基本的 python 庫來與它通信。 下面是解釋數據通信協議的手冊片段

我正在使用 python 串行庫並設法進行一些通信。 這是我到目前為止所擁有的

import serial
ser = serial.Serial(port ='/dev/tty.usbserial-MA4LOCLF', baudrate=4800,parity=serial.PARITY_EVEN,  bytesize=serial.SEVENBITS,stopbits=serial.STOPBITS_TWO, dsrdtr=True, xonxoff=True)
# press the small red button on the cable. This generates a data entry
In [77]: ser.inWaiting()
Out[77]: 8
In [78]: ser.read(8)
Out[78]: '+000.00\r'

因此,這在使用模式時非常有用,通過按下插入百分表的電纜上的紅色小按鈕來請求數據

但是,還有另一種模式可以請求數據輸入。 這是手冊中描述為“通過外圍設備請求進行數據傳輸”的模式,其中必須將 DataRequest 引腳脈沖為低電平 T1(100ms<T1<1000ms)。 我幾乎隨機嘗試了所有可能的組合,我認為可以使此數據請求正常工作,但無濟於事。 使用串行庫中的寫入 function 的所有嘗試均無效

In [79]: ser.write('0\r')
Out[79]: 2

In [80]: ser.inWaiting()
Out[80]: 0

我有點沒有想法。 知道這種模式有效,因為當您下載(僅在 Windows 中)設備隨附的軟件時,您可以發送該請求。 所以必須有一種方法可以使用 python 串行庫來模擬這個請求,但我被卡住了,我什至不知道如何繼續。 任何幫助,將不勝感激。 謝謝

pyserial 支持(或者應該,但最終取決於驅動程序而不是 pyserial 本身)一個 function 來更改端口控制線的 state。

你需要做這樣的事情:

ser.setDTR(False)
time.sleep(0.5)
ser.setDTR(True)

如果您在獲得所需值后立即從端口讀取數據。

為了使時間或多或少正確,您應該將代碼作為腳本而不是逐行運行。

好的,經過多次“搞砸”之后,我能夠調試這個問題並找到解決方案,但它肯定不是一個線性過程。 我應該指出,由於 Marcos G. 的建議,我走上了正確的道路,他指出您確實可以直接使用 pyserial 控制 dtr 行。

這是答案。 在對 web 進行了更多搜索之后,我發現了這個鏈接,它提供了關於如何在 mac 上對串行連接進行故障排除的建議。 這個 Coolterm 軟件非常有用。

我下載了它,它允許您在與設備實時通信時監控各種 RTS 和 DTS(和其他)線路的 state。 超級好用!

這向我表明:

  • 通過按下紅色按鈕從設備“發送”讀數時,DTR 線為 True,而 RTS 線無關緊要。 這確實是文檔中顯示的內容。
  • 為了從設備“請求”讀數,DTR 線需要為 False,RTS 線需要以精確的時序從 False 脈沖到 True 再返回 False。 這有效並且確實在 USB 線上產生了讀取等待。

這是下面的代碼

import time
import serial

ser = serial.Serial(port ='/dev/tty.usbserial-MA4LOCLF', baudrate=4800,parity=serial.PARITY_EVEN,  bytesize=serial.SEVENBITS,stopbits=serial.STOPBITS_TWO, dsrdtr=True)

ser.dtr=False
ser.rts=False
# request one reading every second
while(1):
    ser.rts=True
    time.sleep(0.1)
    ser.rts=False
    time.sleep(0.1)
    print ser.read(ser.inWaiting())
    time.sleep(1)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM