实验11:RS485通信
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOG,&GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_3; //RX-485
//串口输入
PA3
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING;
*函数名
: rs485_init
* 函数功能
: IO 端口及串口 2,时钟初始化函数
*输 入
:无
*输 出
:无
*********************************************************************
**********/
void rs485_init()
我们 STM32 开发板上采用 SP3485 作为收发器,该芯片支持 3.3V 供电,最大传输速度 可达 10Mbps,支持多达 32 个节点,并且有输出短路保护。该芯片的框图如图所示:
图中 A、 B 总线接口,用于连接 485 总线。 RO 是接收输出端, DI 是发送数据收入 端, RE 是接收使能信号(低电平有效), DE 是发送使能信号(高电平有效)。
//使能
NVIC_Init(&NVIC_InitStructure);
}
2) 中断函数
void USART2_IRQHandler(void) //485 通信中断函数
{
static u8 k;
USART_ClearFlag(USART2,USART_FLAG_TC);
if(USART_GetITStatus(USART2,USART_IT_RXNE)!=RESET)//检查指定的
//打开时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOG|RCC_APB2Periph_GPIOA| RCC_APB2Periph_AFIO,ENABLE); RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2,ENABLE);
//开启发送和接受模式
USART_Init(USART2, &USART_InitStructure); /* 初始化 USART2 */
USART_Cmd(USART2,ENABLE);
USART_ITConfig(USART2,USART_IT_RXNE,ENABLE); //使能或者失能指定
的 USART 中断 接收中断
果如下:
当程序下载进去后,打开串口,对 DTR 前进行勾选,然后在取消。再通过发送字符即 可以显示。
/* 配置 GPIO 的模式和 IO 口 */
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_2; //TX-485 //串口输出
PA2
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;
//复用推挽输出
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
***/
int main()
{
rs485_init(); //485 初始化
GPIO_ResetBits(GPIOG,GPIO_Pin_3);//首先要打开 485 接收数据的控制端
while(1);
}
开始的时候需要将控制使能端清零,表示 485 可以接收数据,等到接收完成后将控制端
置 1,打开发送使能,可以发送接收的数据,等到发送结束后再次清零,打开接收。通信结
置为 9600 //波特率
USART_ART_WordLength = USART_WordLength_8b; //
数据长 8 位
USART_ART_StopBits = USART_StopBits_1;
//1 位停止位
USART_ART_Parity = USART_Parity_No;
USART 中断发生与否
{
k=USART_ReceiveData(USART2);
GPIO_SetBits(GPIOG,GPIO_Pin_3);
delay_ms(1);
USART_SendData(USART2,k);
while(USART_GetFlagStatus(USART2,USART_FLAG_TXE)==RESET);
delay_ms(2);
GPIO_ResetBits(GPIOG,GPIO_Pin_3);
}
}
此函数将串口发送的数据通过单片机串口在发送到 PC 串口助手上进行显示。
3) 主函数
/*************************************************************************
1.1 485 简介
485(一般称作 RS485/EIA-485)是隶属于 OSI 模型物理层的电气特性规定为 2 线, 半双工,多点通信的标准。它的电气特性和 RS-232 大不一样。用缆线两端的电压差值来表 示传递信号。RS485 仅仅规定了接受端和发送端的电气特性。它没有规定或推荐任何数据协 议。
RS485 的特点包括: 1) 接口电平低,不易损坏芯片。RS485 的电气特性:逻辑“ 1”以两线间的电压差为
+(2~6)V 表示;逻辑“ 0”以两线间的电压差为-(2~6)V 表示。接口信号电平比 RS232 降低了,不易损坏接口电路的芯片,且该电平与 TTL 电平兼容,可方便与 TTL 电 路连接。 2) 传输速率高。 10 米时, RS485 的数据最高传输速率可达 35Mbps,在 1200m 时, 传输速度可达 100Kbps。 3) 抗干扰能力强。 RS485 接口是采用平衡驱动器和差分接收器的组合,抗共模干扰 能力增强,即抗噪声干扰性好。 4)传输距离远,支持节点多。RS485 总线最长可以传输 1200m 以上(速率≤100Kbps) 一般最大支持 32 个节点,如果使用特制的 485 芯片,可以达到 128 个或者 256 个节点,最大的可以支持到 400 个节点。 RS485 推荐使用在点对点网络中,线型,总线型,不能是星型,环型网络。理想情况下 RS485 需要 2 个匹配电阻,其阻值要求等于传输电缆的特性阻抗(一般为 120Ω )。没有特 性阻抗的话,当所有的设备都静止或者没有能量的时候就会产生噪声,而且线移需要双端的
实验 11 RS485 通信实验
本章我们将向大家介绍如何利用 STM32 的串口实现 485 通信(半双工)。 在本章中,我们将利用 STM32 的串口 2 来实现开发板与上位机之间的 485 通 信,通过在串口助手上输入字符发送到单片机上后在发送到串口助手上显示。本 章分为以下学习目标: 1、了解 485 通信。 2、学会 485 通信。
//无效
验
USART_ART_HardwareFlowControl
=USART_HardwareFlowControl_None; //失能硬件流
USART_ART_Mode = USART_Mode_Tx | USART_Mode_Rx;
***
Байду номын сангаас
* Function Name : main
* Description : Main program.
* Input
: None
* Output
: None
* Return
: None
*************************************************************************
电压差。没有接电阻的话,会使得较快速的发送端产生多个数据信号的边缘, 导致数据传 输出错。 485 推荐的连接方式如图所示:
在上面的连接中,如果需要添加匹配电阻,我们一般在总线的起止端加入,也就是主机 和设备 4 上面各加一个 120Ω 的匹配电阻。
由于 RS485 具有传输距离远、传输速度快、 支持节点多和抗干扰能力更强等特点, 所 以 RS485 有很广泛的应用。
1.2 例程程序
在 232 串口中对于串口通信的配置已经讲过了,这里就不再叙述,串口 2 的配置和串口
1 是类似的。只是多加了一个控制使能端。
1) 初始化函数
/********************************************************************
***********
USART_ClearFlag(USART2,USART_FLAG_TC); //清除 USARTx 的待处理标志
位
/* 设置 NVIC 参数 */
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn;
{
GPIO_InitTypeDef GPIO_InitStructure; //声明一个结构体变量,用来
初始化 GPIO
USART_InitTypeDef USART_InitStructure; //串口结构体定义
NVIC_InitTypeDef NVIC_InitStructure; //中断结构体定义
本章,我们只需要配置好串口 2,就可以实现正常的 485 通信了,串口 2 的配置和串 口 1 基本类似,只是串口的时钟来自 APB1,最大频率为 36Mhz。
1.2 电路设计
在串口选择中,我们将 P485 短接片分别短接到 485 端。串口使用的是串口 2,也就是 PA2 和 PA3,控制使能端使用的是 PG3 管脚。我们使用 USB 转 485 接口的 A 和 B 对应接到板子上 的 A 和 B,就可以将板子和电脑进行通信了。