4.8 STM32 RS485串口通讯及程序设计


版本号:V2.2
第 6 页 共 14 页
官方网站:
(众想)哈尔滨卓恩科技开发有限公司
STM32 开发板用户使用手册
RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2,ENABLE);//设置串口 2 时钟使 能
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);//功能复用 IO 时钟使能
(众想)哈尔滨卓恩科技开发有限公司
STM32 开发板用户使用手册
语句 #ifndef、#endif 是为了防止 pbdata.h 文件被多个文件调用时出
现错误提示。如果不加这两条语句,当两个文件同时调用 pbdata 文件时,
会提示重复调用错误。
4.8.4.4 pbdata.c 文件里的内容是
#include "pbdata.h" //很重要,引用这个头文件
无论编写任何程序都要打开相关的时钟设置,在这个实验中用到使能
AHB 外设时钟有 3 各部分,分别是使能端口时钟、使能串口 2 时钟、使能端
口复用时钟。所有的外设时钟全部挂接在 AHB 后的两个预分频器上,初学者
一般都感觉在设置外设时钟时不知道怎样填写使能或使能外设时钟函数中
的“参数 1”,下表我列出了一些“参数 1”的固定书写格式,方便大家查
一个很成熟的电路,电路大家都熟悉了(参考原理图纸)。从图中可以看出
芯片 1#管脚是数据接收端,4#管脚是数据发送端;2#、3#管脚是发送/接收
状态转换控制端。
图一 RS485 通讯电路 4.8.4 软件设计
RS485 通讯程序中我们用到中断、端口复用功能等函数。我们采用 PA 端口进行串口通讯;PA2 端口接 TX,PA3 端口接 RX,状态转换控制线连接 PE5 端口。在这里我们也是全部使用库函数编写程序。 4.8.4.1 STM32 库函数文件
都是串口通讯,引用的库函数和 RS232 都是一样的。其中
stm32f10x_gpio.h 头文件包含了 GPIO 端口的定义。stm32f10x_rcc.h 头文
件包含了系统时钟配置函数以及相关的外设时钟使能函数,所以我们要把这
两个头文件对应的 stm32f10x_gpio.c 和 stm32f10x_rcc.c 加到工程中;
2
RCC_APB1Periph_TIM3
((uint32_t)0x00000002)
3
RCC_APB1Periph_TIM4
((uint32_t)0x00000004)
4
RCC_APB1Periph_TIM5
((uint32_t)0x00000008)
版本号:V2.2
第 5 页 共 14 页
官方网站:
(众想)哈尔滨卓恩科技开发有限公司
STM32 开发板用户使用手册
{ u32 temp; SysTick->LOAD = 9*nus; SysTick->VAL=0X00;//清空计数器 SysTick->CTRL=0X01;//使能,减到零是无动作,采用外部时钟源 do { temp=SysTick->CTRL;//读取当前倒计数值 }while((temp&0x01)&&(!(temp&(1<<16))));//等待时间到达
版本号:V2.2
第 2 页 共 14 页
官方网站:
(众想)哈尔滨卓恩科技开发有限公司
STM32 开发板用户使用手册
通过下传编写好的串口通讯程序,验证串口通讯的正确性,掌握串口通
讯软件的设计方法。
4.8.3 硬件设计
在这里使用的串口通讯芯片是常规芯片 MXA485,RS485 串口通讯电路是
RCC_PCLK2Config(RCC_HCLK_Div1); /*设置高速 AHB 时钟(PCLK2)RCC_HCLK_Div1—— APB2 时钟 = HCLK*/
RCC_PCLK1Config(RCC_HCLK_Div2); /*设置低速 AHB 时钟(PCLK1)RCC_HCLK_Div2—— APB1 时钟 = HCLK / 2*/
if(RCC_WaitForHSEStartUp() == SUCCESS) { /*等待 HSE 起振, SUCCESS:HSE 晶 振稳定且就绪*/
RCC_HCLKConfig(RCC_SYSCLK_Div1);/*设置 AHB 时钟(HCLK)RCC_SYSCLK_Div1—— AHB 时钟 = 系统时*/
版本号:V2.2
第 3 页 共 14 页
官方网站:
(众想)哈尔滨卓恩科技开发有限公司
STMห้องสมุดไป่ตู้2 开发板用户使用手册
stm32f10x_gpio.c stm32f10x_rcc.c Misc.c // 中断控制字(优先级设置)库函数 stm32f10x_exti.c // 外部中断库处理函数 stm32f10x_usart.c // 串口通讯函数
u32 temp; SysTick->LOAD = 9000*nms; SysTick->VAL=0X00;//清空计数器 SysTick->CTRL=0X01;//使能,减到零是无动作,采用外部时钟源 do { temp=SysTick->CTRL;//读取当前倒计数值 }while((temp&0x01)&&(!(temp&(1<<16))));//等待时间到达 SysTick->CTRL=0x00; //关闭计数器 SysTick->VAL =0X00; //清空计数器 }
为扩展应用范围,EIA 于 1983 年在 EIA-422 基础上制定了 EIA-485 标 准,增加了多点、双向通信能力,即允许多个发送器连接到同一条总线上。 同时增加了发送器的驱动能力和冲突保护特性,扩展了总线共模范围,后命 名为 TIA/EIA-485-A 标准。 由于 EIA-485 是从 EIA-422 基础上发展而来的,所以 EIA-485 许多电气规定 与 EIA-422 相仿,如都采用平衡传输方式、都需要在传输线上接终接电阻、 最大传输距离约为 1219 米、最大传输速率为 10Mbps 等。但是,EIA-485 可 以采用二线与四线方式,采用二线制时可实现真正的多点双向通信,而采用 四线连接时,与 EIA-422 一样只能实现点对多点通信,但它比 EIA-422 有改 进, 无论四线还是二线连接方式总线上可接多达 32 个设备。 EIA-232、EIA-422 与 EIA-485 标准的优点 4.8.2 RS485 通讯实验目的
版本号:V2.2
第 1 页 共 14 页
官方网站:
(众想)哈尔滨卓恩科技开发有限公司
STM32 开发板用户使用手册
4.8 STM32 RS485 串口通讯实验
4.8.1 概述 4.8.1.1 RS485 串口通讯
RS-485 接口具有良好的抗噪声干扰性、长的传输距离和多站能力等。 上述优点就使其成为首选的串行接口。因为工业 RS485 通讯接口组成的半双 工网络,一般只需二根连线,所以工业 RS485 通讯接口均采用屏蔽双绞线传 输。 4.8.1.2 EIA-485 标准简介
(众想)哈尔滨卓恩科技开发有限公司
STM32 开发板用户使用手册
学 ARM 从 STM32 开始
STM32 开发板库函数教程--实战篇
官方网站: 官方店铺: 官方论坛: 刘洋课堂:
RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);/*设置 PLL 时钟源及倍频 系数*/
RCC_PLLCmd(ENABLE); /*使能 PLL */ while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET) ; /*检查指定的 RCC 标志 位(PLL 准备好标志)设置与否*/
义的公共函数和全局变量,以方便以后每个功能模块之间传递参数。
4.8.4.3 pbdata.h 文件里的内容是
#ifndef _pbdata_H #define _pbdata_H
#include "stm32f10x.h" #include "misc.h" #include "stm32f10x_exti.h" #include "stm32f10x_tim.h" #include "stm32f10x_usart.h"
4.8.5 STM32 系统时钟配置 SystemInit()
每个工程都必须在开始时配置并启动 STM32 系统时钟。
4.8.6 GPIO 引脚时钟使能
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE,ENABLE);
RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK); /*设置系统时钟(SYSCLK) */ while(RCC_GetSYSCLKSource() != 0x08); /*0x08:PLL 作为系统时钟 */ } } /*********************************************************************** * 名 称:delay_us(u32 nus) * 功 能:微秒延时函数 * 入口参数:u32 nus * 出口参数:无 * 说 明: * 调用方法:无 ***********************************************************************/ void delay_us(u32 nus)
合集下载

