485通讯从机接收程序(带帧校验)
485通讯从机接收程序(带帧校验)

//从机程序//01数据帧//02命令帧//03功能帧 01 确认 02 否认#include<avr/io.h>#include<avr/interrupt.h>#include<inttypes.h>#include<util/delay.h>#include <avr/pgmspace.h>#include<string.h>#define myaddr 0x01 //定义本机地址#define rx_485(); asm("cbi 0x13,2"); //portd.2清零改为接收状态#define tx_485(); asm("sbi 0x13,2"); //portd.2置位改为发送状态volatile struct conn{unsigned char buf[70];unsigned char data[64];unsigned char srcadd;//源地址unsigned char aimadd;//目的地址unsigned char tp;//帧类型int num;int tmp;unsigned char ver; //验证码;unsigned char err; //错误码; 01:帧校验错}tx,rx;volatile unsigned char com; //命令const unsigned char flash_str[] PROGMEM = "0123456789";ISR(USART_RXC_vect){rx.buf[rx.tmp]=UDR;/*testif(rx.tmp==0 && rx.buf[rx.tmp]=='t'){totx();tx.num=16;strcpy(tx.buf,"can i help you");tx.buf[15]=0x0D;UCSRB|=(1<<UDRIE);//发送帧};*/if(rx.tmp==0 && rx.buf[rx.tmp]!=myaddr) //地址不对直接返回{//禁止接收0.15秒。
实例三菱FX3U485无协议通讯程序详解(含程序)

实例三菱FX3U485⽆协议通讯程序详解(含程序)三菱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。
三菱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。
三菱FX3U485无协议通讯程序详解(含程序)

三菱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。
三菱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。
三菱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。
51单片机串口485通讯程序

/* 以下为单片机串口485通讯程序,从机程序(当然也适用于主机程序),主机发送可以先用串口帮手软件来调试,经过Keil uVision4实际测试,测试效果如结尾图片所示, 大部分来自网络,只是改了两个地方: len = sizeof(dbuf),if(i >=( __ERRLEN+1)) // 帧超长,错误,返回,就可以实现了,其中的原因自已体会吧*/#ifndef __485_C__#define __485_C__#include <reg51.h>#include <string.h>#include <stdio.h>#include <intrins.h>#define uchar unsigned char#define uint unsigned int/* 通信命令*/#define __ACTIVE_ 0x01 // 主机询问从机是否存在#define __GETDATA_ 0x02 // 主机发送读设备请求#define __OK_ 0x03 // 从机应答#define __STATUS_ 0x04 // 从机发送设备状态信息#define __MAXSIZE 0x08 // 缓冲区长度#define __ERRLEN 12 // 任何通信帧长度超过12则表示出错//uchar dbuf[__MAXSIZE]; // 该缓冲区用于保存设备状态信息uchar dbuf[__MAXSIZE];//={0,1,2,3,4,5,6,7}; // 该缓冲区用于保存设备状态信息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);dev = 0x01;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 __GETDA TA_:// len = strlen(dbuf);//在C51中不能这个函数计算unsigned char型,这个函数只能计算char型len = sizeof(dbuf);// len =0x08;send_data(__STA TUS_, 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]; // 保存接收到的帧__ERRLEN=12;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 0xdc:data_buf[i] = 0xc0; // 0xdbdc表示0xc0ecc = 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) // 帧超长,错误,返回if(i >=( __ERRLEN+1)) // 帧超长,错误,返回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,发送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/* 调试结果*/。
三菱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.复位M8123后,则PLC再次进入接收等待状态。
三菱FX3U 485无协议通讯程序详解(含程序)

三菱FX2NPLC串行通讯指令(FNC80RS)串行通讯指令(FNC80RS)1、指令格式:[RSD0K8D10K8]发送数据帧起始地址和数目↓接收数据帧起始地址和数目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进制)(0000110010001001B)M8002│──||──────────[MOVH0C89D8120]5、相关标志位:一.基本指令介绍※M8122:数据发送请求标志当PLC处于接收完成状态或接收等待状态时,用脉冲触发M8122,将使得从D0开始的连续8个数据被发送。
当发送完成后,M8122自动被复位。
当RS指令的驱动输入X0变为ON状态时,PLC就进入接收等待状态。
※M8123:数据接收完成标志当M8123置位时,表明接收已经完成,此时需要将接收到的数据从接受缓冲区转移到用户指定的数据区,然后手工复位M8123。
复位M8123后,则PLC再次进入接收等待状态。
三菱FX3U485无协议通讯程序详细讲解(含程序)

