0

背景: コマンドを土壌水分プローブ (Stevens 'Hydra II Soil and Salinity probe') に送信するスクリプトを作成しようとしています。これにより、その出力を GPS で QGIS に組み込み、特定のジオコード ポイントで土壌水分を記録できます。

セットアップ: Windows 8 を使用しており、USB 経由でポート COM6 を介して、USB から SDI-12 へのアダプター (Stevens 'SDI-12 Explorer') を介してプローブに接続されています。Python 2.7.6 を使用しています。

テスト: 私は SDI-12 Explorer 独自のインターフェイスを使用しており、プローブから測定値を表示および実行できます。ポート モニターをインストールして、作成した PySerial スクリプトと SDI-12 Explorer インターフェイスの両方からのポート トラフィックを確認しましたが、COM ポートを開く方法に違いがあります。(以下は Python のようにフォーマットされていますが、COM ポートのトラフィックのみです)。

SDI-12 Explorer
COM is open
<20150605101018.855 SYS>
Baud rate 9600
<20150605101018.855 SYS>
RTS on
<20150605101018.855 SYS>
DTR off
<20150605101018.855 SYS>
Data bits=8, Stop bits=1, Parity=None
<20150605101018.855 SYS>
Set chars: Eof=0x1A, Error=0x00, Break=0x00, Event=0x1A, Xon=0x11, Xoff=0x13
<20150605101018.855 SYS>
Handflow: ControlHandShake=(), FlowReplace=(TRANSMIT_TOGGLE, RTS_CONTROL), XonLimit=1024, XoffLimit=1024


PySerial
COM is open
<20150605150222.045 SYS>
In/out queue size 4096/4096
<20150605150222.045 SYS>
Set timeouts: ReadInterval=0, ReadTotalTimeoutMultiplier=0, ReadTotalTimeoutConstant=0, WriteTotalTimeoutMultiplier=0, WriteTotalTimeoutConstant=0
<20150605150222.045 SYS>
Baud rate 1200
<20150605150222.045 SYS>
RTS on
<20150605150222.045 SYS>
DTR on
<20150605150222.045 SYS>
Data bits=8, Stop bits=1, Parity=None
<20150605150222.045 SYS>
Set chars: Eof=0x00, Error=0x00, Break=0x00, Event=0x00, Xon=0x11, Xoff=0x13
<20150605150222.045 SYS>
Handflow: ControlHandShake=(DTR_CONTROL), FlowReplace=(TRANSMIT_TOGGLE, RTS_CONTROL), XonLimit=2048, XoffLimit=512
<20150605150222.045 SYS>
Purge the serial port: RXABORT, RXCLEAR, TXABORT, TXCLEAR

これらのプローブのいずれかが手元にない限り、これを正確に再現することはできませんが、スクリプトは SDI-12 プロトコルを使用する任意の機器と通信できるはずです。

質問: 1. このスクリプトを動作させる方法を知っている人はいますか? 2. 「DTR_CONTROL」をオフにする、または Xon Xoff 制限を変更するにはどうすればよいですか? これらは、com ポートを開くヘッダーの主な違いのようです。3. SDI-12 デバイスとの通信に必要な正しいタイミング シーケンスを知っている人はいますか?

プローブのコマンドのドキュメントは次のとおりです

プロトコル ( http://www.sdi-12.org/specification.php?fileID=1 )

Pyserial スクリプト # ライブラリのインポート シリアル インポート時間

# Serial port setup
ser = serial.Serial('COM6',
                    baudrate=1200,
                    bytesize=serial.EIGHTBITS,
                    parity=serial.PARITY_NONE,
                    stopbits=serial.STOPBITS_ONE,
                    timeout=0,
                    writeTimeout=0,
                    rtscts=False,
                    xonxoff=1024)

# Check if port is open and print name
if ser.isOpen():
    print 'Open: ' + ser.portstr

# Send break to wake probe
ser.sendBreak(duration=0.012)
time.sleep(0.25)

# Command and readline 
ser.write('0I!')
time.sleep(0.25)
print 'Output: ' + ser.readline()

ありがとう!

4

0 に答える 0