rs485通信程序

合集下载

rs485接线

rs485接线

RS485接线1. 介绍RS485是一种常用的串行通信协议,适用于远距离、高速数据传输。

在RS485通信中,接线的正确性对传输效果非常重要。

本文将详细介绍RS485接线的步骤和注意事项。

2. RS485接线步骤2.1 准备所需材料在进行RS485接线前,需要准备以下材料:•RS485通信设备•适配器或转换器•网线2.2 连接RS485设备首先,将RS485通信设备连接到计算机或控制台设备。

通常,RS485设备具有标准的串口接口,可以直接连接到计算机的串口。

如果计算机没有串口接口,可以使用串口转USB 的适配器。

2.3 连接适配器或转换器如果RS485设备的接口类型与计算机或控制台设备的接口类型不匹配,需要使用适配器或转换器来实现连接。

适配器或转换器可以将RS485信号转换为计算机或控制台设备可识别的信号。

2.4 连接网线在进行RS485通信之前,在RS485设备之间需要使用网线进行连接。

通常,RS485设备具有两个端口,分别是A端口和B端口。

将A端口与另一个设备的B端口相连,并将B端口与另一个设备的A端口相连,形成一个环形拓扑结构。

3. RS485接线注意事项在进行RS485接线时,需要注意以下事项:3.1 线序匹配在连接RS485设备之前,需要确保A端口与B端口的线序匹配。

A端口的信号线应与B端口的信号线相连接,保持一致。

线序不匹配会导致通信中断或数据传输错误。

3.2 终端电阻设置在RS485通信线的两端,需要设置终端电阻以提高通信质量。

终端电阻一般为120欧姆,分别连接在A端口和B端口的末端。

3.3 接地连接在进行RS485接线时,需要确保设备之间的接地连接良好。

正确的接地连接可以减少干扰和噪音,提高通信的可靠性。

3.4 监测信号质量在进行RS485通信之前,建议使用专业的仪器来监测信号质量。

通过监测信号质量,可以及时发现并解决通信中的问题,确保数据的准确传输。

4. 总结本文介绍了RS485接线的步骤和注意事项。

三菱fx3u485无协议通讯程序详解(含程序)

三菱fx3u485无协议通讯程序详解(含程序)

串行通讯指令(FNC 80 RS)1、指令格式: [RS D0 K8 D10 K8]发送数据帧起始地址和数目↓接收数据帧起始地址和数目2、功能和动作:※ RS指令是为使用RS232C、RS-485功能扩展板及特殊适配器,进行发送和接收串行数据的指令。

※传送的数据格式在后面讲述的特殊寄存器D8120设定。

RS指令驱动时即使改变D8120的设定,实际上也不接收。

※在只发送的系统中,可将接收数设定为K0。

(K表示常数)※在只接收的系统中,可将发送数设定为K0。

※在程序中可以多次使用RS指令,但在同一时间必须保证只有一个RS指令被驱动。

※在一次完整的通讯过程中,RS指令必须保持一直有效,直至接收数据完成。

D8120说明:※根据MD320的通讯协议,无帧头和帧尾,则(bit9,bit8)=(0,0)。

※ bit13~15是计算机链接通讯时的设定项目,使用RS指令时必须设定为0。

※ RS485未考虑设置控制线的方法,使用FX2N-485-BD、FX0N-485ADP时,(bit11,bit10 )=(1,1)。

※若PLC和变频器之间的通讯参数如下:8位数据位,无校验,2位停止位,波特率9600,无帧头无帧尾,无协议模式,则D8120=H0C89(H表示16进制)(0000 1100 1000 1001B)M8002│──||────────── [ MOV H0C89 D8120 ]5、相关标志位:一.基本指令介绍※ M8122:数据发送请求标志当PLC处于接收完成状态或接收等待状态时,用脉冲触发M8122,将使得从D0开始的连续8个数据被发送。

当发送完成后,M8122自动被复位。

当RS指令的驱动输入X0变为ON状态时,PLC就进入接收等待状态。

※ M8123:数据接收完成标志当M8123置位时,表明接收已经完成,此时需要将接收到的数据从接受缓冲区转移到用户指定的数据区,然后手工复位M8123。

复位M8123后,则PLC再次进入接收等待状态。

详解RS485通讯程序代码及技术介绍

