打印

STM32遇到串口RS485双机通信

[复制链接]
1308|13
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
沙发
wangjiahao88|  楼主 | 2017-12-21 14:02 | 只看该作者
485和232都是基于串口的通讯接口,在数据的收发操作上都是一致的。但是他两的通讯模式却大不相同~!232是全双工(例:A->B的同时B->A,瞬时同步)工作模式,而485是半双工(发时不能收,收时不能发)工作模式。在232通信中,主机在发送数据的同时可以收到从机发过来的数据;但在485通信中,收发要经过模式位的切换来进行,譬如,发送数据时,会把模式为置‘1’,表示为发送模式,此时不能接收;当接收数据时,会把模式位置‘0’,表示为接收模式,此时不能发送。

使用特权

评论回复
板凳
wangjiahao88|  楼主 | 2017-12-21 14:02 | 只看该作者
在讲STM32串口实现485双机通信的原理之前,先来复习一下串口中的中断知识点:

串口的中断类型有很多种。这里主要讲两种:接收到数据中断和发送数据完成中断。这两个中断跟两个标志位有密切关系:RXNE(读数据寄存器非空)和TC(发送完成)。譬如在接收到数据的时候(RXNE,读数据寄存器非空),我们要产生中断。在发送数据结束的时候(TC,发送完成)要产生中断。这两种中断的产生方法都是在开启串口中断函数(USART_ITConfig();)中配置。并在获取中断状态函数(USART_ITStatus();)中判断是发送中断还是接受中断。

使用特权

评论回复
地板
wangjiahao88|  楼主 | 2017-12-21 14:03 | 只看该作者
注意:1、有人问当产生接收中断时,没看到程序中清除中断标志啊,那不就一直中断下去了吗?这里官方规定有两种方法清除中断标志(书里面也有):1、尽快读取USART_DR(数据寄存器),通过读USART_DR可以将该位清零;2、可以直接向该位写‘0’,直接清零。

使用特权

评论回复
5
wangjiahao88|  楼主 | 2017-12-21 14:03 | 只看该作者
两块板子的串口波特率一定要相同,否则将得不到想要的数据。

使用特权

评论回复
6
wangjiahao88|  楼主 | 2017-12-21 14:04 | 只看该作者
STM32串口实现485双机通信的原理(库函数):
1、在主函数中,扫描按键。一旦key0按下,首先将5个字节的数据存入rs485buf[]数组中,然后调用RS485_Send_Data(rs485buf,5);函数将5个字节的数据发送到串口。

使用特权

评论回复
7
wangjiahao88|  楼主 | 2017-12-21 14:04 | 只看该作者
程序截图如下

11.png (50.11 KB )

11.png

使用特权

评论回复
8
wangjiahao88|  楼主 | 2017-12-21 14:05 | 只看该作者
2、进入RS485_Send_Data();函数中,先通过标志位将485设置为发送模式(RS485_TX_EN=1),然后循环5次,将这5个字节数据,通过库函数:USART_Send_Data();发送到USART_DR寄存器(自动发送),最后通过标志位将485设置为接收模式(RS485_TX_EN=0)。

使用特权

评论回复
9
wangjiahao88|  楼主 | 2017-12-21 14:06 | 只看该作者
程序框图

12.png (74.32 KB )

12.png

使用特权

评论回复
10
wangjiahao88|  楼主 | 2017-12-21 14:06 | 只看该作者
前两个是发送。现在是接收了。主函数中通过RS485_Receive_Data();不停的接收。

4、进入RS485_Receive_Data();函数中,

如果一直没有按按键,则不会发送数据,也就不会产生接收中断,也就不会往我们定义的接收缓冲区(RS485_RX_BUF[64])里写数据。RS485_RX_CNT计数器的值也就是‘0’,对应在RS485_Receive_Data();函数中就不会进入里面的if语句(下图中红框)

使用特权

评论回复
11
wangjiahao88|  楼主 | 2017-12-21 14:07 | 只看该作者
截图如下

13.png (92.46 KB )

13.png

使用特权

评论回复
12
wangjiahao88|  楼主 | 2017-12-21 14:07 | 只看该作者
如果按键按下了,就会发送数据,就会产生接收中断,就会往我们定义的接收缓冲区(RS485_RX_BUF[64])里写数据,RS485_RX_CNT计数器的值也就开始自增,对应在RS485_Receive_Data();函数中就会进入里面的if语句,从之前定义的接收缓冲区(RS485_RX_BUF[64])里面取数据。

5、最后就将取出来的数据(接收到的数据)显示出来。

14.png (87.39 KB )

14.png

使用特权

评论回复
13
LM莫| | 2017-12-22 07:22 | 只看该作者
485的本质还是串口,没什么区别的。

使用特权

评论回复
14
萧洛毫| | 2017-12-29 17:13 | 只看该作者
如果使用全双工模式的485芯片的话,直接接上就好了。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

474

主题

7520

帖子

30

粉丝