基于RS485的简单现场总线通信系统设计的主从机代码1
一种通过485口实现的主从切换通信方法及系统与流程
一种通过485口实现的主从切换通信方法及系统与流程本文介绍一种通过485口实现的主从切换通信方法及系统与流程。
一、系统概述该系统由一个主设备和多个从设备组成,主设备可以与任意一个从设备通信。
当选中某个从设备后,系统会将这个从设备切换为主设备,从而实现主从之间的通信。
二、系统原理1. 通信协议系统采用Modbus RTU通信协议,主设备向从设备发送读或写请求,并等待从设备的响应。
从设备接收到请求后进行相应的操作,并将结果返回给主设备。
2. 通信连接主设备与每个从设备之间通过485口连接,每个从设备都有一个独立的设备地址。
3. 通信过程(1) 主设备发送查询请求到每个从设备,查询从设备是否可以进行通信。
(2) 如果从设备能够响应,则主设备将从设备的地址存储在自己的映射表中。
(3) 主设备从映射表中选择一个从设备,并发送读或写请求。
如果该从设备没有响应,主设备会从映射表中移除该从设备地址。
(4) 如果某个从设备需要成为主设备,则该从设备会发送一个选中命令,主设备收到命令后将当前从设备从映射表中移除,并将该从设备的地址存储为主设备地址。
(5) 主设备需要定时轮询所有从设备,以确保每个从设备都能够正常工作。
三、系统流程1. 主设备初始化:主设备按照映射表中设备地址依次与每个从设备进行通信,查询哪些从设备能够响应,并将这些从设备地址存储在映射表中。
2. 主从通信:主设备通过映射表选择一个从设备,并发送读或写请求,从设备响应并返回结果。
3. 切换主从:如果某个从设备需要成为主设备,它会发送选中命令,主设备收到选中命令后会将该从设备地址存储为主设备地址,并从映射表中移除该从设备的地址。
4. 轮询从设备:主设备需要定时轮询所有从设备,以确保每个从设备都能够正常工作。
四、总结通过Modbus RTU通信协议,使用485口连接主从设备,可实现主从切换的通信功能。
在系统实现过程中,需要编写相应的程序,具体实现过程需要根据实际需求进行调整。
详解RS485通讯程序代码及技术介绍
} } //主函数 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主从串口通讯协议的设计
一
系统中得到极为广泛的应用 。然而 R s 4 8 5 通讯标准
l丝 竺 塑 f 塑 堡 f墼塑 塑 l 墼 竺 堡 l
收 稿 日期 : 2 0 1 2 — 1 2 — 1 1
作者简 介 : 郝 涛( 1 9 8 6 -) , 男, 湖北 广水 人 , 硕士研究生 , 研究方 向为嵌人式系统与智能信 息处理 ; 陆宣博 ( 1 9 8 6 一) , 男, 广西 钦 州人 , 硕士研究生 , 研究方 向为机 电系统信号处理 。 3 8
R S 4 8 5 总线以其物理结构实现简单 , 只需两根连 主设备可单独和从设备通信 ,也能 以广播方式 线, 便 可实现双工通信 , 占用系统资源较少 , 性能上 和所有从设备通信 。 如果单独通信 , 从设备返 回一消
不但传输距离远 , 最大能传输 3 公里 , 而且传输速度 息作为回应 , 如果是 以广播方式查询的 , 则从设备不 较快 , 最快可达 1 0 M b p s , 抗干扰能力强 , 可满足绝大 作任何 回应。协议建立 了主设备查询的格式有 : 设备
能代码将被修改 以用于指 出回应 消息是错误 的 , 同 息时 , 也把 自己的地址放人 回应 的地址域 中, 以便主 时数据段包含 了描述此错误信息 的代码 。错误检测 设备知道是哪一个设备做 出回应 。地址 0 是用作广 域允许主设备确认 消息内容是否可用。 播地址 , 以使所有的从设备都能认识。 3 . 3 如何处理功能域 消息帧中的功能代码域包含了一个字符 8 B i t s 。
485通讯程序具有主从机功能示例
{
unsigned char a=0x00;
unsigned char j;
do{
SBUF=0x32;
while(TI!=1);
TI=0;
for(j=0;j<len;j++)
{
SBUF=txdbuf[j];
SCON=0xd0; /*串口通信采用方式3*/
PCON=0x80;
TR1=1;
}
/****************************接收数据函数******************************/
void received(unsigned char *rxdbuf,int len)
a=a+rxdbuf[j];
}
while (RI==0)
RI=0;
rxdbuf [len]=SBUF;
if((SBUF^a)==0) /*比较校验和*/
{
SBUF=0x00; /*校验正确发送“0x00”*/
While(TI==0)
TI=0;
break;
}
感谢您对小店的支持,祝您和您的家人生活安康,万事如意
*******************************************************************/
#include<stdio.h>
#include<reg52.h>
#include<intrins.h>
/******如果使用主从模式可以在设置通信方式的时候主设备选择可发送,但不接受。从设备选择只接受不发送,从而避免数据竞争问题*********/
linux下485通讯c语言代码
linux下485通讯c语言代码Linux下的485通讯C语言代码在嵌入式系统和工控领域中,485通讯是一种常见的串行通讯方式。
Linux作为一种常用的操作系统,也提供了相应的接口和工具来支持485通讯。
本文将介绍在Linux下使用C语言实现485通讯的代码。
在开始编写485通讯的C语言代码之前,我们需要先了解一些基本的概念和原理。
485通讯是一种半双工的串行通讯方式,它使用两根信号线进行数据的传输,一根用于发送数据(TX),一根用于接收数据(RX)。
通常情况下,485通讯使用的波特率较低,例如9600bps或者19200bps。
在Linux下,我们可以通过打开串口设备文件来实现485通讯。
串口设备文件的命名规则为/dev/ttySx,其中x表示串口的编号。
例如,/dev/ttyS0表示第一个串口设备,/dev/ttyS1表示第二个串口设备。
我们可以使用open函数来打开串口设备文件,并使用read 和write函数来进行数据的读写操作。
下面是一个简单的示例代码,演示了如何在Linux下使用C语言实现485通讯:```c#include <stdio.h>#include <stdlib.h>#include <string.h>#include <fcntl.h>#include <unistd.h>#include <termios.h>int main(){int fd;char data[10];// 打开串口设备文件fd = open("/dev/ttyS0", O_RDWR);if (fd == -1) {printf("无法打开串口设备文件\n");return -1;}// 配置串口参数struct termios options;tcgetattr(fd, &options);cfsetispeed(&options, B9600); // 设置波特率为9600bps cfsetospeed(&options, B9600);options.c_cflag |= CLOCAL | CREAD;options.c_cflag &= ~CSIZE;options.c_cflag |= CS8;options.c_cflag &= ~PARENB;options.c_cflag &= ~CSTOPB;tcsetattr(fd, TCSANOW, &options);// 发送数据strcpy(data, "Hello");write(fd, data, strlen(data));// 接收数据read(fd, data, sizeof(data));printf("接收到的数据:%s\n", data);// 关闭串口设备文件close(fd);return 0;}```上述代码首先通过open函数打开了/dev/ttyS0这个串口设备文件,如果打开失败,则会提示无法打开串口设备文件并退出。
基于RS-485的单片机通信系统设计
专业课程设计任务书2013-2014 学年第 2 学期第 16 周- 19 周题目基于RS-485的单片机通信系统设计内容及要求1.利用RS485实现单片机的双向通讯;2.通过键盘实现从机的选择、发送数据的输入;3.主机显示发送的数据及从机编号。
4提高要求:通过键盘实现循环工作模式、指定从机这2种工作方式的切换。
进度安排16周:查找资料,进行系统硬件设计、软件方案设计;17周:硬件制作、软件的分模块调试;19周:系统联调;19周:设计结果验收,报告初稿的撰写。
学生姓名:11042104万娇 11042109赵佳慧指导时间:周一、周三、周五指导地点:E楼 610室任务下达2014年 6 月 3 日任务完成2014年 6月 27 日考核方式 1.评阅□ 2.答辩□ 3.实际操作□ 4.其它□指导教师张小林系(部)主任注:1、此表一组一表二份,课程设计小组组长一份;任课教师授课时自带一份备查。
2、课程设计结束后与“课程设计小结”、“学生成绩单”一并交院教务存档。
摘要串口通信是一种广泛应用于各个领域的通信方式,在远距离数据传输和控制系统中,可以根据RS-485协议实现远距离传输。
此次课设即利用MAX485芯片实现半双工串行通信的双向通信系统。
系统主要由主机控制模块、通信模块、数据输入模块、数据显示模块和模数转换模块五个部分组成,实现了利用RS-485实现单片机的双向通信,通过键盘实现从机的选择、发送数据,主机显示发送的数据及从机编号,通过键盘实现循环工作模式、指定从机这两种工作方式的切换。
此系统具有使用方便、操作简单、便于实现、成本低、可靠性高、可拓展性强、易于维护等特点,具有较广泛的应用前景。
关键字:单片机;RS-485总线;串行通信;数模转换目录前言 0第一章设计内容及要求 (1)1.1设计内容 (1)1.2设计要求 (1)第二章系统组成及工作原理 (2)2.1系统组成 (2)2.2 工作原理 (2)第三章硬件电路方案设计 (3)3.1 主机控制模块 (3)3.2 数据显示模块 (4)3.3 模数转换模块 (5)3.4 键盘输入模块 (6)3.5 通信模块 (7)3.5.1 RS485通信协议 (8)3.5.2 RS485通信格式 (8)3.6从机控制模块 (9)3.6.1 单片机最小系统 (9)3.6.2 显示模块 (10)第四章软件设计 (11)4.1 通信协议 (11)4.1.1 串行通信协议的比较——RS232 RS422 RS485 (11)4.1.2 通信过程 (13)4.2 主机程序 (13)4.2.1 主程序流程图 (13)4.2.2 矩阵键盘输入子程序 (14)4.2.3 数码管显示子程序 (15)4.2.4 传输模块子程序 (16)4.3 从机程序 (16)4.3.1从机总流程图 (16)4.3.2 接收并显示子程序 (17)第五章实验调试和测试结果与分析 (18)第六章结论 (19)第七章参考文献 (20)附录一电路图 (21)附录二程序代码 (22)前言单片机是一种集成电路芯片,是采用超大规模集成电路技术把具有数据处理能力的中央处理器CPU、随机存储器RAM、只读存储器ROM、多种I/O口和中断系统、定时器/计数器等功能(可能还包括显示驱动电路、脉宽调制电路、模拟多路转换器、A/D转换器等电路)集成到一块硅片上构成的一个小而完善的微型计算机系统。
485通讯方式主从控制参数设置(以SD200为例)
485通讯方式主从控制参数设置
(以SD200为例)
一, 变频器参数设置
主机参数设置:
参数参数说明参数设定备注
F00 基本参数组
F00.00 控制模式 1矢量模式0
F00.01 运行命令来源 1 端子
F00.06 运行频率给定 0 键盘数字给定
F00.12 加速时间 6.0s
F00.12 减速时间 6.0s
F02.11 空载电流27A
F05组输入端子组
F05.01 DI1端子 1 正转运行
F05.02 DI2端子 2 反转运行
F0E组串行通讯参数组
F0E.00 本机通讯地址0 0表示本机为主机
F0E.07 主机发送间隔时间50ms 一般设置为20~100ms
F0E.08 通讯模式选择 2 主从模式2(从机接收频率和命令)
从机参数设置:
参数参数说明参数设定备注
F00 基本参数组
F00.00 控制模式 1矢量模式0
F00.01 运行命令来源 3 主机通讯命令给定(端子无效)
F00.07 B频率源选择 9 Modbus通讯给定
F00.08 B频率源选择 0 0:最大输出频率
F00.09 B频率源增益系数 0.0~100.0% 通过调整得到从机想要的频率
F0E组串行通讯参数组
F0E.00 本机通讯地址 1 1表示本机为从机(非0地址都为从机,各从机地址不能相同)
F0E.08 通讯模式选择 2 主从模式2(从机接收主机的频率和命令)。
基于MODBUS协议的RS-485工业现场总线系统
基于MODBUS协议的RS-485工业现场总线系统
陈池;陈峦;任金忠
【期刊名称】《装备制造技术》
【年(卷),期】2009(000)005
【摘要】在分析传统工控仪表管理方式的缺点基础上,提出了一套基于RS-485工业现场总线系统的技术改造方案.在主机端构建了系统后台数据库,用VB编写数据采集和处理程序,设计了系统的仿仪表界面;建立了系统硬件电路,按照MODBUS协议实现了RS-485工业现场总线系统的驱动控制,用C语言编写了从机端仿工控仪表的监控程序;自动采集的数据经过加工处理后,能自动存入后台数据库,可以方便地查阅实时教据曲线和历史记录曲线.系统结构较简单,功能较完善,具有一定实用价值.【总页数】4页(P93-96)
【作者】陈池;陈峦;任金忠
【作者单位】公安部上海消防研究所,上海,200032;新疆大学,电气工程学院,新疆,乌鲁木齐,830008;电子科技大学,自动化工程学院,四川,成都,610054;电子科技大学,自动化工程学院,四川,成都,610054
【正文语种】中文
【中图分类】TP274
【相关文献】
1.RS-485总线系统通信可靠性设计与应用 [J], 董兵;许晓斐
2.基于PIC微控制器的RS-485/Modbus总线系统设计与实现 [J], 彭伟
3.RS-485总线系统可靠性分析 [J], 毕新熙;曹建生;贾焕铎;王建华
4.基于Modbus协议的工业现场快速组网方案 [J], 任天平;魏晓龙
5.基于Proteus的RS-485总线系统仿真设计 [J], 瓮嘉民;任鹏飞
因版权原因,仅展示原文概要,查看原文内容请购买。
基于rs485总线的主从通信方法
分析Technology Analysis D I G I T C W技术1 组网方式供电数据采集器与智能接触器采用半双工UART接口[1],通过异步串行通信接收和发送信息。
供电数据采集器与智能接触器间有2路RS485总线,每路总线采集4个只能接触器状态。
RS485总线组网方式如图1所示。
图1 RS-485总线组网方式2 主从通信机制2.1 帧结构稳定可靠的通信不仅依赖硬件环境,也依赖于通信协议。
主节点供电数据采集器与从节点智能接触器之间的通信协议如图2所示。
图2 数据桢结构(1)数据帧头:用于标识数据帧的开始,数据帧头字由2个字节组成,主节点发送数据帧头1的值为0xAA,数据帧头2的值为0x55,主节点接收数据帧头1的值为0xEB,数据帧头2的值为0x90。
(2)数据帧ID号:RS485总线上的通信为广播方式,所以每个智能接触器应该有独立地址,判断该数据帧是否应该接收。
(3)命令/数据:数据帧中实际数据,为了保证数据通信可靠性,所有数据以0~9的ASCII码发送,智能接触器收到后再处理。
(4)校验和:用于数据帧的校验,它是除本身外的块中所有字节之和以256为模的二进制补码。
2.2 R S485总线通信2.2.1 主从通信时序控制供电数据采集器与智能接触器的接口采用半双工UART接口,通过异步串行通信接收和发送信息。
RS485总线为半双工通信方式,同一时刻只能有一个节点处于发送状态,否则会引起总线冲突[2]。
供电数据采集器与智能接触器之间的通信采用定时启动方式,供电数据采集器为主设备,智能接触器为从设备,通信启动方式采用定时启动方式,主控站按约定周期向从控站发送数据命令,以启动一次数据传送的通信,直到该次通信所应传送的数据传送完毕,然后主控站才结束这次传送过程,下一个通信周期又重复这个传送过程。
供电数据采集器每50ms轮询一个智能接触器,4个智能接触器共需要200ms完成一次通信。
一次通信包括从主设备发送数据到主设备接收数据完成,通信周期采用定时器实现,定时器周期t为10ms,通信周期T为50ms,一次通信传输过程包括以下4个阶段:一是在通信周期T到来时,调度供电数据采集器发送任务组织发送数据;二是在每个定时器周期t到来时,主设备检测发送数据并启动物理传输;三是智能接触器在每个定时器周期t到来时进行数据查询接收,解析,并组织回复数据;四是供电数据采集器在接收任务周期T到来时进行数据接收、解析。
RS 485.C程序源代码
***********************RS485.c文件程序源代码*************************#include<reg52.h>#include<intrins.h>SbitRS485_DIR=P1^7;//RS485方向选择引脚bit flagOnceTxd = 0; //单次发送完成标志,即发送完一个字节bit cmdArrived = 0; //命令到达标志,即接收到上位机下发的命令unsigned char cntRxd = 0;unsigned char pdata bufRxd[40]; //串口接收缓冲区 void ConfigUART(unsigned int baud) //串口配置函数,baud为波特率{ RS485_DIR = 0; //RS485设置为接收方向 SCON = 0x50; //配置串口为模式1 TMOD &= 0x0F; //清零T1的控制位 TMOD |= 0x20; //配置T1为模式2 TH1 = 256 - (11059200/12/32) /&n bsp;baud; //计算T1重载值 TL1 = TH1; //初值等于重载值 ET1 = 0; &nb sp;//禁止T1中断 ES = 1; &nbs p; //使能串口中断 TR1 = 1; &nb sp;//启动T1}unsigned char UartRead(unsigned char *buf, unsigned ch ar len) //串口数据读取函数,数据接收指针buf,读取数据长度len,返回值为实际读取到的数据长度{ unsigned char i; if (len > cntRxd) //读取长度大于接收到的数据长度时, { len = cntRxd; //读取长度设置为实际接收到的数据长度 } for (i=0; i<len; i++) //拷贝接收到的数据 { buf++; } cntRxd = 0; //清零接收计数器 return len; //返回实际读取长度}void DelayX10us(unsigned char t) //软件延时函数,延时时间(t*10)us{ do { _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); } while (--t);}void UartWrite(unsigned char *buf, unsigned char len)&n bsp;//串口数据写入函数,即串口发送函数,待发送数据指针buf,数据长度len{ RS485_DIR = 1; //RS485设置为发送 while (len--) //发送数据 { flagOnceTxd = 0; SBUF = *buf; buf++; while (!flagOnceTxd); } DelayX10us(5); //等待最后的停止位完成,延时时间由波特率决定 RS485_DIR = 0; //RS485设置为接收} void UartDriver() //串口驱动函数,检测接收到的命令并执行相应动作{ unsigned char len; unsigned char buf[30]; if (cmdArrived) //有命令到达时,读取处理该命令 { len = UartRead(buf, sizeof(buf)-2); //将接收到的命令读取到缓冲区中 buf[len++] = '\r'; &n bsp; //在接收到的数据帧后添加换车换行符后发回 buf[len++] = '\n'; UartWrite(buf, len); }} void UartRxMonitor(unsigned char ms) //串口接收监控函数{ static unsigned char cntbkp = 0; static unsigned char idletmr = 0; if (cntRxd > 0) //接收计数器大于零时,监控总线空闲时间 { if (cntbkp != cntRxd) //接收计数器改变,即刚接收到数据时,清零空闲计时 {  nbsp; cntbk p = cntRxd; idletmr&n bsp;= 0; } else { if (id letmr < 30) //接收计数器未改变,即总线空闲时,累积空闲时间 { &n bsp; idletmr += ms; &n bsp; if (idletmr >= 30) //空闲时间超过30ms 即认为一帧命令接收完毕 &n bsp; { &n bsp; cmdArrived = 1; //设置命令到达标志 &n bsp; } } } } else { cntbkp = 0; }}void InterruptUART() interrupt 4 //UART中断服务函数{ if (RI) //接收到字节 { RI = 0; &nbs p;//手动清零接收中断标志位 if (cntRxd < sizeof (bufRxd)) //接收缓冲区尚未用完时, { bufRxd[cnt Rxd++] = SBUF; //保存接收字节,并递增计数器 } } if (TI) //字节发送完毕 { TI = 0; &nbs p; //手动清零发送中断标志位 flagOnceTxd = 1; &n bsp;//设置单次发送完成标志 }}***********************main.c文件程序源代码*************************#include <reg52.h> unsigned char T0RH = 0; //T0重载值的高字节unsigned char T0RL = 0; //T0重载值的低字节 void ConfigTimer0(unsigned int ms);extern void ConfigUART(unsigned int baud);extern void UartRxMonitor(unsigned char ms);extern void UartDriver(); void main (){ EA = 1; &nbs p; //开总中断 ConfigTimer0(1); //配置T0定时1ms ConfigUART(9600); //配置波特率为9600 while(1) { UartDriver(); }<P>}</P> void ConfigTimer0(unsigned int ms) //T0配置函数{ unsigned long tmp; tmp = 11059200 / 12; &nbs p; //定时器计数频率 tmp = (tmp * ms) / 1000;&n bsp; //计算所需的计数值 tmp = 65536 - tmp; //计算定时器重载值 tmp = tmp + 34; &nb sp; //修正中断响应延时造成的误差 T0RH = (unsigned char)(tmp >>&nb sp;8); //定时器重载值拆分为高低字节 T0RL = (unsigned char)tmp; TMOD &= 0xF0; //清零T0的控制位 TMOD |= 0x01; //配置T0为模式1 TH0 = T0RH; //加载T0重载值 TL0 = T0RL; ET0 = 1; &nb sp; //使能T0中断 TR0 = 1; &nb sp; //启动T0}void InterruptTimer0() interrupt 1 //T0中断服务函数{ TH0 = T0RH; //定时器重新加载重载值 TL0 = T0RL; UartRxMonitor(1); //串口接收监控}。
rs485通信程序
#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使用工作方式2TH1 = 250; // 设置初值TL1 = 250;TR1 = 1; // 开始计时PCON = 0x80; // SMOD = 1SCON = 0x50; // 工作方式1,波特率9600bps,允许接收ES = 0; // 关闭串口中断IT0 = 0; // 外部中断0使用电平触发模式EX0 = 1; // 开启外部中断0EA = 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表示0xdbecc = ecc^0xdb;db = 0;break;case 0xdcdata_buf[i] = 0xc0; // 0xdbdc表示0xc0ecc = ecc^0xc0;db = 0;break;defaultreturn 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,发送0xdbddTI = 0;SBUF = 0xdb;while(!TI);TI = 0;SBUF = 0xdd;while(!TI)TI = 0;break;case 0xc0: // 字节为0xc0,发送0xdbdcTI = 0;SBUF = 0xdb;while(!TI);TI = 0;SBUF = 0xdc;while(!TI)TI = 0;break;default: // 普通数据则直接发送TI = 0;SBUF = da;while(!TI);TI = 0;}}#endif。
基于RS485总线的多机通信系统设计
基于RS485总线的多机通信系统设计一、系统设计目标和背景随着现代工业自动化水平的提高,工业控制系统和仪表设备逐渐增多,对于其中的多个设备进行数据通信和控制成为关键需求。
在多机通信系统设计中,RS485总线作为一种常用的通信标准,可实现高速、远距离的通信传输,因此成为了此类系统设计的首选。
二、系统设计方案1.硬件设计:(1)主控设备选择:选用一台RS485总线主控器作为系统的主控设备,负责RS485总线的数据传输和协调各从机设备。
主控设备可选择PLC、工控机等。
(2)从机设备选择:根据实际需求,选择适合的从机设备进行数据通信和控制。
每个从机设备都需要一个独立的RS485接口,并设置唯一的从机地址,以便主控设备进行识别和通信。
2.通信协议设计:(1)物理层设计:根据RS485总线的特性,需要设计出符合RS485的物理接口和电气特性。
同时,还需要考虑电源供电和信号转换等问题。
(2)数据链路层设计:采用标准的RS485通信协议进行数据帧的传输和错误检测,确保数据的可靠性。
(3)应用层设计:根据具体需求制定应用层协议,定义数据格式和通信流程。
主控设备和从机设备之间的数据传输可以采用命令/响应模式或者发布/订阅模式。
3.网络拓扑设计:根据实际应用场景和设备数量,选择合适的RS485总线网络拓扑结构。
常见的网络拓扑结构包括总线型、星型、环型等。
其中总线型最常见,适用于设备数量较多的情况,具有较高的灵活性和扩展性。
4.软件设计:(1)主控设备端:主控设备需要编写相应的软件程序,用于控制RS485总线的数据传输和管理各从机设备。
主控设备的软件需要包括数据采集、处理、显示等功能。
(2)从机设备端:每个从机设备需要编写相应的软件程序,用于响应主控设备的控制指令和发送数据给主控设备。
从机设备的软件需要实现数据采集、发送、接收和处理等功能。
5.系统安全性设计:(1)数据加密:对于一些关键数据,可以设置加密算法,确保数据的安全传输。
rs485协议的编程方法
rs485协议的编程方法1.什么是r s485协议?r s485协议是一种常用的串行通信协议,用于在多个设备之间进行数据传输。
它具有高速传输、长距离通信和多节点连接的特点,广泛应用于工业自动化领域。
本文将介绍如何使用rs485协议进行编程。
2.硬件准备在使用r s485协议进行编程之前,需要进行一些硬件准备工作。
主要包括:R S485转U A R T模块-:用于将r s485信号转换为与M CU或计算机通信的UA RT信号。
M C U或计算机-:用于与rs485转UA R T模块进行数据交互。
外设设备-:如传感器、执行器等,通过r s485协议与M CU或计算机进行通信。
3.软件编程3.1选择编程语言在进行r s485协议的编程时,可以选择多种编程语言,如C语言、P y th on等。
根据实际需求和项目环境选择合适的编程语言。
3.2使用串口库使用rs485协议进行通信时,需要通过串口与外设设备进行数据交互。
因此,需要在编程中使用相应的串口库来实现串口的打开、配置和读写操作。
3.3配置串口参数在使用r s485协议进行通信之前,需要对串口进行正确的配置。
主要包括波特率、数据位、停止位和校验位等参数的设置。
这些参数应与外设设备的参数相匹配,否则通信将无法正常进行。
3.4发送和接收数据使用rs485协议进行通信时,需要明确发送和接收数据的格式。
根据外设设备的通信协议,编写相应的数据发送和接收函数。
在发送数据时,需要将数据按照协议格式进行打包;在接收数据时,需要根据协议格式解析接收到的数据。
3.5错误处理在r s485通信中,可能会出现各种错误情况,如传输错误、超时等。
在编程过程中,需要预先考虑这些错误情况,并编写相应的错误处理代码,保证程序的稳定性和可靠性。
4.实例演示以下是一个使用C语言编写的简单示例,演示了如何使用r s485协议进行通信:#i nc lu de<s td io.h>#i nc lu de<s td in t.h>#i nc lu de<s td li b.h>#i nc lu de<u ni st d.h>#i nc lu de<f cn tl.h>#i nc lu de<t er mi os.h>#d ef in eR S485_D EVI C E"/d ev/t ty US B0"v o id in it_r s485(in t fd){s t ru ct te rm io st io;t c ge ta tt r(fd,&tio);t i o.c_cf la g|=C REA D|C LO CA L;t i o.c_cf la g&=~CSI Z E;t i o.c_cf la g|=C S8;t i o.c_cf la g&=~PAR E NB;t i o.c_cf la g&=~CST O PB;t i o.c_cc[V MI N]=0;t i o.c_cc[V TI ME]=10;t c se ta tt r(fd,T CSA N OW,&ti o);}i n tm ai n(){i n tf d=op en(R S485_D EV IC E,O_RD WR|O_N OC TT Y);i f(f d==-1){p e rr or("op en");e x it(1);}i n it_r s485(f d);u n si gn ed ch ar da ta[]={0x01,0x02,0x03};w r it e(fd,d at a,siz e of(d at a));u n si gn ed ch ar bu f[10];s s iz e_tn=r ea d(fd,b uf,s iz eo f(bu f));i f(n>0){//解析接收到的数据f o r(in ti=0;i<n;i++){p r in tf("%02x",buf[i]);}p r in tf("\n");}c l os e(fd);r e tu rn0;}5.总结本文介绍了使用r s485协议进行编程的方法。
基于RS485总线的多机通信系统设计
摘要在多机通信领域.由于单片机具有灵活高效的多机通信功能和价格优势,应用越来越广泛,但由于单片机的收发信号都是TTI 电平,驱动能力和抗干扰性有限,实用中常配合其它总线实现互联,RS-485总线就是其中之一。
RS-485总线是平衡差分传输,抗干扰性好,最远可传输4000 m,可互联多达128个单片机,非常适台组成多机通信系统。
在多机通信中,最重要的是保证通信有条不紊地进行,因此需要严格的通信协议和完善的通信软件,本文将重点介绍应用于某大型工程的单片机多机通信协议和通信软件的设计方法。
本文介绍一种利用单片机本身所提供的串行通讯口,采用自定义串行通信协议,加上总线驱动器如MAX481、MAX483、MAX485、MAX487等组合成简单的RS-485通讯网络,完成单片机间的多机通讯。
关键词: 单片机;串行通信;RS-485总线:多机通信协议AbstractIn computer communication field. Because of the single chip microcomputer has flexible and efficient computer communication function and price advantage, used more and more widely, but because of the single chip microcomputer to send and receive signals are TTI level, drive and anti-interference ability is limited, practical cooperation with other bus realize in Internet, RS-485 bus is one of them. RS-485 bus is a balanced differential transmission, anti-jamming of the good and as far as 4000 m could be transmitted, interconnected as many as 128 single chip microcomputer, very comfortable a composition computer communication system.In computer communication, the most important is to ensure that communications in an orderly way, and therefore need to strict communication protocol and perfect communication software, this paper will focus on introduces applied in a large project single-chip computer communication association Put the communication software design method.This paper introduces a microcontroller itself provide the serial communication mouth, use custom serial communication protocol, plus the bus drives as MAX481, MAX483, MAX485, MAX487 combined into simple RS-485 communication network, finish between the single chip computer communication.Keywords: SCM; Serial communication; RS-485 bus: computer communication agreement目录第1章绪论 (1)1.1 课题研究背景与意义 (1)1.2 单片机多机通信发展 (1)第2章总体介绍 (3)2.1 系统组成 (3)2.2 RS-485 (3)2.3 多机通信原理 (4)第3章硬件设计及原理 (6)3.1 80C51单片机硬件结构 (6)3.2 最小应用系统设计 (7)3.2.1 时钟电路 (7)3.2.2 复位电路 (8)3.3 总线驱动芯片 (9)第4章系统问题及其解决 (12)4.1 通信规则 (12)4.2 总线匹配 (13)4.3 硬件抗干扰措施 (13)4.3.1 RO及DI端配置上拉电阻 (13)4.3.2 地线与接地 (14)4.3.3 电磁干扰(EMI)问题 (14)4.3.4 瞬态保护 (15)4.3.5 总线隔离 (16)4.4 软件抗干扰措施 (16)4.4.1 指令冗余 (16)4.4.2 拦截技术 (16)4.4.3 软件“看门狗”技术 (17)第5章软件设计 (19)5.1 系统结构 (19)5.2 通信协议 (19)5.2.1 信息格式 (19)5.2.2 定时与重发 (20)5.2.3 通信过程 (20)5.3 通信软件设计 (21)5.3.1 从机通信软件设计 (21)5.3.2 主机通信软件设计 (23)第6章程序设计 (24)6.1 主机程序如下: (24)6.2 从机1程序如下: (26)6.3 从机2程序如下: (27)第7章系统仿真 (29)结束语 (31)致谢 (32)参考文献 (33)第1章绪论1.1 课题研究背景与意义单片机是一种集成在电路芯片,是采用超大规模集成电路技术把具有数据处理能力的中央处理器CPU随机存储器RAM、只读存储器ROM、多种I/O口和中断系统、定时器/计时器等功能(可能还包括显示驱动电路、脉宽调制电路、模拟多路转换器、A/D 转换器等电路)集成到一块硅片上构成的一个小而完善的计算机系统目前单片机渗透到我们生活的各个领域,几乎很难找到哪个领域没有单片机的踪迹。
基于RS485接口的数据传输电路设计
单片机技术课程设计说明书基于RS485接口地数据传输电路设计专业电气工程及其自动化学生姓名周琪班级BM电气101学号**********指导教师周云龙完成日期2013年 6 月 18 日目录1. 概述错误!未定义书签。
2. RS485硬件问题 (6)2.1 问题地提出 (6)2.2 电路基本原理 (6)2.3 RS-485地DE控制端设计 (8)2.4 避免总线冲突地设计 (8)2.5 RS-485输出电路部分地设计 (8)2.6 系统地电源选择 (6)2.7软件地编程 (6)2.8 结论 (6)2. 硬件设计 (6)2.1 RS485 (6)2.2 多通机原理 (6)2.3 单片机通信原理 (8)2.4 MX485 (8)2.5 整题电路设计 (8)3. 软件设计 (11)3.1 通信软件实现 (11)3.2 程序流程图 (12)4. 联合调试 (14)5设计小结 (16)参考文献 (16)附录 (17)附录1:程序清单 (17)附录2:系统电路图 (21)1.概述单片机是一种采用超大规模集成电路技术把多种功能集成到一块硅片上构成地一个小而完善地计算机系统.它广泛应用于仪器仪表、家用电器、医用设备、航空航天、专用设备地智能化管理及过程控制等领域随着计算机技术地发展及工业自动化水平地提高, 在许场合采用单机控制已不能满足现场要求,因而必须采用多机控制地形式,而多机控制主要通过多个单片机之间地串行通信实现.串行通信作为单片机之间常用地通信方法之一, 由于其通信编程灵活、硬件简洁并遵循统一地标准, 因此其在工业控制领域得到了广泛地应用.本次课程设计就是利用单片机,基于RS-485芯片,设计一种简单地多机通信——一主两从.RS一485接口是一种基于平衡发送和差分接收地串行总线,具有很强地抗共模干扰能力,在适当地波特率下传输距离远。
同时易于进行网络扩展,被广泛地应用在很多工业现场.节能灯寿命检测环境中,主要干扰来自开关和寿命检测地强电干扰、开关产生地电磁干扰、空气循环设备地干扰等等。