详解RS485通讯程序代码及技术介绍
void UART_Puts(unsigned char *Str) { if(*Str) //字符串结束 {
} } //主函数 void main() { DDRD|=BIT(PD2); //PORTD|=BIT(PD2); USART_Init(); //UART_Puts("\r\n 你发送的字符串是:");//发送字符串 PORTD&=~BIT(PD2); DDRD|=BIT(PD2); while(1) { if(RX_Flag)
{
PORTD|=BIT(PD2);
//UART_Puts();
USART_Send('1');
//USART_Send(RX_Buffer);
RX_Flag=0;
PORTD&=~BIT(PD2);
PORTD|=BIT(PD2);
//UART_Puts();
USART_Send('2');
//USART_Send(RX_Buffer);
HART 网络:HART 是由现在的艾默生提出一个过度性总线标准,他主要是在 4~20 毫安电流信号上面叠加数字信号,物理层采用 BELL202 频移键控技术,以 实现部分智能仪表的功能,但此协议不是一个真正意义上开放的标准,要加入他 的基金会才能拿到协议,加入基金会要一部分的费用。技术主要被国外几家大公 司垄断,近两年国内也有公司再做,但还没有达到国外公司的水平。现在有很大 一部分的智能仪表都带有 HART 圆卡,都具备 HART 通讯功能。但从国内来看还没 有真正利用其这部分功能,最多只是利用手操器对其进行参数设定,没有发挥出 HART 智能仪表应有的功能,没有联网进行设备监控。从长远来看由于 HART 通信 速率低组网困难等原因,HART 仪表的采购量会程下滑趋势,但由于 HART 仪表已 经有十多年的历史现在在装数量非常的大,对于一些系统集成商来说还有很大的 可利用空间。

基于单片机温度控制系统RS485通信

基于单片机温度控制系统RS485通信
switch(x)
{
case 1:
address = 0x80 + y;
break;
case 2:
address = 0xc0 + y;
break;
default:
address = 0x80 + y;//若果输入的不是第1、2行的行的话,默认在第1行显示
break;
}
address = address - 1;
void LCD1602_char(unsigned char x,unsigned char y, char ddata);//单字符显示函数
void LCD1602_string(unsigned char x,unsigned char y, unsigned char *p);//字符串显示函数
/**************************主函数*****************************/
void main()
{
LCD_init();//1602初始化
KEY_Init();//按键初始化
Delay_xms(10);
while(1)
{
LCD1602_string(1,1,str1);
switch(x)
{
case 1:
address = 0x80 + y;
break;
case 2:
address = 0xc0 + y;
break;
default:
address = 0x80 + y;
break;
}
address = address - 1;
while(1)
{

RS485通信原理图及程序实例详解

RS485通信原理图及程序实例详解

RS485通信原理图及程序实例详解RS232 标准是诞⽣于 RS485 之前的,但是 RS232 有⼏处不⾜的地⽅:接⼝的信号电平值较⾼,达到⼗⼏ V,使⽤不当容易损坏接⼝芯⽚,电平标准也与TTL 电平不兼容。

传输速率有局限,不可以过⾼,⼀般到⼀两百千⽐特每秒(Kb/s)就到极限了。

接⼝使⽤信号线和 GND 与其它设备形成共地模式的通信,这种共地模式传输容易产⽣⼲扰,并且抗⼲扰性能也⽐较弱。

传输距离有限,最多只能通信⼏⼗⽶。

通信的时候只能两点之间进⾏通信,不能够实现多机联⽹通信。

针对 RS232 接⼝的不⾜,就不断出现了⼀些新的接⼝标准,RS485 就是其中之⼀,它具备以下的特点:采⽤差分信号。

我们在讲 A/D 的时候,讲过差分信号输⼊的概念,同时也介绍了差分输⼊的好处,最⼤的优势是可以抑制共模⼲扰。

尤其当⼯业现场环境⽐较复杂,⼲扰⽐较多时,采⽤差分⽅式可以有效的提⾼通信可靠性。

RS485 采⽤两根通信线,通常⽤ A 和 B 或者 D+和D-来表⽰。

逻辑“1”以两线之间的电压差为+(0.2~6)V 表⽰,逻辑“0”以两线间的电压差为-(0.2~6)V 来表⽰,是⼀种典型的差分通信。

RS485 通信速率快,最⼤传输速度可以达到 10Mb/s 以上。

RS485 内部的物理结构,采⽤的是平衡驱动器和差分接收器的组合,抗⼲扰能⼒也⼤⼤增加。

传输距离最远可以达到 1200 ⽶左右,但是它的传输速率和传输距离是成反⽐的,只有在 100Kb/s 以下的传输速度,才能达到最⼤的通信距离,如果需要传输更远距离可以使⽤中继。

可以在总线上进⾏联⽹实现多机通信,总线上允许挂多个收发器,从现有的 RS485芯⽚来看,有可以挂 32、64、128、256 等不同个设备的驱动器。

RS485 的接⼝⾮常简单,与 RS232 所使⽤的 MAX232 是类似的,只需要⼀个 RS485转换器,就可以直接与单⽚机的 UART 串⼝连接起来,并且使⽤完全相同的异步串⾏通信协议。

PLC资料:三菱PLC RS485通讯使用教程(带示例)

PLC资料:三菱PLC RS485通讯使用教程(带示例)

通信
一、联机方式
自动化生产线各工作站中PLC之间通过RS-485串行通信的方式实现互连,构成分布式的控制系统。

二、N:N网络功能
N:N网络功能,就是在最多8台FX可编程控制器之间,通过RS-485通信连接,进行软元件相互连接。

1)根据要链接的点数,有3种模式可以选择。

2)数据的链接是在最多8台FX可编程控制器之间自动更新。

3)总延长距离最大可达500m。

三、链接模式及链接点数
四、N:N网络接线图
五、N:N网络中使用的软元件如下:
1.N:N网络设定用的软元件
是用于设定N:N网络的软元件。

使用N:N网络时,必须设定下列的软元件。

2.判断N:N网络错误用的元件
用于判断N:N网络错误。

请将链接错误输出到外部,并在顺控程序的互锁等中使用。

3. 链接软元件
是用于发送接收各可编程控制器之间的信息的软元件。

根据在相应站号设定中设定的站号,以及在刷新范围设
定中设定的模式不同,使用的软元件编号及点数也有所不同。

1)模式0时
2) 模式1时
3) 模式2时
三菱PLC 485通讯示例(2个PLC)
题目:
按下SB1(0#PLC 的X0),灯L1(1#PLC 的Y0)亮。

按下SB2(1#PLC 的X1),灯L2(0#PLC 的Y1)亮。

通讯线连接方式:
主站程序:
从站程序:。

RS485通信示例程序

RS485通信示例程序

RS485通信示例程序看程序时请配合芯片资料一起看,公布源码不是为了抄袭,而是为了相互学习,如果有不对的地方还请指出来,谢谢!/*===================================================== ===程序说明:PC端通过RS232-RS485芯片转换后再经过一个RS485收发芯片MAX485连接单片机的RX和TX(RO-RX,DI-TX)的通信示例程序控制发送和接收的引脚为P2.7,使用时注意正确连接!作者:绘天地点:成都信息工程学院====================================================== ==*/#include <reg52.h>#include "com_communication.h"sbit SHRL=P2^7;/*高电平发送,低电平接收*/void main(){int c;UartInit();SHRL=0;/*保持为发送状态*/while(1){if ( RI ) //如果收到数据{RI = 0; //清除接收标志c = SBUF; //读取收到的数据SHRL=1;UartSendChar(c); //回送收到的数据SHRL=0;}}}所调用的头文件:#ifndef _com_H_#define _com_H_//定义波特率(取值1200、2400、4800、9600、19200等)#define BaudRate 19200L/*********************************************************************** ********函数:UartInit()功能:串行口初始化************************************************************************ *******/void UartInit(){SCON = 0x50; //串口方式1(8位UART),允许接收PCON |= 0x80; //波特率加倍TMOD &= 0x0F; //设置T1为8位自动重装定时器,用于产生波特率TMOD |= 0x20;TH1 = TL1 = 256 - (11059200L / 12) / (16 * BaudRate); //设置T1初值TR1 = 1; //启动T1}/*********************************************************************** ********函数:UartSendChar()功能:通过串行口发送单个字节参数:c是被发送的字节数据,取值0x00~0xFF************************************************************************ *******/void UartSendChar(char c){SBUF = c; //数据写入SBUF,同时启动硬件发送过程while ( !TI ); //等待发送完毕TI = 0; //清除发送标志}#endif。

RS485主从式多机通讯协议

RS485主从式多机通讯协议

RS485主从式多机通讯协议1.RS485简介2.主从式多机通信协议RS485主从式多机通信协议允许一个主设备控制多个从设备,实现主设备与从设备之间的数据传输和通信协调。

主从式通信分为两个角色,即主机和从机。

主机是整个系统的控制中心,负责向从机发送指令和收集数据。

从机是被控制的设备,负责执行主机发送的指令并向主机发送数据。

3.数据传输格式4.通信流程-主机发送请求:主机向从机发送请求指令。

-从机应答:从机接收到请求指令后,执行相应操作,并向主机发送应答数据。

-主机接收应答:主机接收到从机的应答数据。

-主机发送下一个请求:主机根据需要继续发送下一个请求指令,重复上述步骤。

5.地址识别与从机选择在RS485主从式多机通信协议中,每个从机都有一个唯一的地址,主机通过地址来识别并选择要与之通信的从机。

通常采用软件设置的方式,主机在发送请求指令时会将目标从机的地址加入请求帧中,从机在接收到请求帧后,会根据地址判断是否为自己的请求。

6.错误处理机制RS485主从式多机通信协议中,为了保证通信的可靠性,需要引入一些错误处理机制。

例如,可以使用CRC校验来检测数据传输过程中的错误,并进行错误重传。

此外,还可以使用超时机制来处理通信过程中出现的超时情况。

7.适用范围总结:RS485主从式多机通信协议是一种常用于工业控制领域的通信标准。

它采用主从式通信模式,支持一个主设备控制多个从设备。

数据传输以帧为单位,采用差分技术提高信号传输的可靠性和抗干扰能力。

通信流程包括主机发送请求、从机应答、主机接收应答和主机发送下一个请求。

地址识别与错误处理机制是确保通信可靠性的重要部分。

RS485主从式多机通信协议适用于工业自动化等环境中的数据传输和控制应用。

基于rs485的串口通信编程实验心得

基于rs485的串口通信编程实验心得

基于RS485的串口通信编程实验心得一、实验背景1.1 RS485串口通信RS485是一种应用广泛的串行通信标准,它可以在远距离、高噪声环境下传输数据。

RS485串口通信使用差分信号传输数据,可以实现多机通信和多点通信,适用于工业控制领域和数据采集系统。

1.2 串口通信编程串口通信编程是利用计算机与外部设备进行数据交换的一种方式。

在实际应用中,我们可以通过串口与传感器、执行器等设备进行数据交互,实现对外部设备的监控和控制。

二、实验过程2.1 实验准备在进行RS485串口通信编程实验之前,我们需要准备一台计算机、RS485串口转换器、外部设备(如温度传感器、风速传感器等)以及相关的编程软件(如C、C++、Python等)。

2.2 硬件连接我们需要将RS485串口转换器与计算机连接,并将外部设备与RS485串口转换器连接。

在硬件连接上,需要注意信号线的接线方式,以及串口转换器的设置。

2.3 编程实现根据实验要求,我们可以选择合适的编程语言进行串口通信程序的编写。

在编程实现中,需要注意串口的初始化、数据的发送和接收、错误处理等方面的问题。

还需要考虑数据的解析和处理方法,保证数据的准确性和完整性。

2.4 调试测试编写完成串口通信程序之后,需要进行调试测试,确保程序能够正常运行。

在测试过程中,我们可以通过监控数据的发送和接收情况,以及外部设备的响应情况,来验证程序的正确性。

三、实验心得3.1 技术难点在进行RS485串口通信编程实验的过程中,我们遇到了一些技术难点。

在设置串口参数时,需要对波特率、数据位、停止位、校验位等参数进行正确的配置,以保证数据的准确传输;另外,在数据的解析和处理过程中,也需要针对不同的数据格式进行相应的处理,确保数据的正确解析。

3.2 解决方法针对技术难点,我们通过查阅资料、交流专家以及不断的实践和调试,最终找到了相应的解决方法。

在串口参数设置方面,我们可以参考数据手册或相关资料,了解串口参数的含义和设置方法;在数据解析和处理方面,我们可以根据数据格式和协议,编写相应的解析程序,以实现数据的准确解析和处理。

stm32 rs485解析程序实例

stm32 rs485解析程序实例

stm32 rs485解析程序实例在STM32中实现RS485通信,你需要使用UART(通用异步收发器)硬件模块,并配置其RS485模式。

下面是一个简单的RS485解析程序实例,以STM32 HAL库为例。

首先,你需要配置UART并开启RS485模式。

以下是一个示例:```cvoid MX_RS485_UART_Init(void){= USART2;= 115200;= UART_WORDLENGTH_8B;= UART_STOPBITS_1;= UART_PARITY_NONE;= UART_MODE_TX_RX;= UART_HWCONTROL_NONE;= UART_OVERSAMPLING_16;if (HAL_UART_Init(&huart2) != HAL_OK){Error_Handler();}// Enable RS485 mode__HAL_UART_ENABLE_IT(&huart2, UART_IT_REACK); __HAL_UART_DISABLE_IT(&huart2, UART_IT_TEACK); __HAL_UART_ENABLE_IT(&huart2, UART_IT_RWUID); __HAL_UART_ENABLE_IT(&huart2, UART_IT_RXNE); __HAL_UART_ENABLE(&huart2);}```然后,你可以在中断服务程序中处理接收到的数据:```cvoid USART2_IRQHandler(void){HAL_UART_IRQHandler(&huart2);}```在`HAL_UART_IRQHandler`函数中,你可以处理接收到的数据:```cvoid HAL_UART_IRQHandler(UART_HandleTypeDef huart){if(__HAL_UART_GET_FLAG(huart, UART_FLAG_REACK) != RESET) // RS485 Receiver Mode ACK reception{__HAL_UART_CLEAR_FLAG(huart, UART_FLAG_REACK);// Handle received data here...}}```以上代码只是一个基本的示例,你可能需要根据你的实际需求进行修改。

三菱FX2N与三菱D700变频器利用MODBUS协议通过RS485通信的设置方法及配套程序

三菱FX2N与三菱D700变频器利用MODBUS协议通过RS485通信的设置方法及配套程序

三菱FX2N与三菱D700变频器利用MODBUSRTU协议通过RS485通信的设置
方法及配套程序
三菱FX2N通过RS485与三菱D700变频器可以利用三菱变频器专用协议通信,也可以利用MODBUSRTU方式通信。

网上有很多程序,但程序经网间转载有的不完整,有的程序没有经过验证,看似可以实际不行;再者要想成功通信还要对变频器正确设置,并根据设置确定PLC的通信格式字,稍有差错则通信不成功。

本文对变频器的设置和PLC程序均通过实际验证,切实可行。

变频器设置方法及配套程序如下:
一、三菱FX2N与三菱D700变频器利用MODBUSRTU协议通信控制电动机正转、反转、停止、写入频率、读取变频器输出频率、电流、电压变频器的设置方法:
1、Pr117=1,一号从站
2、Pr118=192,波特率19200
3、Pr119=0,8位数据,停止位1位
4、Pr120=2,偶校验
5、Pr121=9999,通信错误无报警
6、Pr122=9999,通信效验终止
7、Pr123=9999,由通信数据确立
8、Pr124=0,无CR无LF
9、Pr549=1,MODBUSRTU协议。

485通信程序实例

485通信程序实例
sbit SD_7 = SData^7;
bdata uchar Repeater_Address _at_ 0x26; //中继器地址
sbit RA_0 = Repeater_Address^0;
sbit PaOData4 = PaOData^4;
sbit PaOData5 = PaOData^5;
sbit PaOData6 = PaOData^6;
sbit PaOData7 = PaOData^7;
s; //收到上位机对下位机的广播信号(时间、日期)
sbit Com1Data_Sent = Status2^5; //串口1已发送一字节
sbit tem_bit = Status2^6; //临时位变量
sbit Com1_Finished = Status2^7; //串口1数据已接收完毕
bdata uchar Status3 _at_ 0x22; //中继器状态标志
sbit Alarm_Over = Status3^0; //掉电时下位机侧传来的报警数据结束
sbit RA_7 = Repeater_Address^7;
bdata uchar Repeater_Status _at_ 0x27; //中继器状态标志位
sbit DHead_Arrived = Repeater_Status^0;
uchar data R_P_Data_Buf1 _at_ 0x33; //Com2读数据缓冲区指针1
uchar data W_P_Data_Buf2 _at_ 0x34; //并口写数据缓冲区指针2
uchar data R_P_Data_Buf2 _at_ 0x35; //并口读数据缓冲区指针2

三菱FX3U 485无协议通讯程序详解(含程序)

三菱FX3U 485无协议通讯程序详解(含程序)

三菱FX2N PLC串行通讯指令(FNC 80 RS)串行通讯指令(FNC 80 RS)1、指令格式:[RS D0 K8 D10 K8]发送数据帧起始地址和数目↓接收数据帧起始地址和数目2、功能和动作:※RS指令是为使用RS232C、RS-485功能扩展板及特殊适配器,进行发送和接收串行数据的指令。

※传送的数据格式在后面讲述的特殊寄存器D8120设定。

RS指令驱动时即使改变D8120的设定,实际上也不接收。

※在只发送的系统中,可将接收数设定为K0。

(K表示常数)※在只接收的系统中,可将发送数设定为K0。

※在程序中可以多次使用RS指令,但在同一时间必须保证只有一个RS指令被驱动。

※在一次完整的通讯过程中,RS指令必须保持一直有效,直至接收数据完成。

D8120说明:※根据MD320的通讯协议,无帧头和帧尾,则(bit9,bit8)=(0,0)。

※bit13~15是计算机链接通讯时的设定项目,使用RS指令时必须设定为0。

※RS485未考虑设置控制线的方法,使用FX2N-485-BD、FX0N-485ADP时,(bit11,bit10 )=(1,1)。

※若PLC和变频器之间的通讯参数如下:8位数据位,无校验,2位停止位,波特率9600,无帧头无帧尾,无协议模式,则D8120=H0C89(H表示16进制)(0000 1100 1000 1001B)M8002│──||────────── [ MOV H0C89 D8120 ]5、相关标志位:一.基本指令介绍※M8122:数据发送请求标志当PLC处于接收完成状态或接收等待状态时,用脉冲触发M8122,将使得从D0开始的连续8个数据被发送。

当发送完成后,M8122自动被复位。

当RS指令的驱动输入X0变为ON状态时,PLC就进入接收等待状态。

※M8123:数据接收完成标志当M8123置位时,表明接收已经完成,此时需要将接收到的数据从接受缓冲区转移到用户指定的数据区,然后手工复位M8123。

三菱FX2N与伟创AC70变频器利用MODBUS协议通过RS485通信的设置方法及配套程序

三菱FX2N与伟创AC70变频器利用MODBUS协议通过RS485通信的设置方法及配套程序

三菱FX2N与伟创AC70-T3-5R5G/7R5G 变频器利用MODBUSRTU协议通过RS485通信的设置方法及配套程序三菱FX2N通过RS485与伟创AC70-T3-5R5G/7R5G变频器可以利用MODBUSRTU方式通信。

网上有很多程序,但程序经网间转载有的不完整,有的程序没有经过验证,看似可以实际不行;再者要想成功通信还要对变频器正确设置,并根据设置确定PLC的通信格式字,稍有差错则通信不成功。

本文利用PLC和触摸屏对变频器进行正反转及停止控制,并时时读取变频器的输出频率、电流、电压,并将读取的输出量显示在昆仑通态7062KD触摸屏上。

变频器的设置、PLC程序、触摸屏程序均通过实际验证,切实可行。

变频器设置方法及配套程序如下:
一、三菱FX2N PLC与伟创AC70-T3-5R5G/7R5G变频器利用MODBUSRTU 协议通信控制电动机正转、反转、停止、写入频率、读取变频器输出频率、电流、电压。

变频器参数的设置如下:
1、E-01=2,运行命令给定通道选择:RS485通信端口控制
2、E-02=6,频率给定主通道选择:主通道给定频率由 RS485 通讯端口(A+)和(B-)接收的信号控制。

3、E-03=6,频率给定辅助通道选择:RS485 通讯端口
4、E-05=0,频率给定通道组合方式:0 主通道有效,辅助通道无效
5、H-66=0,联动主站设置:0本变频器作联动从站
6、H-67=1,本机地址:1,本机通讯地址为1.。

单片机RS485通信接口、控制线、原理图及程序教学实例

单片机RS485通信接口、控制线、原理图及程序教学实例

单片机RS485通信接口、控制线、原理图及程序教学实例[前言]RS232 标准是诞生于RS485 之前的,但是RS232 有几处不足的地方:接口的信号电平值较高,达到十几V,使用不当容易损坏接口芯片,电平标准也与TTL 电平不兼容。

传输速率有局限,不可以过高,一般到一两百千比特每秒(Kb/s)就到极限了。

接口使用信号线和GND 与其它设备形成共地模式的通信,这种共地模式传输容易产生干扰,并且抗干扰性能也比较弱。

传输距离有限,最多只能通信几十米。

通信的时候只能两点之间进行通信,不能够实现多机联网通信。

针对RS232 接口的不足,就不断出现了一些新的接口标准,RS485 就是其中之一。

RS232 标准是诞生于RS485 之前的,但是RS232 有几处不足的地方:接口的信号电平值较高,达到十几V,使用不当容易损坏接口芯片,电平标准也与TTL 电平不兼容。

传输速率有局限,不可以过高,一般到一两百千比特每秒(Kb/s)就到极限了。

接口使用信号线和GND 与其它设备形成共地模式的通信,这种共地模式传输容易产生干扰,并且抗干扰性能也比较弱。

传输距离有限,最多只能通信几十米。

通信的时候只能两点之间进行通信,不能够实现多机联网通信。

针对RS232 接口的不足,就不断出现了一些新的接口标准,RS485 就是其中之一,它具备以下的特点:采用差分信号。

我们在讲A/D 的时候,讲过差分信号输入的概念,同时也介绍了差分输入的好处,最大的优势是可以抑制共模干扰。

尤其当工业现场环境比较复杂,干扰比较多时,采用差分方式可以有效的提高通信可靠性。

RS485 采用两根通信线,通常用A 和B 或者D+和D-来表示。

逻辑1以两线之间的电压差为+(0.2~6)V 表示,逻辑0以两线间的电压差为-(0.2~6)V 来表示,是一种典型的差分通信。

RS485 通信速率快,最大传输速度可以达到10Mb/s 以上。

RS485 内部的物理结构,采用的是平衡驱动器和差分接收器的组合,抗干扰能力也大大增。

RS-485 原理与驱动程序

RS-485 原理与驱动程序
《物联网应用技术》
第三章 传感器网应用开发 RS-485 原理与驱动程序
点击此处结束放映
《物联网应用技术》
RS-485 原理与驱动程序
目录 01 02 CONTENTS
RS485基础 RS485驱动程序
《物联网应用技术》
--- 1_RS485基础
通讯协议 之硬件层 协议介绍
01
通信协议
硬件层协议
★为避免强电对其干扰,485总线应避免和强电走在一起。
《物联网应用技术》
--- 2_RS485驱动程序
软件层协议:即通讯协议,用于不同厂商之间的设备交换数据(一般是
工业用途);所谓协议,也可以理解为上面有人说的“语言”吧,简单的 说是软件。
主从模式: 1.系统中只能有一个主机
485 总 线 与
2.任何时候所有从机不能给主机主动发送数据
RS485网络 的实现方式
04
RS-485通信线错误示范
《物联网应用技术》
--- 1_RS485基础
3)RS-485连接方式 RS485工业总线标准要求各设备之间采用链条式连接方式,两头 必须接有120Ω终端电阻。
RS485网络 的实现方式
04
《物联网应用技术》
--- 1_RS485基础
4)RS-485网络施工中的注意事项:
设备1
《物联网应用技术》
--- 1_RS485基础
485
A当MCU发出0时,485转换器出来的电平是0:Vb>Va
01011101
485
设备2
当MCU发出1时,485转换器出来的电平是1:Va>Vb
单片机管 脚输出 TTL
当输出0时 小于0.4V 当输出为1时 大于2.4V