单片机上的RS485接口

单片机上的RS485接口

单片机上的RS485接口RS­232虽然应用很广泛,但因为它推出较早,在现代网络通信中已经暴露出明显的缺点。

比如以下几点:1)数据传输速率慢。

RS­232所规定的20KB/s的传输速率虽然能满足异步通信要求,通常异步通信速率限制在19.2KB/s以下对某些同步系统来说,不能满足传送速率要求。

2)传送距离短。

RS­232接口一般装置之间电缆长度为15m,即使有较好的线路器件优良的信号质量,电缆长度也不会超过60m。

3)没有规定标准的连接器,因而出现了互不兼容的25芯连接器。

4)接口处各信号间容易产生串扰。

RS­485接口的出现就弥补了RS­232的不足,而出现了一种新的接口标准,并且由于良好的性能,RS­485获得了广泛的应用,其具有以下特点:1)RS­485的电气特性:逻辑“1”以两线间的电压差为+(2~6)V表示;逻辑“0”以两线间的电压差为­(2~6)V表示。

接口信号电平比RS­232降低了,就不易损坏接口电路的芯片,且该电平与TTL电平兼容,可方便与TTL电路连接。

2)RS­485的数据最高传输速率为10MB/s。

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

4)RS­485接口的最大传输距离标准值为4000英尺,实际上可达1000米,另外RS­232接口在总线上只允许连接1个收发器,即单站能力。

