龙芯1B核心板RS485端口为什么只发不收,或者只收不发?共享软件解决方案

为什么龙芯1B核心板的RS485只发不收,或者只收不发?

当然,你的状态可能是只能收发不能发,不管是只发不收还是只收不发,在龙芯板子上的原因都可能是一样的。
通过龙芯1B核心板的底板原理图可以发现,底板上只连接了三根引脚,分别是Rx,Tx,RTS
首先你得了解RS-485的电气特性:

RS485 采用两根通信线,通常用 A 和 B 或者 D+和 D-来表示。逻辑“1”以两线之间的电压差为+(0.2~6)V
表示,逻辑“0”以两线间的电压差为-(0.2~6)V 来表示,是一种典型的差分通信

为什么会出现只发不收,或者只收不发的情况

当485的两针针脚为低位时,为接收状态,两针针脚为高位时,为发送状态。调整两针针脚为低位或者高位,一般情况下,可以通过硬件上的自动切换控制,这个应该在绝大部分设备上的RS485串口都带有,或者可以通过选择,选择控制方式,就是我们常见的CTS/RTS选项,说到这,你会突然发现,这个RTS似曾相识,没错,在上文中提到过,在龙芯的底板中也带有这个RTS开关,那这到底是个什么东西,有什么作用?下面我简单解释一下。
RTS(Require ToSend,发送请求):为输出信号,用于指示本设备准备好可以接受数据,低电平有效,低电平说明本设备可以接受数据。
CTS(Clear ToSend,发送允许):为输入信号,用于判断是否可以向对方发送数据,低电压有效,低电平说明可以向对方发送数据。
由上面的话可以这么理解,即通过CTS/RTS这两个的协同控制,你可以判断我能不能给对方发数据,或者判断告诉对方,我现在可不可以接收数据。因此,问题的根源就明白了。
只发不收:就是只判断了对方可以接受我的数据,也就是我能给对面发,但是没有把状态转换到可以接收对方数据的状态。
只收不发:就是现在的状态是可以接收对方的数据,但是状态没有转换到可以发送数据的状态。
而在485中,控制收发的就是这CTS和RTS两个信号,而龙芯的硬件中,只设置了RTS的引脚,没有设置CTS的引脚,因此龙芯的板件在硬件上是不支持通过硬件自动更改收发状态的。

解决方案

从上文中,读者就会发现,其实RS485的状态是接收还是发送,其实就是根据针脚的高低电压来决定的。因此,理论上,只有一个RTS的引脚,也是可以通过软件的方式来更改RS485的电压状态的。
在龙芯1B的软件开发中,本人使用的开发环境为ubuntu18.04,开发软件是QtCreator的4.0.1版本,编译器使用的是Qt4.8.6版本的linux-mipsel的编译器。每个人使用的串口打开方式不太一样,比较普遍的有两种方法,都支持修改RTS状态。
方法一qextserialbase.cppqextserialbase.h 以及posix_qextserialport.cppposix_qextserialport.h。这种方法在QT4中可以直接使用,但是使用相对繁琐。在此方法中,改变RTS的状态的函数是setRTS(bool);
方法二:使用QT5下面自带的QSerialPort,这种方法在QT4环境中使用需要将QSerialPort重新编译进QT4中,相对比较繁琐,但使用起来方便。在此方法中,改变RTS的状态的函数是setRequestToSend(bool)。
当RTS设置为true时,为高电平,为发送状态
当RTS设置为false时,为低电平,为接收状态
在你需要实现通过RS485串口采集数据功能的软件里,将RTS的状态,平时设置为false,即低电平,发送时更改为true,即高电平,发送完毕改完低电平。修改状态通过,在发送状态下,设置一个只进行一次倒计时的定时器,通过调整定时器时间,寻找收发的平衡(这只要在主动询问式的数据采集中需要用到)。

猜你喜欢

转载自blog.csdn.net/baidu_31788709/article/details/89223116