三菱FX2N PLC 串行通讯指令(FNC 80 RS )串行通讯指令(FNC 80 RS )1、指令格式:[RS D0 K8 D10 K8]发送数据帧起始地址和数目J接收数据帧起始地址和数目2、功能和动作:% RS指令是为使用RS232C、RS-485功能扩展板及特殊适配器,进行发送和接收串行数据的指令。
探传送的数据格式在后面讲述的特殊寄存器D8120设定。
RS指令驱动时即使改变D8120的设定,实际上也不接收。
※在只发送的系统中,可将接收数设定为K0o (K表示常数)%在只接收的系统中,可将发送数设定为K0o%在程序中可以多次使用RS指令,但在同一时间必须保证只有一个RS指令被驱动。
%在一次完整的通讯过程中,RS指令必须保持一直有效,直至接收数据完成。
D8120说明:%根据MD320的通讯协议,无帧头和帧尾,则(bit9,bit8 )= (0,0)。
% bit13〜15是计算机链接通讯时的设定项目,使用RS指令时必须设定为0。
% RS485 未考虑设置控制线的方法,使用FX2N-485-BD、FX0N-485ADP 时,(bit11,bit10 )= (1,1 )o%若PLC和变频器之间的通讯参数如下:8位数据位,无校验,2位停止位,波特率9600,无帧头无帧尾,无协议模式,则D8120=H0C89 (H 表示16 进制)(0000 1100 1000 1001B )M8002| ——|| ------------------------------- [ MOV H0C89 D8120 ]5、相关标志位:一.基本指令介绍探M8122 :数据发送请求标志当PLC 处于接收完成状态或接收等待状态时,用脉冲触发M8122 ,将使得从DO 开始的连续8个数据被发送。
当发送完成后,M8122自动被复位。
当 RS 指令的驱动输入 X0变为ON 状态时,PLC 就进入接收等 待状态。
探M8123 :数据接收完成标志当M8123置位时,表明接收已经完成,此时需要将接收到的数据从接受缓冲区转移到用户指定的数据区, 然后手工复位M8123。
三菱FX3U485无协议通讯程序详细讲解(含程序)

三菱FX2N PLC 串行通讯指令(FNC 80 RS )串行通讯指令(FNC 80 RS )1、指令格式:[RS D0 K8 D10 K8]发送数据帧起始地址和数目J接收数据帧起始地址和数目2、功能和动作:% RS指令是为使用RS232C、RS-485功能扩展板及特殊适配器,进行发送和接收串行数据的指令。
探传送的数据格式在后面讲述的特殊寄存器D8120设定。
RS指令驱动时即使改变D8120的设定,实际上也不接收。
※在只发送的系统中,可将接收数设定为K0o (K表示常数)%在只接收的系统中,可将发送数设定为K0o%在程序中可以多次使用RS指令,但在同一时间必须保证只有一个RS指令被驱动。
%在一次完整的通讯过程中,RS指令必须保持一直有效,直至接收数据完成。
D8120说明:%根据MD320的通讯协议,无帧头和帧尾,则(bit9,bit8 )= (0,0)。
% bit13〜15是计算机链接通讯时的设定项目,使用RS指令时必须设定为0。
% RS485 未考虑设置控制线的方法,使用FX2N-485-BD、FX0N-485ADP 时,(bit11,bit10 )= (1,1 )o%若PLC和变频器之间的通讯参数如下:8位数据位,无校验,2位停止位,波特率9600,无帧头无帧尾,无协议模式,则D8120=H0C89 (H 表示16 进制)(0000 1100 1000 1001B )M8002| ——|| ----------------- [ MOV H0C89 D8120 ]5、相关标志位:一.基本指令介绍探M8122 :数据发送请求标志当PLC 处于接收完成状态或接收等待状态时, 用脉冲触发M8122 ,将使得从DO 开始的连续8个数据被发送。
当发送完成后,M8122自动被复位。
当 RS 指令的驱动输入 X0变为ON 状态时,PLC 就进入接收等 待状态。
探M8123 :数据接收完成标志当M8123置位时,表明接收已经完成,此时需要将接收到的数据从接受缓冲区转移到用户指定的数据区, 然后手工复位M8123。
三菱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。
三菱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。
485通信程序(51单片机)