而RS­485接口在总线上是允许连接多达128个收发器。

即具有多站能力,这样用户可以利用单一的RS­485接口方便地建立起设备网络。

RS­485收发器SN65HVD3082的使用方法1)SN65HVD3082简介此芯片是半双工RS­485收发器。

5V供电,全完符合TIA/EIA­485A标准。

RS232RS485通信原理

RS232RS485通信原理

RS232RS485通信原理1.RS232通信原理:在RS232通信中,数据是通过电压的高低来表示的。

逻辑1通常表示为低电平(-15V至-3V),而逻辑0通常表示为高电平(+3V至+15V)。

发送器将数据转换为电压信号,并通过发送线发送给接收器。

接收器接收电压信号,并将其转换回原始数据。

数据的传输速率可以在通信连接的两端进行配置。

2.RS485通信原理:RS485是一种多点通信方式,即一对多或多对多的通信连接。

在RS485通信中,可以有多个设备同时连接在同一总线上。

每个设备都有一个唯一的地址。

数据在RS485通信中同样是通过串行方式传输的,但与RS232不同的是,RS485使用差分信号传输。

差分信号是由两个线,一个正极性线和一个负极性线组成的。

逻辑1由正极性线为高电平,负极性线为低电平表示,逻辑0则相反。

这种差分信号可以减小干扰和串扰的影响,提高通信的可靠性。

RS485通信需要使用一个总线驱动器来驱动差分信号的发送,以及一个接收器来接收差分信号并将其转换为原始数据。

多个设备可以同时发送和接收数据,但需要注意冲突检测和数据帧的区分。

在RS485通信中,总线上的设备必须共享相同的地线,以提供参考电压。

3.RS232和RS485的区别:- 点对点 vs 多点:RS232是一对一的通信连接,而RS485可以支持一对多或多对多的通信连接。

- 单端信号 vs 差分信号:RS232使用单端信号传输,而RS485使用差分信号传输。

差分信号提供更好的抗干扰性能。

-速率和距离:RS232通常用于较短距离和较低速率的通信,而RS485可以支持较长距离和较高速率的通信。

-引脚和连接:RS232通常使用9针或25针的D型连接器,而RS485使用通常使用2线或4线连接。

总结:RS232和RS485是两种常见的串口通信协议,用于在计算机和外部设备之间进行数据传输。

RS232是一对一的点对点通信连接,使用单端信号传输;而RS485可以支持一对多或多对多的通信连接,使用差分信号传输。

STC单片机如何通过485接口下载程序

STC单片机如何通过485接口下载程序

由于RS485相比RS232具有抑制共模干扰、传输距离长等优点,所以许多大型的工业设备都采用RS485进行串口通讯。

