我是靠谱客的博主 热心八宝粥,最近开发中收集的这篇文章主要介绍在485接口上实现SDI-12协议,你调通了吗?,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

前一段时间调试了一个雷达水位计,输出接口有RS485和SDI-12,协议没有modbus,只有SDI-12.因为我们的设备只有RS485接口,所以只能选择使用485连接。

SDI-12的软件协议也比较简单,写完以后与雷达水位计联调却发现始终不通。纠结一番后,查阅了水位计厂家的资料,最后问题终于解决。

期间我也在网上查询过,发现很多网友也有同样的问题,协议没问题,串口设置也没有问题,但是就是不通,为了避免更多的人再掉到这个坑里,现将我的经验分享给大家。

首先简单介绍下SDI-12协议。这个协议不同于RS232 RS485这些硬件层面的协议,SDI-12是一个包含了硬件和软件两方面的协议,国外应用的比较多,主要应用于各种传感器。对于SDI-12的软件层面协议我们不做过多介绍,常用指令的比较简单,大部分工程师实现这个指令采集毫无压力。而硬件侧面,SDI12为3线制接口,也可使用RS485接口,波特率固定为1200,数据位为7.高电平表示0,低电平表示1.

下面我们看一下SDI-12的时序图

有没有发现最开始有个break(中断),至少持续12ms。这个其实就是大部分人无法调通的关键。

我们再看一下哈希公司的一个文档:

 这个文档描述了使用电脑接485再接串口控制器在接水位计的工作流程。

主意看串口控制器的三种模式,其中有一种IO模式。再看通信过程说明,起始信号的发出,先是把串口控制器切换为IO模式,然后输出电平保持12ms。是不是有点眼熟,没错,这个就是break(中断)信号。

大部分工程师调不通,就是没有正确发出这个中断信号。

我们一般使用的设备都是单片机+485芯片的方式,软件使用串口通信。每次只能完整的发出一个字节的数据,所以无法产生一个完整的中断信号。

那么,如何解决呢?

也简单,通信之前把串口的IO先改为普通IO状态,把TX引脚输出低电平,保持12ms,然后拉高即可。(注意TTL电平和SDI12电平逻辑相反。)后面的事情就简单了,大家都能搞定。

需要注意的是,使用单片机可以这样操作,但是使用电脑串口+485转换器就不行了(理论上你要有能力修改串口驱动应该也行),使用电脑的话还是买个SDI12的转换器吧。

还有一点,细心的同学可能已经发现了,上图里的485是交叉连接的。为什么呢?不要怀疑图纸,它没有画错。因为TTL和SDI12的电平逻辑是相反的。(但是好像也不是所有厂家的SDI12设备用485连接的时候都要交叉连接,我遇到过正常485连接方式就可以的,我估计是设备内部可能已经集成了反相电路。这个大家就根据实际情况来判断吧。)

最后

以上就是热心八宝粥为你收集整理的在485接口上实现SDI-12协议,你调通了吗?的全部内容,希望文章能够帮你解决在485接口上实现SDI-12协议,你调通了吗?所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(54)

评论列表共有 0 条评论

立即
投稿
返回
顶部