基于USART的RS232、485、422通信

一、TTL电平和CMOS电平(基础)

TTL电平:高电平为5V,低电平为0V
CMOS电平:CMOS电路输出高电平为3V~12V,低电平输出接近0V
计算机的MAX232电平:高电平为-5V到-12V,低电平为+5V到+12V,为负电压电平

TTL电路和CMOS电路的逻辑电平关系如下:
1:CMOS是场效应管构成,TTl为双极晶体管构成;因为TTL和CMOS的高低电平的值不一样,所以互相连接时需要电平的转化。
2:TTl电路是电流控制器件,而CMOS是电压控制器件
3:TTL电路的速度较快,传输延迟时间短(5-10ns),但是功耗大;CMOS电路的速度慢,传输延迟时间长(20-50ns),但功耗低,CMOS电路本身的功耗与输入信号的脉冲频率有关,频率越高,芯片越热,这是正常现象
4:CMOS集成电路的电源电压可以在较大范围内变化,因而对电源的要求不想TTL集成电路那样严格。所以TTL电平在条件允许的情况下可以兼容CMOS电平。但是要注意它们的驱动能力是不一样的,CMOS的驱动能力会大一些,有时候TTL的低电平触发不了CMOS电路,有时CMOS高电平会损坏TTL电路,在兼容性上需要注意。
5:CMOS的高低电平之间相差比较大、抗干扰性强,TTl则相差小,抗干扰性差。
6:CMOS的工作频率较TTL低

二、单端和差分传输

单端传输为与地的信号的电平差信号,差分传输是两根信号线的电平差信号

因为很多接地点不同+各线路受干扰情况不同+可能与其他设备共地或EMI干扰,导致单端信号不稳定,抗干扰能力差。

差分可使用双绞线,两根信号线同时受到干扰,并且以他们的电平差作为信号,所以抗共模干扰(信号回路同时受到同向干扰)能力强,有效抑制电磁干扰。(通俗理解,若不准确请参考权威回答)。并且差分信号的电磁场能够相互抵消,对外界的干扰也较弱。

三、USART和RS232、422、485

USART

USART使用TTL电路,有效电平3.3V/5V,电压较低,如果传输距离长,或者在室外有雷电天气或者各种电磁干扰等,会受到影响,甚至中断。

RS232

基于此RS232出现,通过提高电平提升传输距离和抗干扰能力,但是因为需要升压,所以通信速度较慢,最大19200bund/s,共地传输,抗共模干扰也比较差。

RS485

基于此RS485出现,采用差分信号,共模噪声抑制能力很强。传输距离可达千米,传输信号最小低至200mV。信号差(-6,-2)=0,(2,6)=1。还可使用使能信号来控制设备的收发。

数据最高传输速度可达10Mbps

RS485可实现一对多通信

总线上的设备最多可使用128个,但是设备为半双工通信,即设备接收时不能发送。

RS422

基于此使用422通信可以进行串口的 差分信号 点对多 全双工。最多可接10个节点,一个主设备,其余为从设备,从设备之间不能通信。RS422和RS485在长线传输时为了避免信号的反射和回波,需要在接收端接入终端匹配电阻,阻值约等于传输电缆的特性阻抗,在短距离传输时可以不需接终端电阻。终端电阻接在传输线缆的最远端。

总结

另外:

  • RS485设备为半双工设备,RS485收发器信号相关引脚包括控制引脚、485A、485B,其中控制引脚的高低电平决定当前处于接收模式还是发送模式。
  • RS485设备支持点对点连接和点对多点连接,接线上需要保证设备之间的485A相互连接、485B相互连接。示意图如下,左图为点对点连接,右图为点对多点连接:

  • RS422设备为全双工设备,相当于两路RS485。RS422收发器有两个控制引脚、4各信号引脚(TX+、TX-、RX+、RX-),其中TX+等价RS485的485A引脚,TX-等价RS485的485B引脚。如果RS422接口标识为A、B、Y、X四个名称,则Y对应RS422的RX+,Z对应RS422的RX-。
  • RS422收发器的两个控制引脚需要配合使用操作RS422的工作模式。
  • RS422设备也支持点对点连接和点对多点连接,接线方式与RS485接口连接有所不同。示意图如下,左图为点对点连接,右图为点对多点连接:
  • RS422收发器可以作为RS485网络使用,但是RS485收发器不能反过来用于RS422网络。
  • RS422收发器作RS485使用时需要同时控制两个控制引脚处于相同电平,保证收发器工作在半双工模式。短接示意图如下:
  • 22
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
以下是基于STM32F103的USART3的RS485通信代码,代码中包含了发送和接收数据的函数: ```c #include "stm32f10x.h" #include <stdio.h> void USART3_Configuration(void) { GPIO_InitTypeDef GPIO_InitStructure; USART_InitTypeDef USART_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO, ENABLE); RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3, ENABLE); //USART3_TX PB10 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOB, &GPIO_InitStructure); //USART3_RX PB11 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_Init(GPIOB, &GPIO_InitStructure); //USART3_RE PB12 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_Init(GPIOB, &GPIO_InitStructure); USART_InitStructure.USART_BaudRate = 9600; USART_InitStructure.USART_WordLength = USART_WordLength_8b; USART_InitStructure.USART_StopBits = USART_StopBits_1; USART_InitStructure.USART_Parity = USART_Parity_No; USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; USART_Init(USART3, &USART_InitStructure); USART_Cmd(USART3, ENABLE); } void USART3_SendData(uint8_t *pucBuffer, uint16_t uiLength) { GPIO_SetBits(GPIOB, GPIO_Pin_12); while (uiLength--) { USART_SendData(USART3, *pucBuffer++); while (USART_GetFlagStatus(USART3, USART_FLAG_TXE) == RESET) { } } while (USART_GetFlagStatus(USART3, USART_FLAG_TC) == RESET) { } GPIO_ResetBits(GPIOB, GPIO_Pin_12); } void USART3_ReceiveData(uint8_t *pucBuffer, uint16_t uiLength) { while (uiLength--) { while (USART_GetFlagStatus(USART3, USART_FLAG_RXNE) == RESET) { } *pucBuffer++ = USART_ReceiveData(USART3); } } ``` 在主函数中可以调用上述函数实现RS485通信: ```c int main(void) { uint8_t send_buffer[] = "Hello World!"; uint8_t receive_buffer[32]; USART3_Configuration(); while (1) { USART3_SendData(send_buffer, sizeof(send_buffer)); USART3_ReceiveData(receive_buffer, sizeof(receive_buffer)); } } ``` 在上述代码中,发送数据时需要先将RE置为高电平,然后通过USART3_SendData函数发送数据。接收数据时需要等待接收完成,然后通过USART3_ReceiveData函数将接收到的数据存储到缓冲区中。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值