RS2323 & RS485

RS232

  • 硬件直接对接,程序完全来自于USART
  • 由sp3232将TTL电平转化为RS232的标准电平
  • 实际应用中需要注意RS232对于2脚和3脚的直连或交叉接,现成的RS232当然不会有这个问题,但是自己DIY的时候要注意防止接反(如图3 图4)

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述


RS485

  • 基于usart
  • 通过sp3485将数据的收发集成到一根线上,转而由RS485_RE(B口)判断/切换数据的收发模式

在这里插入图片描述
在这里插入图片描述

RS232和RS485的理论极限使用场景

即短距离传输,中距离传输和远距离传输
在这里插入图片描述

程序示例

rs485.c

#include "sys.h"
#include "usart.h"
#include "rs485.h"

void RS485_Init(void){ //RS485接口初始化
	GPIO_InitTypeDef  GPIO_InitStructure; 	
    GPIO_InitStructure.GPIO_Pin = RS485_RE; //选择端口号(0~15或all)                        
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //选择IO接口工作方式       
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //设置IO接口速度(2/10/50MHz)    
	GPIO_Init(RS485PORT, &GPIO_InitStructure);
	GPIO_ResetBits(RS485PORT,RS485_RE); //RE端控制接收/发送状态,RE为1时发送,为0时接收。
	
}
 
/*
RS485总线通信,使用USART3,这是RS485专用的printf函数
调用方法:RS485_printf("123"); //向USART3发送字符123
*/
void RS485_printf (char *fmt, ...){ 
	char buffer[USART3_REC_LEN+1];  // 数据长度
	u8 i = 0;
	va_list arg_ptr;
	GPIO_SetBits(RS485PORT,RS485_RE); //为高电平(发送)//RS485收发选择线	
	va_start(arg_ptr, fmt);  
	vsnprintf(buffer, USART3_REC_LEN+1, fmt, arg_ptr);
	while ((i < USART3_REC_LEN) && (i < strlen(buffer))){
        USART_SendData(USART3, (u8) buffer[i++]);
        while (USART_GetFlagStatus(USART3, USART_FLAG_TC) == RESET); 
	}
	va_end(arg_ptr);
	GPIO_ResetBits(RS485PORT,RS485_RE); //为低电平(接收)//RS485收发选择线	
}

可以将上面的程序与
usart_c.usart_printf(char * fmt);
做对比
不能说一模一样,只能说完全一致

RS485_Init()
更是不用多说

RS485的数据接收倒是没有再“套壳”
而是同usart一样
交由主程序
USART_GetFlagStatus 判断后
直接处理

main.c

#include "stm32f10x.h" //STM32头文件
#include "sys.h"
#include "delay.h"
#include "touch_key.h"
#include "relay.h"
#include "oled0561.h"

#include "usart.h"
#include "rs485.h"

int main (void){//主程序
	u8 a;
	delay_ms(100); //上电时等待其他器件就绪
	RCC_Configuration(); //系统时钟初始化 
	TOUCH_KEY_Init();//触摸按键初始化
	RELAY_Init();//继电器初始化

	I2C_Configuration();//I2C初始化
	OLED0561_Init(); //OLED初始化
	OLED_DISPLAY_8x16_BUFFER(0,"   YoungTalk "); //显示字符串
	OLED_DISPLAY_8x16_BUFFER(2,"  RS485 TEST "); //显示字符串
	OLED_DISPLAY_8x16_BUFFER(6,"TX:    RX:   "); //显示字符串

	USART3_Init(115200);//串口3初始化并启动
	RS485_Init();//RS485总线初始化,需要跟在USART3初始化下方

	while(1){
		if(!GPIO_ReadInputDataBit(TOUCH_KEYPORT,TOUCH_KEY_A)){RS485_printf("%c",'A');OLED_DISPLAY_8x16(6,4*8,'A');} //向RS232串口发送字符并在OLED上显示		
		else if(!GPIO_ReadInputDataBit(TOUCH_KEYPORT,TOUCH_KEY_B)){RS485_printf("%c",'B');OLED_DISPLAY_8x16(6,4*8,'B');} //向RS232串口发送字符并在OLED上显示		
		else if(!GPIO_ReadInputDataBit(TOUCH_KEYPORT,TOUCH_KEY_C)){RS485_printf("%c",'C');OLED_DISPLAY_8x16(6,4*8,'C');} //向RS232串口发送字符并在OLED上显示
		else if(!GPIO_ReadInputDataBit(TOUCH_KEYPORT,TOUCH_KEY_D)){RS485_printf("%c",'D');OLED_DISPLAY_8x16(6,4*8,'D');} //向RS232串口发送字符并在OLED上显示

		//查询方式接收
		if(USART_GetFlagStatus(USART3,USART_FLAG_RXNE) != RESET){  //查询串口待处理标志位
			a =USART_ReceiveData(USART3);//读取接收到的数据
			OLED_DISPLAY_8x16(6,11*8,a);//在OLED上显示
		}
	}
}
着计算机在工业的广泛应用控制局域网络也深入应用到各行各业之中现行的诸多控 制系统若采用单机控制方式已越来越难以满足设备控制的要求因为往往我们所控制的设备 只是整个系统的一个基本单元它既需要外部输入一些必要的信息同时也需要向外部输出自 身的运行参数和状态所有这些都要求我们采用控制网络技术将众多设备有机地连成一体以 保证整个系统安全可靠地运行目前在我国应用的现场总线中RS-485/RS-422 使用最为 普遍当用户要将基于标准的RS-232 接口设备如PC 机连接至由RS-485/RS-422 构成 的通讯网络时则必须作RS-232和RS-485/RS-422之间的电平转换传统的做法是在设备 内扩展一个通讯适配卡由通讯适配卡实现电平转换内部主机再通过并行总线读出或写入数 据显然这种设计方法存在下列缺点 A.由于适配卡是基于某一种总线标准扩展的而不是基于RS-232电平标准所以其应用 范围受到限制只能一种适配卡适用一种总线如ISA 适配卡不可能插入STD总线或用户自 定义的总线其通用性较差 B.虽然实现的仅仅是电平转换但是由于需要考虑与扩展总线的接口和增加一个标准的 UART 并且需要占用系统的其它宝贵资源使硬件和软件变得过于复杂 C.复杂的硬件设计大大增加了元器件的数目和电路板面使适配卡的成本过高 D.由于采用内置插卡方式使变更通信方式比较麻烦如将半双工通信方式设置为全双工 方式等另外维修和测试也比较麻烦 E.对于现有的基于RS-232的设备在无法变动系统软件和硬件的情况下显然适配卡无 法将这些设备连成基于RS-485或RS-422通信网络的分布式系统为了克服上述缺点同时考虑到RS-232 接口的自身特点我们设计了一种小巧的无须外部供电的智能收发转换器实 现RS-232和RS-485/RS-422之间的电平转
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值