C51很简洁易懂的RS458串口通信接收发送程序

C51很简洁易懂的RS458串口通信接收发送程序
void delay(unsigned char i)
{
unsigned char j;
for(i; i > 0; i--)
for(j = 200; j > 0; j--);
}
void main (void) {
SCON = 0x50; //REN=1允许串行接受状态,串口工作模式1
TMOD|= 0x20; //定时器工作方式2
#include <REG52.H>
#include <stdio.h>
sbit RS485E=P3^7; //定义485的使能脚
bit SendFlag;
unsigned int ReData,SenData;
/**************************************
延时程序
**************************************/
SBUF=SenData;//发送数据
delay(50);
}
else
{
RS485E=0;//接收状态
}
}
}பைடு நூலகம்
/****************************************************
串口中断程序
******************************************************/
SendFlag = 1;
}
}
PCON|= 0x80;
//TH1 = 0xFD; //baud*2 /* reload value 19200、数据位8、停止位1。效验位无(11.0592)
TH1 = 0xF3;// //baud*2 /*波特率4800、数据位8、停止位1。效验位无(12M)

WindowsXPRS485通讯测试程序

WindowsXPRS485通讯测试程序

WindowsXP/2000下RS485通讯测试程序此测试程序为WindowsXP/2000下的测试工具。

