背景: コマンドを土壌水分プローブ (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()
ありがとう!