rs485缺点:
rs485总线是一种常规的通信总线,它不能够做总线的自动仲裁,也就是不能够同时发送数据以避免总线竞争,所以整个系统的通信效率必然较低,数据冗余量较大,对于速度要求高的应用场所不适应用rs485总线。同时由于rs485总线上通常只有一台主机,所以这种总线方式是典型的集中—分散型控制系统。一旦主机出现故障,会使整个系统的通信限于瘫痪状态,因此做好主机的在线备份是一个重要措施。
传统光电隔离的典型电路:
vdd与+5v1(vcc485)是两组不共地的电源,一般用隔离型的dc-dc来实现。通过光耦隔离来实现信号的隔离传输,isl3152eibz与mcu系统不共地,完全隔离则有效的抑制了高共模电压的产生,大大降低485的损坏率,提高了系统稳定性。但也存在电路体积过大、电路繁琐、分立器件过多,传输速率受光电器件限制等缺点,对整个系统的稳定性也有一定影响。
***rxd1 :串口接收端
***txd1 :串口传输端
***tre1 :为控制位:控制发送还是接收数据;
当tre1=1(高电平时),光耦电路121截止,/re=1(无效),de=1(有效),即发送数据;
当tre=0 (低电平时),光耦电路导通,/re=0(有效),即接收数据,de=0(无效);
/re: 485接收端
de:485发送端
第一步,配置好串口发送、接收端引脚和485控制引脚;
因为rxd1引脚相对于stm32芯片来说是接收外来数据,所以设置为输入;
txd1引脚相对于stm32芯片来说是对外发送数据,所以设置为输出;
tre1引脚是对外发送“1”或“0”高低电平命令,所以设置为输出;
/*****************************************************************
*函数名称:uart2init
*功能描述:对串口2参数进行设置、485控制端口初始化
*
*输入参数:无
*返回值:无
*其他说明:无
*当前版本:v1.0
*修改日期版本号修改人修改内容
*-----------------------------------------------------------------
*
******************************************************************/
voiduart2init(void)
{
gpio_inittypedefgpio_initstructure;
usart_inittypedefusart_initstructure;
rcc_apb1periphclockcmd(rcc_apb1periph_usart2,enable);
rcc_apb2periphclockcmd(rcc_apb2periph_gpioa,enable);
rcc_apb2periphclockcmd(rcc_apb2periph_gpiob,enable);
rcc_apb2periphclockcmd(rcc_apb2periph_gpioc,enable);//使能外设时钟
//gpio结构的成员设置如下:
/*--------------485控制端初始化------pa1----------*/
gpio_initstructure.gpio_pin=gpio_pin_1;
gpio_initstructure.gpio_speed=gpio_speed_50mhz;//50m时钟速度
gpio_initstructure.gpio_mode=gpio_mode_out_pp;//推挽输出
gpio_init(gpioa,&gpio_initstructure);
gpio_initstructure.gpio_pin=gpio_pin_2;//485_tx
gpio_initstructure.gpio_speed=gpio_speed_50mhz;
gpio_initstructure.gpio_mode=gpio_mode_af_pp;//复用推挽输出
gpio_init(gpioa,&gpio_initstructure);
gpio_initstructure.gpio_pin=gpio_pin_3;//485_rx
gpio_initstructure.gpio_mode=gpio_mode_in_floating;//浮空输入
gpio_init(gpioa,&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_tx|usart_mode_rx;
usart_init(usart2,&usart_initstructure);
usart_cmd(usart2,enable);
/*方法一:清发送完成标志*/
//usart_clearflag(usart3,usart_flag_tc);
/*方法二:获取串口1状态标志位*/
usart_getitstatus(usart1,usart_flag_tc);
}
第二步:发送数据
这里需要注意的是:
/* cpu的小缺陷:串口配置好,如果直接send,则第1个字节发送不出去
如下两个方法语句解决第1个字节无法正确发送出去的问题*/
方法一:usart_clearflag(usart3, usart_flag_tc); /*清发送完成标志,transmission complete flag */
方法二:/*获取串口1状态标志位*/
usart_getitstatus(usart1, usart_flag_tc);
刚上电时出现乱码的原因:
while(usart_getflagstatus(usart2, usart_flag_txe) == reset); // usart_flag_txe---检测发送数据寄存器空标志位
如果usart_flag_tc---发送完成标志位
(1)当设为usart_flag_txe---检测发送数据寄存器空标志位—为空,但是发送移位寄存器不为空,数据还没有完全的发送出去,又有数据就被写进来了,所以就会容易出现乱码;
(2)当设为usart_flag_tc—检测发送完成标志位—为空,即发送移位寄存器为空,数据才真正的发送出去,因此此时又有数据被写进来也不会发生乱码
stm32的数据发送有两个中断标志,一个是发送数据寄存器空标志,一个是发送完毕标志。两个标志都可以引起中断。
要以中断的方式发送一个数据包,流程是这样的:
1.设置rs485的方向为发送,使能发送寄存器空中断,使能完毕进入串口中断。
2.串口中断里读取串口状态,并填充一个数据到发送数据寄存器,硬件自动清除发送数据寄存器空标志,串口数据发送开始。
3.串口发送完一个数据,发送数据寄存器变空,再进入中断,继续填充下一个数据,直到最后一个数据填充完,使能串口
发送完毕中断。
4.最后一个数据发送完毕,再次进入中断,清除发送数据寄存器空标志,清除发送完毕中断标志,清除这两个中断标志
的使能位,设置rs485的方向为接收。
来源;21ic
携手企知道科创空间,鼎泰电路致力发展成全球知名品牌
AMDRadeonRX500系列显卡核心技术解析
2020年中国的顶级论文数将超越美国
食品安全智能分析系统的功能特点
Cree, Inc.正式更名为Wolfspeed, Inc.,标志着向强大的全球性半导体企业成功转型
RS485通信总线的工作原理解析
微雪电子BLE4.0蓝牙NRF51822简介
为何Board File里Padstack的Type无法改成
RS485串口转以太网接入MODBUS TCP第三方云平台
荣耀V20全球发布 荣耀手机拼海外高端市场的底气从哪里来
如何判断电、磁、力方向
华为Mate10什么时候上市?华为Mate10最新消息:华为Mate10售价已确定,价格感人!即将发布值得期待
自动扬尘监测设备的好处有哪些
发动机结构代号中L、V、W都是啥意思?图文详解让你不再迷糊
华为拟在印度建智能机工厂
芯和电子系统设计仿真云平台应对各种仿真挑战
万宝龙带来Summit 2+智能手表新品,增加移动通信功能
物联网黄金时代,边缘计算+网络虚拟化,将推动物联网需求真正落地
全球化大势下的“中国工厂”
国产化操作系统画脑图,就选这3款思维导图软件!