但由于RS485采用的是差分信号,所以在进行串口通讯时,只能采用半双工的工作方式,必须使用1个或2个I/O口来控制RS485的发送和接收状态。

当需要采用RS485来对STC的新版IC(支持RS485下载的单片机系列在后面会详细列出)进行ISP下载时,必须进行一些设置才可下载代码。

具体的操作步骤如下:
1、首先需要设置好相应的RS485控制端口,并勾选上“下次下载时使能目标芯片的RS485控制功能”这个选项
2、然后使用普通下载方式将RS485相关的硬件选项写入到目标芯片
3、经过前面两步的设置和编程,此时的目标芯片便具有了对RS485的控制功能。

接下来仍需要保持RS485的控制选项不变,并勾选上"本次使用RS485进行控制下载"的选项(此选项的作用是使PC端也采用RS485的控制方式进行发送/接收串口数据)
4、再点击下载编程按钮,并对目标芯片重新上电即可实现使用RS485进行通信下载的功能
RS485控制功能仅对如下系列及新出的单片机有效:
STC15F2K60S2/STC15L2K60S2
IAP15F2K61S2/IAP15L2K61S2
STC15F104W/STC15L104W
IAP15F105W/STC15L105W
STC15W104SW/IAP15W105W
特别注意:
若需要RS485控制功能,则每次都需要将RS485相关的配置设置正确,并勾选上“下次下载时使能目标芯片的RS485控制功能”这个选项,否则在下一次下载时将不具有RS485控制功能了。

单片机485串口读写冲突

单片机485串口读写冲突

单片机485串口读写冲突单片机485串口读写冲突是指在使用串口进行数据通信时,由于读和写操作同时进行而造成的冲突现象。

这种冲突会导致数据发送或接收不完整,甚至造成通信失败。

在单片机中,485串口通信的读写冲突问题可以通过以下方法解决:1. 采用流程控制:可以通过硬件或软件的方式实现流控制,例如使用硬件流控制的方式,通过控制CTS(Clear To Send)和RTS(Request To Send)信号来进行数据的读写控制。

2. 设置读写优先级:通过设置读写优先级,可以确保在进行数据通信时,读操作和写操作不会同时进行。

可以根据不同的应用场景和需求,设置读写操作的优先级,从而避免冲突。

3. 缓冲区设计:在单片机中,可以通过设置发送缓冲区和接收缓冲区来避免读写冲突。

发送缓冲区用于存储待发送的数据,当串口空闲时,将数据从缓冲区发送出去;接收缓冲区用于存储接收到的数据,当数据接收完成后,再从缓冲区读取。

4. 使用中断:可以使用串口中断来实现数据的读取和写入。

通过设置中断触发条件和中断服务程序,当数据接收完成或发送缓冲区空闲时,触发中断进行相应的读写操作,从而避免读写冲突。

5. 使用互斥锁:可以通过使用互斥锁来实现对串口的互斥访问。

当一个任务正在进行读或写操作时,其他任务需要等待访问权限,从而确保同一时间只有一个任务能够进行读写操作,避免冲突发生。

除了以上的解决方法,还可以通过合理的软件设计和优化算法来尽可能减少读写冲突的发生,例如使用DMA(Direct Memory Access)方式进行数据传输,减轻单片机CPU的负担,提高效率。

另外,在设计和调试过程中,可以使用示波器等工具进行数据监测和分析,找出冲突问题的具体原因,并及时采取相应的措施进行修复。

在实际应用中,针对不同的场景和需求,可能需要结合多种方法来解决读写冲突问题,需要根据具体情况进行选择和调整。

同时,还需要进行充分的测试和验证,确保系统的稳定性和可靠性。

RS-485总线收发实验要点

RS-485总线收发实验要点

RS-485总线收发实验在本章节,我们将介绍RS-485总线的使用。

本实验一共需要两块神舟IV号STM32开发板,一块作为RS485的发送端,另一块作为RS485的接收端,接收总线上的数据。

