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.stevenswater.com/catalog/Assets/products/soil_sensors/manual/Hydra%20Probe%20Manual%2092915%20Jan%202015.pdf

协议(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