操作说明:1. 把COM1,COM2的设置成RS485, 。

2. 用短接线把的COM1,COM2连接好,即COM1的5/7与COM2的5/7直接连接。

3. 进入系统, 运行RS485Test.exe。

4. 选择要测试的COM口, 工作模式,CHANGE COM MODE:SEND OR READ(S OR R)在这里选择是要发送还是接收。

回车5. 如果COM1,COM2出现相应的字符既表示这2个串口工作正常。

#include <stdio.h>#include <stdlib.h>#include <string.h>#include "Serial.h"//RS485 测试程序int RS485Test(){unsigned int unComNum1 = 0; //unsigned int unComNum2 = 0;unsigned char ucCom1Mod = 0;unsigned char ucCom2Mod = 0;char chCom[5] = {0};CSerial serial1;CSerial serial2;char buffer[1024] = {0};long lSendCounter = 0;char szSendBuff[1024] = {0};DWORD dwRead = 0;int i = 0;//==================输入COM1的端口号和工作模式===========================// fprintf(stdout, "\nEnter COM1 Number (1,2) : ");// scanf("%d", &unComNum1);unComNum1 = 1;fprintf(stdout, "Change COM1 mode: Send or Read(s or r) : ");scanf("%s", &ucCom1Mod);memset(chCom, 0, 5);sprintf(chCom, "COM%d", unComNum1);BOOL bSer = serial1.InitCOM(chCom, 19200, 8, 0, 0, 1);if (!bSer){fprintf(stdout, "Can't InitCOM Com1.\n");return -1;}//==================输入COM2的端口号和工作模式===========================// fprintf(stdout, "\nEnter COM2 Number (1, 2) : ");// scanf("%d", &unComNum2);unComNum2 = 2;fprintf(stdout, "Change COM2 mode: Send or Read(s or r) : ");scanf("%s", &ucCom2Mod);memset(chCom, 0, 5);sprintf(chCom, "COM%d", unComNum2);bSer = serial2.InitCOM(chCom, 19200, 8, 0, 0, 1);if (!bSer){fprintf(stdout, "Can't InitCOM Com2.\n");return -1;}fprintf(stdout, "Input Send data : ");scanf("%s", szSendBuff);for(int k = 0; k < 10; k++){if( (ucCom1Mod=='s') || (ucCom1Mod=='S') ){serial1.SendData(szSendBuff, strlen(szSendBuff));}if( (ucCom2Mod=='s') || (ucCom2Mod=='S') ){serial2.SendData(szSendBuff, strlen(szSendBuff));}Sleep(100);if( (ucCom1Mod=='r') || (ucCom1Mod=='R') ){memset(buffer, 0, sizeof(buffer));dwRead = serial1.ReadData(buffer, sizeof(buffer));printf("COM1 k=%d, Receive DataLen=%d, Data(HEX): ", k, dwRead);for(i = 0; i < dwRead; i++){printf("%x,", buffer[i]);}printf("\n");}if( (ucCom2Mod=='r') || (ucCom2Mod=='R') ){memset(buffer, 0, sizeof(buffer));dwRead = serial2.ReadData(buffer, sizeof(buffer));printf("COM2 k=%d, Receive DataLen=%d, Data(HEX): ", k, dwRead);for(i = 0; i < dwRead; i++){printf("%x,", buffer[i]);}printf("\n");}}serial1.Close();serial2.Close();return 0;}int main(int argc, char **argv){RS485Test();return 0;}// Serial.cpp: implementation of the CSerial class.//////////////////////////////////////////////////////////////////////////#include <winioctl.h>#include <stdio.h>#include <conio.h>#include <stdlib.h>#include "Serial.h"//////////////////////////////////////////////////////////////////////// Construction/Destruction//////////////////////////////////////////////////////////////////////CSerial::CSerial(){memset(&m_OverlappedRead, 0, sizeof( OVERLAPPED));memset(&m_OverlappedWrite, 0, sizeof( OVERLAPPED));m_hIDComDev= NULL;fWaitingOnRead = FALSE;}CSerial::~CSerial(){Close();}/********************************************************************** **RS-485通讯说明由于RS-485是半双工通信,故同一时刻只能发送或接收。

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