#include<reg52.h〉#include<string.h〉#define uchar unsigned char#define uint unsigned int/*通信命令*/#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 = 1;SCON = 0x50; //工作方式1,波特优选法9600bps,允许接收ES = 0; // 关闭串品中断IT0 = 0; //外部中断0使有电平触发模式EX0 = 1;// 开启外部中断0EA = 0; //开启总中断/*主程序流程*/while(1){if(recv_cmd(&type)==0) //发送帧错误或帧地址与本机地址不符,丢弃当前帧后返回continue;switch(type){case _ACTIVE_: //主机询问从机是否存在send_data(_OK_,0,dbuf);// 发送应答信息,这里的buf 的内容并未用到break;case _GETDA TA_://主机发送读设备请求len = strlen(dbuf);snd_data(_STA TUS_,len,dbuf) ;// 发送设备信息break;default:break; //命令类型错误,丢弃当前帧返回}}}}void READSTATUS() interrput 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{swithc(tmp){case 0xdd:data_buf[i]= 0xdb;//0xdbdd 表示0xdbecc = ecc^0xdb;db = 0;break;case 0xdc:data_buf[i] = 0xc0;//0xdbdc 表示0xc0ecc = 0;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[i!= 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);buff++;}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;}}。
485通讯波特率和校验位

485通讯波特率和校验位一、引言485通讯是一种串行通讯方式,常用于工业自动化领域。
在485通讯中,波特率和校验位是两个重要的参数。
本文将介绍485通讯波特率和校验位的概念、作用和常见设置方法。
二、485通讯波特率1. 概念波特率(Baud Rate)是指单位时间内传输的数据位数。
在485通讯中,波特率决定了数据传输的速度。
常见的波特率有9600、19200、38400等。
2. 作用波特率的选择要根据实际应用场景来确定。
如果通讯距离较长或需要高速传输数据,可以选择较高的波特率。
反之,如果通讯距离较短或需要较低的传输速度,可以选择较低的波特率。
3. 设置方法在485通讯设备中,波特率一般通过软件或硬件来设置。
例如,通过配置串口参数或拨码开关来设置波特率。
在使用485通讯时,要确保发送方和接收方的波特率设置一致,否则会出现通讯错误。
三、485通讯校验位1. 概念校验位(Parity Bit)是指为了检测和纠正数据传输中的错误而添加到数据中的一位或几位。
在485通讯中,常见的校验位有无校验、奇校验和偶校验。
2. 作用校验位的作用是检测数据传输过程中是否出现错误。
发送方在发送数据时,会根据校验位的设置计算出一个校验值,并将该校验值添加到数据中。
接收方在接收数据时,会根据校验位的设置对接收到的数据进行校验,以判断数据是否传输正确。
3. 设置方法在485通讯设备中,校验位一般通过软件或硬件来设置。
例如,通过配置串口参数或拨码开关来设置校验位。
在设置校验位时,要根据实际应用场景来选择合适的校验方式,以确保数据传输的可靠性。
四、485通讯波特率和校验位的关系1. 波特率和数据传输速度波特率的选择会直接影响数据传输的速度。
通常情况下,波特率越高,数据传输速度越快。
但是,波特率过高也会导致传输错误的概率增加。
2. 校验位和数据传输可靠性校验位的设置可以提高数据传输的可靠性。
通过校验位的计算和校验,可以检测到数据传输过程中的错误,并进行相应的处理。
三菱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。
485通讯波特率和校验位

