16C550控制器调试、RS485(半)全双工实现

我们经常使用RS485的半双工方式,但是真实的情况是RS485、RS422、RS232都是可以实现全双工的。
在实际使用过程中我们一直是把RS485设计成半双工使用。其实RS485类似RS422,只不过在个别参数上比RS422更加灵活,也就是说RS485可以兼容RS422,但反过来就不一定了。RS485如果接成四线就是全双工,如果把输入和输出并接,并且只接两条线那么就是半双工的了。因为实际使用半双工的比较多。另外好多芯片内部就把输入和输出并接了。

RS232,RS422,RS485是电气标准,规定信号的逻辑高和逻辑低是如何表示的;
RS232:全双工,最少3条通信线(RX,TX,GND);

RS422:全双工,在RS232之后推出,使用TLL差动电平表示逻辑,就是用两根信号的电压差表示逻辑高和逻辑低,最少要4根通信线(一般要还要多拉一根地线);一个驱动器可以驱动(最多)10个接收器,通讯距离与通讯速率有关系,一般距离短时可以使用高速率进行通信,速率低时可以进行较远距离通信,一般可达数百上千米。
RS485:全双工/半双工,在RS422之后推出,绝大部分继承了422,主要的差别是RS485可以是半双工的,而且一个驱动器的驱动能力至少可以驱动32个接收器,当使用阻抗更高的接收器时可以驱动更多的接收器。所以现在大多数全双工485驱动/接收器对都是标:RS422/48;因为全双工RS485的驱动/接收器一定可以用在RS422网络。

为什么RS485很少用全双工方式呢?主要是哪种方式更有优势的问题,使用全双工要多一倍左右的导线,而相对芯片而言传输导线的成本要高很多(当两点距离数十数百米时);另一方面,全双工通信最有效的模式是一主多从,除非是2个节点,否则要接成对等网是不可能的;而半双工模式就可以,只要使用合适的协议,网络上一个节点可以呼叫任意其他一节点,同时,全双工模式在网络上也要用协议实现,通讯速率优势也不大,甚至半双工可以使用MCU的多机通讯模式来简化寻址,协议也复杂不了多少,所以半双工485比全双工485流行。不过全双工485也不是一无是处,当你的网络是一主多从模式(例如使用机房的PC做设备监控时),从机部署又比较密集,并且节点数量成百上千,你就要考虑使用中继把网络按某种规划分开,这时的全双工485网络很容易中继;而半双工485的中继就比较麻烦,往往需要使用MCU做转换,否则联一个大网是不现实的。

MAX485只是一种实现RS485半双工工作模式的芯片,而RS485是一种串口通信标准,另外还有可以实现RS485全双工工作模式的芯片。MAX485并不是RS485的全部,可以说大多数人接触RS485时都被 MAX485给蒙骗了。切记:不是理论上RS485可以做到全双工,而是RS485本来就有全双工和半双工2种工作模式,RS485向下完全兼容RS422,但两者亦有区别。很多人看了MAX485手册只实现了半双工的功能就认为RS485通信是半双工的,MAX1482可以实现RS485全双工,电路如下图,相信读者现在已经很透彻了:

                            RS485全双工 - 忧郁的佐罗 - 十号公寓

http://blog.163.com/hardware_engineer/blog/static/25836606620172711153655/

亦可采用SN65HVD3083E芯片,可查看其datesheet,

sylixos 16c550串口驱动实现总结:

 

调试过程总结:
1、修改GPIO口64 为 63
2、串口数量修改到12
3、加了send_end 之前的延时100微秒()

4、read还没结束,write就开始了。(在write之前加read完成的判断。具体是进接收中断后进行计数
usleep一段时间再判断计数是否更新)(485发送是在Txstartup中进行的,但第一次发送是触发了发送中断,拉高拉低引脚滞后于第一次发送数据)
5、定时20ms发送,长时间测试误码率大概5/1000:
    设置读超时时间
    正常:(FIFO填到8字节会触发trigger中断,数据送到系统buffer,再转给app(8字节的传输大概要0.7ms(1/(115200/10)*8)),
            即触发一次中断的时间间隔是0.7ms)
    如果最后的传输没满8字节,就不会触发trigger中断,过会儿触发接收超时中断,数据送到系统buffer,再转给app)

下图是app没有将收到的数据组成一整包,导致发也是分包发送:

下图是有其他高优先级任务打断485 发送的情况:

 

6、1200、2400、4800低波特率情况下,485串口通信出现无规律乱码:

解决方法:采用第二种判空方式。

 采用以上方法之后发现,send_end前面的延时也不需要了。

原因:看LSR(line state register)寄存器描述即可知晓。

还有TX FIFO register、RX FIFO register的描述:

再补充一个串口常见丢数据问题的原因:

串口几种常见丢失数据的问题

  • 13
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值