Python 使用PySerial与SDI-12探头通信

Python 使用PySerial与SDI-12探头通信,python,pyserial,sdi-12,Python,Pyserial,Sdi 12,背景: 我正试图编写一个脚本,将命令发送到土壤湿度探测器(史蒂文斯的Hydra II土壤和盐分探测器),以便将其输出与GPS结合到QGIS中,以记录特定地理编码点的土壤湿度 设置: 我使用的是Windows 8,通过USB端口COM6和USB到SDI-12适配器(Stevens的SDI-12资源管理器)连接到探头。我正在使用Python 2.7.6 测试: 我使用了SDI-12 Explorer Proprity界面,可以查看和测量探头。我安装了一个端口监视器,以查看我编写的PySerial脚本

背景: 我正试图编写一个脚本,将命令发送到土壤湿度探测器(史蒂文斯的Hydra II土壤和盐分探测器),以便将其输出与GPS结合到QGIS中,以记录特定地理编码点的土壤湿度

设置: 我使用的是Windows 8,通过USB端口COM6和USB到SDI-12适配器(Stevens的SDI-12资源管理器)连接到探头。我正在使用Python 2.7.6

测试: 我使用了SDI-12 Explorer Proprity界面,可以查看和测量探头。我安装了一个端口监视器,以查看我编写的PySerial脚本和SDI-12 Explorer接口的端口流量,并且COM端口的打开方式存在差异。(下面的格式类似于python,但只是COM端口流量)


谢谢

我现在正在研制一种具有不同工作结构的车辆跟踪装置。但您发送的手册在附录A中有通信协议定义,从第53页开始。如果你读得好的话,你可能会找到答案。设置正确的波特率怎么样?当您的脚本配置1200 bps时,SDI-12浏览器似乎使用9600 bps。SDI-12是1200波特(但我认为它是一个反向信号)。。。然而,我怀疑转换器只是作为一个串行端口枚举,用于传输9600。。。。凭猜测顺便说一句,我写了一个arduino库,让您可以使用arduino来完成此操作。。。
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
# 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()