在嵌入式软件行业中,串口通信是使用非常常见的一种通信手段,几乎每个嵌入式系统里面都有串口,对于嵌入式工程师来讲这也是必须掌握的一项技能,串口通信非常简单,但要把它做好做稳定,还是需要一定功力,很多时候不是你在串口助手里面试一两次数据收发正常就可以万事大吉了的,最近接手一个同事的项目,在他的基础上做开发,发现了不少问题,也使我对串口通信有了更深的认识,下面谈谈具体情况。
我所说的串口通信其实并不在物理层层面,因为无论是下位机还是上位机物理层基本都非常成熟可靠的接口,可以拿来就用。主要问题在于链路层方面,在链路层我们可能碰到很多不同的通信方式,比如RS232/RS485/RS422等,这似乎也太寻常了,可能每个做嵌入式的都用过,对于他们的区别也都知道,但要真正理解他们却并不容易,之前有一个项目一直是用RS232,由于模块不断增多,上位机端口也有限,后来改用了RS485总线,原本觉得好像差不多,软件上也不需要做多少改动,就基本套用了以前的操作模式,乍一看,貌似也能用,但随着后来的深入,一系列问题相继出现,要么就是数据不对、要么就是通信中断,总之就是不稳定,开始以为是硬件哪里出了问题,查找了半天,却依然如故,回想232通信时完全没有这些问题,觉得代码也肯定没问题,后来回顾了一下这两种通信的定义才恍然大悟,感觉还是自己经验不够,平时学得太浅,根本好好领悟其中的真谛!
RS232是一种全双工通信方式,收发都有各自的通道,互补干扰;但RS485是一种半双工通信方式,收发共用一个通信信道,这个时候就必须要做好管理,必须保证总线上任一时刻都只有一个节点在发送数据,这也就是RS485为什么是主从式通信,只能由一个主节点发起通信,其他一对一的应答主节点的数据,而不能擅自主动向总线发送数据,否则总线数据肯定会出现错乱。这在总线定义中就已经说得清清楚楚了,而我却视而不见,导致浪费不少时间。
把握住了各个总线的定义,再来看之前出现的那些问题,就都好解决了,之前是用的232,系统中各个模块有很多异步事件,比开关机按键,急停按键、外部触摸等,都是事件发生了再向上位机通报信息,现在改用485,就不能这么处理,必须实时查询,各个子节点不能主动上报。另外原来用232做的在线升级,也需要做改动,必须保证同一时刻只能有一个节点在发送数据。
RS485不同于CAN总线,没有总线冲突检测机制,把握住一个中心原则:半双工通信。