本节分为如下几个部分:1 RS-485总线实验的意义与作用2实验原理3软件设计4硬件设计5下载与验证6实验现象意义与作用前面两个例程,我们分别讲解了串口printf实验和串口中断收发实验,对RS232串口原理及其应用有了一定的了解,但是由于RS232接口标准出现较早,难免有不足之处,主要有以下四点:(1)接口的信号电平值较高,易损坏接口电路的芯片,又因为与TTL电平不兼容故需使用电平转换电路方能与TTL电路连接。

(2)传输速率较低,在异步传输时,波特率为20Kbps。

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

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

针对RS232接口的不足,于是就不断出现了一些新的接口标准,RS-485就是其中之一,它具有以下特点:(1)RS-485的电气特性:逻辑"1"以两线间的电压差为+(2—6)V表示;逻辑"0"以两线间的电压差为-(2—6)V表示。

接口信号电平比RS-232降低了,就不易损坏接口电路的芯片,且该电平与TTL电平兼容,可方便与TTL电路连接。

(2)RS-485的数据最高传输速率为10Mbps(实际取决于RS485接口芯片和电路)。

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

(4)RS-485接口的最大传输距离标准值为4000英尺,实际上可达3000米,另外RS-232接口在总线上只允许连接1个收发器,即单站能力。

而RS-485接口在总线上是允许连接多达128个收发器。

即具有多站能力,这样用户可以利用单一的RS-485接口方便地建立起设备网络。

485通讯协议怎么使用(传统光电隔离的典型电路实例)

485通讯协议怎么使用(传统光电隔离的典型电路实例)

485通讯协议怎么使用(传统光电隔离的典型电路实例)RS485总线标准是工业中(考勤,监控,数据采集系统)使用非常广泛的双向、平衡传输标准接口,支持多点连接,允许创建多达3两个节点的网络;最大传输距离1200m,支持1200 m时为100kb/s的高速度传输,抗干扰能力很强,布线仅有两根线很简单。

RS485通信网络接口是1种总线式的结构,上位机(以个人电脑为例)和下位机都挂在通信总线上,RS485物理层的通信协议由RS485标准和PLC的多机通讯方式。

传统光电隔离的典型电路VDD与+5V1(VCC485)是两组不共地的电源,一般用隔离型的DC-DC来实现。

通过光耦隔离来实现信号的隔离传输,ISL3152EIBZ与MCU系统不共地,完全隔离则有效的抑制了高共模电压的产生,大大降低485的损坏率,提高了系统稳定性。

但也存在电路体积过大、电路繁琐、分立器件过多,传输速率受光电器件限制等缺点,对整个系统的稳定性也有一定影响。