485通讯波特率和校验位一、引言随着现代通信技术的迅速发展,各种通讯协议被广泛应用于各个领域。
其中,485通讯协议作为一种串行通信协议,其波特率和校验位是保证通信稳定和可靠的重要参数。
本文将从485通讯协议的波特率和校验位两个方面进行详细介绍。
二、485通讯协议的波特率波特率是指单位时间内传输的比特数。
在485通讯协议中,波特率是指数据传输的速率,通常用波特(Baud)表示。
常见的波特率有9600、19200、38400等,其中9600是最低的波特率,38400是最高的波特率。
波特率的选择需要考虑实际应用环境和数据传输的需求。
一般情况下,波特率越高,数据传输速度越快,但也会带来一些问题。
首先,高波特率会增加通信线路上的噪声和干扰,导致数据传输错误率增加。
其次,高波特率需要更高的硬件性能支持,对设备要求较高。
因此,在选择波特率时,需要综合考虑以上因素,并根据实际情况进行调整。
三、485通讯协议的校验位校验位是一种用于检测数据传输错误的机制。
在485通讯协议中,校验位用于检测数据在传输过程中是否出现错误,并能够及时发现和纠正错误。
常见的校验位有奇校验和偶校验两种。
奇校验要求传输的数据中“1”的个数为奇数,偶校验要求传输的数据中“1”的个数为偶数。
校验位的选择需要根据实际情况和系统要求进行判断。
一般来说,奇校验在数据位为偶数时使用,偶校验在数据位为奇数时使用。
校验位能够有效地保证数据传输的正确性,提高通信的可靠性。
四、485通讯协议的应用485通讯协议广泛应用于各个领域,如工业自动化、楼宇自控、环境监测等。
在工业自动化领域中,485通讯协议常用于PLC(可编程逻辑控制器)、传感器、执行器等设备之间的数据传输。
在楼宇自控领域中,485通讯协议常用于空调控制、照明控制等设备之间的通信。
在环境监测领域中,485通讯协议常用于气象站、水质监测仪等设备之间的数据传输。
485通讯协议的波特率和校验位对于以上应用领域的设备之间的通信起到了至关重要的作用。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
///////////////////////////////////////////////////////////////////// //////////////从机程序//01数据帧//02命令帧//03功能帧 01 确认 02 否认#include<avr/io.h>#include<avr/interrupt.h>#include<inttypes.h>#include<util/delay.h>#include <avr/pgmspace.h>#include<string.h>#define myaddr 0x01 //定义本机地址#define rx_485(); asm("cbi 0x13,2"); //portd.2清零改为接收状态#define tx_485(); asm("sbi 0x13,2"); //portd.2置位改为发送状态volatile struct conn{unsigned char buf[70];unsigned char data[64];unsigned char srcadd;//源地址unsigned char aimadd;//目的地址unsigned char tp;//帧类型int num;int tmp;unsigned char ver; //验证码;unsigned char err; //错误码; 01:帧校验错}tx,rx;volatile unsigned char com; //命令const unsigned char flash_str[] PROGMEM = "0123456789";ISR(USART_RXC_vect){rx.buf[rx.tmp]=UDR;/*testif(rx.tmp==0 && rx.buf[rx.tmp]=='t'){totx();tx.num=16;strcpy(tx.buf,"can i help you");tx.buf[15]=0x0D;UCSRB|=(1<<UDRIE);//发送帧};*/if(rx.tmp==0 && rx.buf[rx.tmp]!=myaddr) //地址不对直接返回{//禁止接收0.15秒。
可行,因为使用中断模式,不影响正常使用UCSRB&=~(1<<RXEN);//0.15秒后自动进入接收状态。
timer1_init();return;};if((rx.tmp>4) && (rx.tmp==rx.buf[3]+4) &&(rx.buf[rx.tmp]!=rx.ver))//验证错误{//当接收结束后,什么事情都不干,就等待接收。
rx.err=0x01;};if((rx.tmp>4) && (rx.tmp==rx.buf[3]+5) && (rx.buf[rx.tmp]==0xcc) && rx.err==0)//正常结束{//帧类型分情况//否认帧还是确认帧还是其它帧TCCR2 = 0x00;//PORTA+=1;if(rx.buf[2]!=3){//发送确认帧tx.aimadd=rx.buf[1];tx.srcadd=myaddr;tx.tp=0x03;tx.num=1;tx.data[0]=01;tx_init();asm("sei");tx_send();com=23;//处理接收到的数据//延时一段时间,发送新数据}else{if(rx.buf[3]==0x02) //收到否认帧{tx_resend();}}return;}rx.ver^=rx.buf[rx.tmp];rx.tmp++;timer2_init();//测试什么时候传送结束};ISR(TIMER2_COMP_vect){//发生此中断说明通讯没有正常结束UCSRB&=~(1<<RXEN);if(rx.err==0x01 && rx.buf[2]!=0x03){//发否认帧tx.aimadd=rx.buf[1];tx.srcadd=myaddr;tx.tp=0x03;tx.num=1;tx.data[0]=02;//否认帧tx_init();tx_send();}//延一下时//发送确认帧还是否认帧,如果是确认帧则中止计时器1,如果是否认帧则要求进行重发,并且};ISR(USART_UDRE_vect){UDR=tx.buf[tx.tmp];tx.tmp++;if(tx.tmp==tx.num+6){UCSRB&=~(1<<UDRIE);//停止望UDR中注入数据。
};};ISR(USART_TXC_vect){torx(); //进入接收状态};ISR(TIMER1_COMPA_vect){torx();//进入接收状态};void torx(void){//如果是数据帧或者命令帧则进行计时等待UCSRB=0x90;rx_485(); // 改为接收状态rx.tmp=0; //游标清零rx.ver=0;rx.err=0;}void totx(void){UCSRB=0x48; //udre 不置位,等待初始化后,进行tx_485();tx.tmp=0; //游标清零tx.ver=0;tx.err=0;}//比较前多少位 str1 源目标 n 字符个数uint8_t strcomp(char *str1,char str2[],uint8_t n) {char i,*p,*q;p=str1;q=str2;for(i=0;i<n;i++){if(*p!=*q){return 0;};};return 1;}void timer1_init(void) //0.15秒计时{TCCR1B = 0x00; //stopTCNT1H = 0xF7; //setupTCNT1L = 0x92;OCR1AH = 0x08;OCR1AL = 0x6E;TCCR1A = 0x00;TCCR1B = 0x0C; //start Timer}void timer2_init(void){TCCR2 = 0x00; //stopASSR = 0x00; //set async modeTCNT2 = 0xC2; //setupOCR2 = 0x3E;TCCR2 = 0x0E; //start}void uart_init(uint8_t ubbrh,uint8_t ubbrl){UCSRB = 0x00; //disable while setting baud rateUCSRA = 0x00;UCSRC =_BV(URSEL)| 0x06;UBRRL = ubbrl; //set baud rate lo//UBRRH = ubbrh; //set baud rate hi}//tx结构初始化函数,不浪费内存了,没有参数,在初始化前赋值void tx_init(){totx();//发送准备状态tx.buf[0]=tx.aimadd;tx.ver^=tx.aimadd;tx.buf[1]=tx.srcadd;tx.ver^=tx.srcadd;tx.buf[2]=tx.tp;tx.ver^=tx.tp;tx.buf[3]=tx.num;tx.ver^=tx.num;for(int i=0;i<tx.num;i++){tx.buf[i+4]=tx.data[i];tx.ver^=tx.data[i];};tx.buf[tx.num+4]=tx.ver;tx.buf[tx.num+5]=0xcc;//tbuf组帧成功//没有必要进行时钟延时检验,因为从机将一直处于接收状态timer1_init(); //UCSRB|=(1<<UDRIE);}//发送函数;addr,地址;tp=0 发送命令帧 tp=1 发送数据帧,p=要发送的内容,bnum 发送的字节数//在使用此函数前首先要确保buf有内容发射后不管void tx_send(void){tx_init();//发送帧,利用中断//timer1_init();//no needUCSRB|=(1<<UDRIE);//发送帧};void tx_resend(){totx();//发送准备状态UCSRB|=(1<<UDRIE);//发送帧}int main(void){DDRA=0XFF;PORTA=0x00;DDRC=0x00;PORTC=0x00;DDRB=0xff;PORTB=0x0f;DDRD=0x04;PORTD=0x00;//接收态TIMSK = 0x90; //开t1a 和 t2 比较中断uart_init(0x00,0x17);//初始化uartasm("sei");//接收开始torx();/*发送测试totx();tx.aimadd=0xff;tx.srcadd=myaddr;tx.tp=0x02;tx.num=3;strcpy((char *)tx.data,"123");tx_init();tx_send();//采用轮转结构,利用t0 每个//通信//显示AD*/while(1){//服务程序if(com==23){totx();_delay_ms(2);tx.aimadd=0xff;tx.srcadd=myaddr;tx.tp=0x01;tx.num=11;strcpy((char *)tx.data,"successful"); tx_init();tx_send();com=0x00;}};};。