RS485与RS232的区别:

  •     RS232是全双工通信的,在数据进行发送的时候,也可以进行接收数据,只是你可能你会觉得不清楚,比如在应用程序,你去操作串口写的同时,你并没有感觉到能读到串口的数据,因为CPU如果是单核的,CPU只有一个大脑,只有一个人在进行工作,所以你会感觉到你去操作串口写的时候,你读取不到串口来的数据,因为指令是一条一条运行的,只有一个人在工作。但是RS232又是全双工的,在数据发的时候,是可以接收数据的,这一点可以体现在硬件上,如果你在应用程序中感觉不出来的话,在应用程序中你去操作串口进行发数据,同时这个时刻对方也像你进行发数据了,你虽然在同一时刻在应用程序中读取不到这个数据,但是在硬件中,对方发来的数据已经被读取到了硬件的串口的读缓存区中。当应用程序串口发操作结束后,去读取串口数据的时候,就会从硬件串口的缓存区中将你发的同时对方发过来的数据,与对方后续发过来的数据,读取到。这就是RS232.全双工的体现,在应用程序中与硬件中的体现。


  •     RS485是半双工通信的,在数据进行发送的时候,是读取不了数据的,在数据进行读数据的时候,是发送不了数据的,这一点体现在软件上,就是当你发送数据的时候,在你发送数据之前要将表示RS485能发数据的那个引脚给拉高或拉低,来切换状态到发数据状态,因为RS485是半双工,所以读状态和发状态要分清,所以有了表示RS485发送与接收状态的引脚,用拉高或拉低表示。当你发送数据之前,给这个引脚拉高或拉低,然后你调用写函数去进行将数据发串口,掉用完这个函数后,你要记得去延时一段时间后,在去将引脚拉高或拉低来切换成RS485读状态,因为如果你的数据还没有全部通过串口发送完毕,你就在硬件的写缓存区中,数据还在发送呢,但是在应用程序中,你的写函数已经返回了,但你却将RS485引脚切换成读状态了,这时在硬件层,发现485为读状态,就会切换成485读模式,而你的数据在硬件缓存区中即使没有发送完毕也发送不了了,因为硬件上已经给堵住了这条路。所以当你调用完串口写函数时,一定要延时一段时间后在去将引脚拉高或拉低来切换到485读状态,这个延时的时间,是根据你要发送多少数据,也就是数据的长度和串口的波特率与这个数据在介质中传输的时候是否包含校验位与停止位,因为如果包含了停止位于校验位,你的数据长度要将上这两位,因为你在发送的时候发送的只是数据区,长度是你发送的数据区的长度,但是在介质中传输的时候,还有可能有其他位的存在,你要考虑进去。之后根据发送的实际长度与当前串口的波特率,来算出这个要延时的时间。再每次调用完写串口函数后都要去延时这个时间后,在去将引脚拉高或拉低来切换到读状态。防止数据没有发送,你就不让他发送了,同时这个延时的时间也不能随意的给长,因为可能你在延时了那么长时间的间隔中,对方已经将数据发送给你了,但是你还是为发状态,并读不了他此时给你发过来的数据,这也就是为什么,这个延时的时间要拿发送的实际数据包括是否考虑停止位校验位,与波特率去进行计算的缘由了。


  • 总之:在工程上,如果一个串口,是RS232/RS485共用的话,你在程序上要按照RS485的方式去进行操作,因为RS485的程序跑在RS232上市没有问题的,但是RS232的方式操作串口的程序,用在RS485的情况下是不合适的。