第一步,配置好串口发送、接收端引脚和485控制引脚;因为RXD1引脚相对于STM32芯片来说是接收外来数据,所以设置为输入;TXD1引脚相对于STM32芯片来说是对外发送数据,所以设置为输出;TRE1 引脚是对外发送1或0高低电平命令,所以设置为输出;/******************************************************************函数名称:UART2Init*功能描述:对串口2参数进行设置、485控制端口初始化**输入参数:无*返回值:无*其他说明:无*当前版本:v1.0*-----------------------------------------------------------------*******************************************************************/void UART2Init(void){GPIO_InitTypeDef GPIO_InitStructure;USART_InitTypeDef USART_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_TXGPIO_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_RXGPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //浮空输入GPIO_Init(GPIOA,GPIO_InitStructure);//串口的结构成员设置如下:USART_ART_BaudRate = 9600;USART_ART_WordLength = USART_WordLength_8b;USART_ART_StopBits = USART_StopBits_1;USART_ART_Parity = USART_Parity_No;USART_ART_HardwareFlowControl = USART_HardwareFlowControl_None; USART_ART_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检测发送完成标志位为空,即发送移位寄存器为空,数据才真正的发送出去,因此此时又有数据被写进来也不会发生乱码1STM32的数据发送有两个中断标志,一个是发送数据寄存器空标志,一个是发送完毕标志。

STM32DMX串口收发程序

根据标准的512协议,其物理连接与传统上的RS485是完全一致的,并没有什么差别,差别只是在协议上的不同,工业上应用的主要是modbus协议,而这里是用512通信协议。

DMX512数据协议是美国舞台灯光协会(USITT)于1990年发布的一种灯光控制器与灯具设备进行数据传输的标准。

它包括电气特性,数据协议,数据格式等方面的内容。

512协议规定使用的波特率是250Kbps,但是stm32可以支持上Mbps的波特率,所以说这不是什么大问题。

该协议发送的数据帧一共11位,1位开始位,8位数据,2个停止位,无校验位。

根据波特率可以知道,位时间是4us,11位数据供需要44us的时间。

当然对于标准的512协议是需要break 和mark after break 帧的,break是一个92us的低电平,而mark after break是一个12us的高电平,如下图所示根据上面的图片(缺失了起始码,下图补上),512协议必须有break和mark,但是在我们通常的非标准收发中,检测break和mark相对比较困难,如果非要做,耗费的资源也比较多,比如定时器计时,中断等等。

如果不是做标准控制器的,完全可以另辟蹊径。

每一串数据的开始都要有一个起始码,也称复位码,其数据为0,但是从开始位数至第十位是0,用来声明数据传输开始,随后包含1-512个数据,也称调光数据,其是标准的数据帧,所以第十位是1,所以我们可以根据这个第十位来进行做文章。

大家都知道,一般的单片机,像51,avr等都是支持8-9位数据发送的,所以我们就是用9位数据,1位停止位,无校验位,通过检测检测第十位,也就是所谓的RB8来进行数据的接收与传输,不需要发送break和mark。

1、发送端串口设为9位数据,1停止位,无校验位,波特率250000void USART1_Configuration(void){USART_InitTypeDef USART_InitStructure;USART_ART_BaudRate = 250000;USART_ART_WordLength = USART_WordLength_9b;USART_ART_StopBits = USART_StopBits_1;USART_ART_Parity = USART_Parity_No;USART_ART_HardwareFlowControl = USART_HardwareFlowControl_None;USART_ART_Mode = USART_Mode_Rx | USART_Mode_Tx;/* Configure USART1 */USART_Init(USART1, &USART_InitStructure);/* Enable USART1 Receive and Transmit interrupts */USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//USART_ITConfig(USART1, USART_IT_TC, ENABLE);/* Enable the USART1 */USART_Cmd(USART1, ENABLE);}注意在初始化串口的时候别忘了485芯片设为发送状态接下来主要就是数据包的发送,发送的时候注意起始码的数据第九位设为0,调光数据第九位设为1.void DMX_SendPacket(void){pDMX_buf = 0;while (pDMX_buf <= 512) //1-512{/* send data packet to slaves*/if(USART1->SR & (1<<6)){/*发送起始码00*/if (0 == pDMX_buf){USART1->DR = ((USART1->DR) & 0xfe00); //第九位置0}else{USART1->DR = 0x0100 | DMX_buf[pDMX_buf]; //第九位置1}pDMX_buf++;}}}在main函数中进行循环数据的发送了,每200ms发送一次,由于发送快,偶尔的错误也不是很明显。

RS232与RS485串行接口转换电路及其编程实现


・ 9・ 6
R 2 2与 R 4 5串行 接 口转 换 电路及 其编 程 实现 S3 S8
胡 玮 ,魏 伟
( 中科技大学电气学院 , 华 武汉 4 07 ) 3 04
摘要 :文章给 出了一种通用 R 22一R 45串口通信转换 器的硬件 结构和程序 实现。介 绍 了该 转换 器在 电路 测试技 术课 程 S3 S8
实 现 R 2 2与 R 4 5间的转换 。 s3 S8
电工 实验 台数字仪 表数 据采集 系统 的结构 如 图 1 所示 。在系 统 中 ,主控计 算机 为普 通 的 8 X 6系 08 列 微机 ,下位机 为 8 5 系 列的单 片机应 用 系统 ( 01 包
现实验 数据误 差 大而登 记重 新做 实验 的现象 。 作 者在 电路 测试技 术 电子实 验报告 软件 开发 中 完 成 了数字仪 表数 据采 集 R 22一R 45串 口通 信 S3 S8 转换 器 的研制 工作 。本 文将 给出转 换器 硬件结 构 图 和软件 编程节 选 ,探讨 完成后 的电子实 验报告 软件
通 信 中使 用最广 泛 的接 口电路 。R 45接 口电路采 S8
用 平衡差 分结构 ,且 收发器 共用 总线 。其最 大 的优
件 平 台制作 完成 。通过 使用该 软 件 ,学 生可 以在课 堂上完 成实 验 的同时完 成实 验报告 ,并 在 网络打 印
机上打印出来。学生使用电子实验报告可以当堂完 成 当堂改正 。由于 有 P p e软 件进 行 电路 的仿 真 , si c
在 电工 实验 台上使 用 的普 通计 算机 输 出串 口为
I
l
l下位机 J2下位机 * J
R 45 I R 45 5 . 8 I ¥ 8

RS485通讯原理及排错处理

提高RS485通信可靠性的设计方法发布时间:2009-5-11 14:00 发布者:李宽阅读次数:556RS-485接口芯片能担当起一种电平转化的角色,把TTL信号、COMS信号等转化为能在485总线上传输的差分信号,把接收到的485差分信号转化为MCU能够识别的TTL或COMS电平,在工业控制、仪器、仪表、多媒体网络、机电一体化产品等诸多领域得到了广泛应用。

但在RS485通信中,常常会存在通信距离不远、通信质量差等问题。

为提高RS485的通信质量,除了采用终端匹配的总线型结构外,在系统设计中通常要考虑以下几个问题。

1.故障保护根据RS-485的标准规定,接收器的接收灵敏度为±200mV,这意味着当接收端的差分电压大于等于+200mV时,接收器输出为高电平,小于等于 -200mV时输出为低电平,介于±200mV 之间时,接收器输出为不确定状态。

在总线空闲(即传输线上所有节点都为接收状态)以及传输线开路或短路故障时,若不采取特殊措施,接收器可能输出高电平或者低电平。

一旦某个节点的接收器产生低电平,就会使串行接收器(UART)找不到起始位,从而引起通信异常。

为解决该问题,很多RS485接口芯片引入了故障保护。

例如,上海英联电子的UM3085/UM3088输入灵敏度为-50mV/-200mV,即差分接收器输入电压UA-B≥-50mV时,接收器输出逻辑高电平,如果UA-B≤-200mV,则输出逻辑低电平。

当接收器输入端总线短路或总线上所有发送器被禁止时,接收器差分输入端为0V,从而确保总线空闲、短路时接收器输出高电平。

2.防雷电冲击RS- 485接口芯片在使用、焊接或设备的运输途中都有可能受到静电冲击而损坏。

在传输线架设于户外的使用场合,接口芯片乃至整个系统还有可能遭受雷电袭击。

选用抗静电或抗雷击的芯片可有效避免此类损失。

UM3085/UM3088芯片内部集成了ESD保护电路,人体模型ESD 保护和机器模型ESD保护分别达到 15kV和2kV。

STM32F407VGT6的485通信程序【SP34

【SP3485芯片&xx 接收】本例程为 STM32F4XX (M4 内核)的 485通信程序,采用串口 1 发送和接收 数据,中断接收,将接收到的数据重新发送出去。

主函数文件如下:#include ""/**********************************************************\**名 :**************************************** 工作环境 :RealView MDK-ARM************************************功能:RS485通过串口 1发送,中断接收!将接收到 ***** 的数据通过再次发送出去*********************、************************************************ **********/extern void uart_init(void);extern void USART1_SendByte(u8 Data);extern unsigned char UART1_GetByte(u8 GetData);extern void delay(unsigned int dl);void delay(unsigned int dl){unsigned int i,y; for(i = 0; i < 5000; i++){for(y = 0; y < dl; y++);}static void led_init(void){** 库版本: ********* ** 作者:曾有根 *************************************** 生成日期 :2012- 文件 ********************* 08-03GPIO_InitTypeDef GPIO_InitStructure;/* Enable the GPIO_LED Clock */RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE, ENABLE);/* Configure the GPIO_LED pin */= GPIO_Pin_7 | GPIO_Pin_8 ;= GPIO_Mode_OUT;= GPIO_OType_PP;= GPIO_PuPd_UP;= GPIO_Speed_50MHz;GPIO_Init(GPIOE, &GPIO_InitStructure);}int main(void){uart_init();led_init();while (1){USART1_SendByte(0x12);GPIO_SetBits(GPIOE, GPIO_Pin_7 ); //LED1 灯闪烁,表示数据发送完成delay(1000);GPIO_ResetBits(GPIOE, GPIO_Pin_7 ); delay(1000);}} 串口配置程序,文件如下:#include "" extern void delay(unsigned int dl);#define TX_485 GPIO_SetBits(GPIOA,GPIO_Pin_8);#define RX_485 GPIO_ResetBits(GPIOA,GPIO_Pin_8); void USART1_SendByte(u8 SendData){TX_485;〃打开发送控制端delay(10);〃延时,这个必须加上,不加会导致数据出错USART_SendData(USART1,SendData);// 发送数据while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);// 等待数据发送完成delay(10);RX_485;〃关闭发送控制端unsigned char UART1_GetByte(u8 MidData) {RX_485;〃打开接收控制端delay(10);〃延时,同样必须加上MidData = USART_ReceiveData(USART1);// 接收数据delay(10);TX_485;〃关闭接收控制端return MidData;}void USART1_IRQHandler(u8 GetData){u8 BackData;if(USART_GetlTStatus(USART1, USART_IT_RXNE) != RESE断产生{GetData = UART1_GetByte(BackData);// 直接读取寄存器的数据也行GetData = USART1->DR;USART1_SendByte(GetData);// 发送数据GPIO_SetBits(GPIOE, GPIO_Pin_8 );//LED2 灯闪烁,表示数据接收成功且发送完成delay(1000);GPIO_ResetBits(GPIOE, GPIO_Pin_8 );}}void uart_init(void){USART_InitTypeDef USART_InitStructure;NVIC_InitTypeDef NVIC_InitStructure;GPIO_InitTypeDef GPIO_InitStructure;/* Enable GPIO clock */RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);/* Enable USART clock */RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);/* ConnectUSART pins to A9\10 */GPIO_PinAFConfig(GPIOA, GPIO_PinSource9,GPIO_AF_USART1);GPIO_PinAFConfig(GPIOA, GPIO_PinSource10,GPIO_AF_USART1);/* Configure USART Tx and Rx as alternate function push-pull */= GPI0_Pin_9;/输出TX= GPIO_Speed_50MHz;=GPIO_Mode_AF;/必须为AF,OUT不行= GPIO_OType_PP;= GPIO_PuPd_UP;GPIO_Init(GPIOA, &GPIO_InitStructure);=GPIO_Pin_10;/输入RX=GPIO_Mode_AF;/必须为AF与M3 不同GPIO_Init(GPIOA, &GPIO_InitStructure);= GPIO_Pin_8 ;//485使能端配置= GPIO_Mode_OUT;= GPIO_OType_PP;= GPIO_PuPd_UP;= GPIO_Speed_50MHz;GPIO_Init(GPIOA, &GPIO_InitStructure);= 115200;= USART_WordLength_8b;= USART_StopBits_1;= USART_Parity_No;= USART_HardwareFlowControl_None;= USART_Mode_Rx | USART_Mode_Tx;USART_Init(USART1, &USART_InitStructure);NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);= USART1_IRQn;= 1;= ENABLE;NVIC_Init(&NVIC_InitStructure);/* Enable USART */USART_Cmd(USART1, ENABLE);USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);USART_ClearFlag(USART1, USART_FLAG_TC);}说明:已经经本人下载至STM32F 4的开发板上成功调试,并且能够正确的收发数据!可供广大奋斗在前线的机油们参考!= 0;。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
相关文档
最新文档