#ifndef __485_C__
#define __485_C__
#include <reg51.h>
#include <string.h>
#define unsigned char uchar
#define unsigned int uint
/* 通信命令 */
#define __ACTIVE_ 0x01 // 主机询问从机是否存在
#define __GETDATA_ 0x02 // 主机发送读设备请求
#define __OK_ 0x03 // 从机应答
#define __STATUS_ 0x04 // 从机发送设备状态信息
#define __MAXSIZE 0x08 // 缓冲区长度
#define __ERRLEN 12 // 任何通信帧长度超过12则表示出错
uchar dbuf[__MAXSIZE]; // 该缓冲区用于保存设备状态信息
uchar dev; // 该字节用于保存本机设备号
sbit M_DE = P1^0; // 驱动器使能,1有效
sbit M_RE = P1^1; // 接收器使能,0有效
void get_status(); // 调用该函数获得设备状态信息,函数代码未给出
void send_data(uchar type, uchar len, uchar *buf); // 发送数据帧
bit recv_cmd(uchar *type); // 接收主机命令,主机请求仅包含命令信息
void send_byte(uchar da); // 该函数发送一帧数据中的一个字节,由send_data()函数调用
void main()
{
uchar type;
uchar len;
/* 系统初始化 */
P1 = 0xff; // 读取本机设备号
dev = (P1>>2);
TMOD = 0x20; // 定时器T1使用工作方式2
TH1 = 250; // 设置初值
TL1 = 250;
TR1 = 1; // 开始计时
PCON = 0x80; // SMOD = 1
SCON = 0x50; // 工作方式1,波特率9600bps,允许接收
ES = 0; // 关闭串口中断
IT0 = 0; // 外部中断0使用电平触发模式
EX0 = 1; // 开启外部中断0
EA = 1; // 开启中断
/* 主程序流程 */
while(1) // 主循环
{
if(recv_cmd(&type) == 0) // 发生帧错误或帧地址与本机地址不符,丢弃当前帧后返回
continue;
switch(type)
{
case __ACTIVE_: // 主机询问从机是否存在
send_data(__OK_, 0, dbuf); // 发送应答信息,这里buf的内容并未用到
break;
case __GETDATA_:
len = strlen(dbuf);
send_data(__STATUS_, len, dbuf); // 发送设备状态信息
break;
default:
break; // 命令类型错误,丢弃当前帧后返回
}
}
}
void READSTATUS() interrupt 0 using 1 // 产生外部中断0时表示设备状态发生改变,该函数使用寄存器组1
{
get_status(); // 获得设备状态信息,并将其存入dbuf指向的存储区,数据最后一字节置0表示数据结束
}
/* 该函数接收一帧数据并进行检测,无论该帧是否错误,函数均会返回
* 函数参数type保存接收到的命令字
* 当接收到数据帧错误或其地址位不为0时(非主机发送帧),函数返回0,反之返回1 */
bit recv_cmd(uchar *type)
{
bit db = 0; // 当接收到的上一个字节为0xdb时,该位置位
bit c0 = 0; // 当接收到的上一个字节为0xc0时,该位置位
uchar data_buf[__ERRLEN]; // 保存接收到的帧
uchar tmp;
uchar ecc = 0;
uchar i;
M_DE = 0; // 置发送禁止,接收允许
M_RE = 0;
/* 接收一帧数据 */
i = 0;
while(!c0) // 循环直至帧接收完毕
{
RI = 0;
while(!RI);
tmp = SBUF;
RI = 0;
if(db == 1) // 接收到的上一个字节为0xdb
{
switch(tmp)
{
case 0xdd:
data_buf[i] = 0xdb; // 0xdbdd表示0xdb
ecc = ecc^0xdb;
db = 0;
break;
case 0xdc
data_buf[i] = 0xc0; // 0xdbdc表示0xc0
ecc = ecc^0xc0;
db = 0;
break;
default
return 0; // 帧错误,返回
}
i++;
}
switch(tmp) // 正常情况
{
case 0xc0: // 帧结束
c0 = 1;
break;
case 0xdb: // 检测到转义字符
db = 1;
break;
default: // 普通数据
data_buf[i] = tmp; // 保存数据
ecc = ecc^tmp; // 计算校验字节
i++;
}
if(i == __ERRLEN) // 帧超长,错误,返回
return 0;
}
/* 判断帧是否错误 */
if(i<4) // 帧过短,错误,返回
return 0;
if(ecc != 0) // 校验错误,返回
return 0;
if(data_buf[0] != dev) // 非访问本机命令,错误,返回
return 0;
*type = data_buf[1]; // 获得命令字
return 1; // 函数成功返回
}
/* 该函数发送一帧数据帧,参数type为命令字、len为数据长度、buf为要发送的数据内容 */
void send_data(uchar type, uchar len, uchar *buf)
{
uchar i;
uchar ecc = 0; // 该字节用于保存校验字节
M_DE = 1; // 置发送允许,接收禁止
M_RE = 1;
send_byte(dev); // 发送本机地址
ecc = dev;
send_byte(type); // 发送命令字
ecc = ecc^type;
send_byte(len); // 发送长度
ecc = ecc^len;
for(i=0; i<len; i++) // 发送数据
{
send_byte(*buf);
ecc = ecc^(*buf);
buf++;
}
send_byte(ecc); // 发送校验字节
TI = 0; // 发送帧结束标志
SBUF = 0xc0;
while(!TI);
TI = 0;
}
/* 该函数发送一个数据字节,若该字节为0xdb,则发送0xdbdd,若该字节为0xc0则,发送0xdbdc */
void send_byte(uchar da)
{
switch(da)
{
case 0xdb: // 字节为0xdb,发送0xdbdd
TI = 0;
SBUF = 0xdb;
while(!TI);
TI = 0;
SBUF = 0xdd;
while(!TI)
TI = 0;
break;
case 0xc0: // 字节为0xc0,发送0xdbdc
TI = 0;
SBUF = 0xdb;
while(!TI);
TI = 0;
SBUF = 0xdc;
while(!TI)
TI = 0;
break;
default: // 普通数据则直接发送
TI = 0;
SBUF = da;
while(!TI);
TI = 0;
}
}
#endif。

相关文档
最新文档