我正在尝试与SDI-12设备进行串行通信,它需要反转七个数据位,偶校验和一个停止位(7E1)串行,1200波特 .
从数据表:
SDI-12通信以每秒1200位的速率发送字符 . 每个字符有1个起始位,7个数据位(LSB优先),1个偶校验位和1个停止位(低电平有效或反向逻辑电平):所有SDI-12命令和响应必须符合数据线上的以下格式 . 命令和响应都以地址开头,并由回车换行组合终止 .
这可能与Serial或SoftwareSerial库有关吗?我试图避免额外的硬件(超过一个转换器到3.3 V),但如果这是唯一的方法,我会这样做 .
我已经看到SoftwareSerial可以做倒置,而Serial可以做7E1,但我找不到两者是否可以做到 .
我可以访问Arduino Mega(R2)和Arduino Uno(R3) .
这是我想要与之通信的设备:http://www.decagon.com/products/sensors/soil-moisture-sensors/gs3-soil-moisture-temperature-and-ec/这里,http://www.decagon.com/assets/Uploads/GS3-Integrators-Guide.pdf是解释协议的文档 . 第6页讨论了SDI的实现 .
2 回答
我不熟悉Arduino,但SDI-12物理层与标准TTL电平相反 - 可能有两个原因:
由于空闲电压为0V,因此可降低待机功耗(由于典型SDI-12传感器中的标称下拉电阻) .
使用标准RS-232串口简化总线'sniffing' .
没有位冲击5V IO引脚 - 是的,如果使用标准微控制器UART,您将需要一个外部反相器(或2)和一个3态缓冲器 . 可能需要电平转换,具体取决于您的硬件 .
大拇指向维基百科条目 - SDI-12使用完全标准的UART位时序(非常像RS-232),只是不同的信号电平(0 - 5V);见第2点 . 但是,存在特定的中断序列和严格的时序要求,这使得固件开发更加困难 .
如果您认真对待SDI-12固件开发,您可能需要投资SDI-12 Verifier . 对specification的彻底研究至关重要 .
有点晚了......但迟到总比没有好
我实际上只是编写了一个库(实际上恰好包括传感器...所以它应该与包含的例子完全一致)
https://github.com/joranbeasley/SDISerial(Arduino图书馆)