一、串口

串口是一种接口标准,它规定了接口的电气标准,简单说只是物理层的一个标准。没有规定接口插件电缆以及使用的协议,所以只要我们使用的接口插件电缆符合串口标准就可以在实际中灵活使用,在串口接口标准上使用各种协议进行通讯及设备控制。(典型的串口通讯标准是RS232和RS485,它们定义了电压、阻抗等,但不对软件协议给予定义)

RS232接口缺陷

1、接口的信号电平值较高(+/-12V),易损坏接口电路的芯片。

2、传输效率较低,在异步传输时,波特率为20Kbps.

3、接口使用一根信号线和一根信号返回线而构成共地的传输形式,这种共地传输很容易产生共模干扰,所以抗噪声干扰性弱。

4、传输距离有限,最大传输距离标准值为50英尺,实际上也只能用在50米左右。

二、RS485接口原理 

485接口

485(一般称作RS485/EIA) 是隶属于OSI模型物理层的电器特性,规定为2线、半双工、多点通信的标准。它的电气特性和RS-232大不一样。用缆线两端的电压差值来表示传递信号。RS485仅仅规定了接收端和发送端的电气特性。它没有规定或推荐任何数据协议。

485的特点:

1、接口电平低,不易损坏芯片。RS485的电气特性:逻辑“1”以两线间的电压差为+(2~6V)表示:逻辑“0”以两线间的电压差为-(2~6V)表示。接口信号电平比RS232降低了,不易损坏接口电路的芯片。

2、传输速度高。10米是,RS485的数据最高传输速率可达35Mbps,在1200m时,传输速度可达100Kbps。

3、抗干扰能力强。RS485接口是采用平衡驱动器和差分接收器的组合,抗共模干扰能力增强,即抗噪声干扰性好。

4、传输距离远,支持节点多。RS485总线最长可传输1200m以上(速率<=100Kbps)一般最大支持32个节点,如果使用特制的485芯片,可达到128个或256个节点,最大可以支持到400个节点。

 RS485推荐使用在点对点网络中,线型、总线型,不能是星型、环型网络。理想情况下RS485需要2个匹配电阻,其阻值要求等于传输电缆的特性阻抗(一般为120Ω)。没有特性阻抗的话,当所有的设备都静止或者没有能量的时候就会产生噪声,而且线移需要双端的电压差。没有终接电阻的话,会使得较快速度的发送端产生多个数据信号的边缘,导致数据传输出错。

485推荐的连接方式:

在上面的连接中,如果需要添加匹配电阻,我们一般在总线的起止端加入,也就是主机和设备4上各加一个120Ω的匹配电阻。

收发器SP3485:

图中A、B总线接口,用于连接485总线。RO是接收输出端,DI是发送数据收入端,RE是接收使能信号(低电平有效),DE是发送使能信号(高电平有效)。

(RO和RE搭配,要接收输出就要接收使能,而且设RE为低电平。DE和DI相搭配,DE设为高电平)收发器是半双工的,一般情况下RE和DE连接到一起。用RO的时候使能RE和DE为0,这样RO就可以使用,而DI不能使用。相反,RE和DE为1,RO不能使用,DI可以使用。A、B就是转化出来的485信号。RO和DI一般连接PA9/PA10

硬件连接(探索者)

注意:1)R38和R40是两个 偏置电阻,用来保证总线空闲时,AB之间的电压差都会大于200mv,避免总线空闲时压差不定逻辑混乱。2)两个485接口连接,A连A、B连B。

 

三、程序代码

RS485初始化(初始化的是485对应的串口2也就是PA2和PA3)

void RS485_Init(u32 bound)
{
  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE);//使能GPIOA时钟
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2,ENABLE);//使能USART2时钟
}

串口2引脚复用映射

void RS485_Init(u32 bound)
{
  GPIO_PinAFConfig(GPIOA,GPIO_PinSource2,GPIO_AF_USART2);//GPIOA2复用为USART2
  GPIO_PinAFConfig(GPIOA,GPIO_PinSource3,GPIO_AF_USART2);//GPIOA3复用为USART3
}

初始化IO口

void RS485_Init(u32 bound)
{
  GPIO_InitTypeDef GPIO_InitABC;
  USART_InitTypeDef USART_InitABC;
  //USUART2
  GPIO_InitABC.GPIO_Pin=GPIO_Pin_2|GPIO_Pin_3;//GPIOA2与GPIOA3
  GPIO_InitABC.GPIO_Mode=GPIO_Mode_AF;//复用功能
  GPIO_InitABC.GPIO_Speed=GPIO_Speed_100MHz;//速度100MHz
  GPIO_InitABC.GPIO_OType=GPIO_OType_PP;//推挽输出
  GPIO_InitABC.GPIO_PuPd=GPIO_PuPd_UP;//上拉
  GPIO_Init(GPIOA,&GPIO_InitABC);//初始化PA2、PA3
  //PG8推挽输出,495模式控制
  GPIO_InitABC.GPIO_Pin=GPIO_Pin_8;//GPIOG8
  GPIO_InitABC.GPIO_Mode=GPIO_Mode_OUT;//输出
  GPIO_InitABC.GPIO_Speed=GPIO_Speed_100MHz;//速度100MHz
  GPIO_InitABC.GPIO_OType=GPIO_OType_PP;//推挽输出
  GPIO_InitABC.GPIO_PuPd=GPIO_PuPd_UP;//上拉
  GPIO_Init(GPIOG,&GPIO_InitABC);//初始化PG8
  //UUSART2初始化设置
  USART_InitABC.USART_BaudRate=bound;//波特率设置
  USART_InitABC.USART_WordLength=USART_WorldLength_8b;//字长为8为数据格式
  USART_InitABC.USART_StopBits=USART_StopBits_1;//一个停止位
  USART_InitABC.USART_Parity=USART_Parity_No;//无奇偶校验位
  USART_InitABC.USART_HardwareFlowControl=USART_HardwareFlowControl_None;//无硬件数据流
  USART_InitABC.USART_Mode=USART_Mode_Rx|USART_Mode_Tx;//收发模式
  USART_Init(USART2,&USART_InitABC);//初始化串口2
  USART_Cmd(USART2,ENABLE);//使能串口2
  USART_ClearFlag(USART2,USART_FLAG_TC);
}
物联沃分享整理
物联沃-IOTWORD物联网 » 基于STM32的485通信实验

发表评论