⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 modbus_rtu.c

📁 PV4协议转换为MODBUS RTU协议的程序
💻 C
字号:

//#include ".\STC89c5x.H"
#include".\Globle.h"
#include <macros.h>
#include".\Uart_Pv4.h"
#include".\Function.h"
#include<EEPROM.h>
uchar gvc_tmp;
uchar gvc_timer_flg;
uchar gvc_num_tmp;
uchar gvc_add_buff[20];
uchar gvc_send_buf[200];
uchar gvc_add_counter=0;
uchar gvc_satue;
uchar gvc_add_flg;
uchar gvc_addr;

unsigned char cy_receive_buf[UART_LEN];
unsigned char  cy_uartnumber;
unsigned char gvc_data_num;

uchar    cy_uartcomplete;//串口接受完一组数据
uchar * gvp_data_point;
uchar 	sy_10ms;


//unsigned int    iy_wdata[WORD_NUM];//字存储区,可读可写


//sbit  RTS_485=P3^5;

//sbit RUN_FLAG=P3^2;//运行状态指示灯


//-----------------------------------------------------------------------------
union crc  //check crc 2 byte;
	{
		unsigned int word;
		struct 
			{
				unsigned char	lo;
				unsigned char	hi;
				
			}bytes;
	};
union crc   crc_chec;

void crc_chec_fuc(unsigned char datain)
	{

		unsigned char i;
		crc_chec.bytes.lo=crc_chec.bytes.lo^datain;
		for(i=0;i<8;i++)
			{
				if((crc_chec.word & 0x0001)==1)
					{
						crc_chec.word=crc_chec.word>>1;
						crc_chec.word=crc_chec.word^0xa001;
					}
				else
					crc_chec.word=crc_chec.word>>1;
			}
	}

void start_crc_chec(void)
	{ 
		unsigned char i;
		crc_chec.word=0xffff;
		for(i=0;i<(gvc_num_tmp-2);i++)
			crc_chec_fuc(cy_receive_buf[i]);
		
	}
void delay()
{
	uchar i=255;
	while(--i);
}

void generic_crc(unsigned char cyz_num)
	{
		unsigned char	i;
		
		crc_chec.word=0xffff;
		for(i=0;i<cyz_num;i++)
			crc_chec_fuc(gvc_send_buf[i]);
		
		gvc_send_buf[cyz_num+1]=crc_chec.bytes.hi;
		gvc_send_buf[cyz_num]=crc_chec.bytes.lo;
	}

//发送一个字节
void uart_send(unsigned char s)
 	{
		UDR1 = s;
		while(!(UCSR1A & 0x40));
		UCSR1A |=0x40;
	}

//发送一帧数据
void frame_send(unsigned char t)//发送数据桢
	{
		unsigned char i;
		
		for(i=0;i<t;i++)
			uart_send(gvc_send_buf[i]);

	}
//-----------------------------------------------------------------------------
void uart_run(void)
	{ 
		unsigned char x,y,x_num,y_num;
		unsigned int cy_q,cy_s;
		WordType lvi_add_tmp;

		if(cy_uartcomplete)

			{
			DIR|=DIR_V;

			cy_uartcomplete=0;
			//uart_send(cy_receive_buf[0]);
				start_crc_chec();
				//uart_send(crc_chec.bytes.hi);
				//uart_send(crc_chec.bytes.lo);
				
				if((crc_chec.bytes.hi==cy_receive_buf[gvc_num_tmp-1])\
					&&(crc_chec.bytes.lo==cy_receive_buf[gvc_num_tmp-2]))	    //crc
						    {		
						    		//uart_send(0x77);
								
						    		switch(cy_receive_buf[1])
								    {
										
										case 3://读寄存器
											lvi_add_tmp.bytes.bh=cy_receive_buf[2];
											lvi_add_tmp.bytes.bl=cy_receive_buf[3];
											
											if((lvi_add_tmp.word<WORD_NUM)&&(cy_receive_buf[5]<WORD_NUM)&&((lvi_add_tmp.word+cy_receive_buf[5])<WORD_NUM))
												{
													gvc_send_buf[0]=cy_receive_buf[0];
													gvc_send_buf[1]=cy_receive_buf[1];
													gvc_send_buf[2]=cy_receive_buf[5]*2;			//data number
													gvc_data_num=3;
													cy_q=lvi_add_tmp.word+cy_receive_buf[5]*2;		//the end addr
													gvp_data_point=&gvc_data_buf[0][0];

													
													for(cy_s=lvi_add_tmp.word;cy_s<cy_q;cy_s++)
														{
															gvc_send_buf[gvc_data_num]=gvp_data_point[cy_s];
															gvc_data_num++;
															
														}
													generic_crc(gvc_data_num);
													gvc_data_num=gvc_data_num+2;
													frame_send(gvc_data_num);//发送数据
													
												}
											
										break;
										
										default:
										break;
								     }								
							
								
						    }
				//
					
				cy_uartnumber=0;
				delay();
				delay();
				//PORTC&=~0x20;
			//	}
		//SEI();
		DIR&=~DIR_V;
			}
	}			   

void Add_analyse()
{
	if(gvc_add_flg)
		{
			gvc_add_flg=0;
			if(gvc_add_buff[1]==0x30&&gvc_add_buff[2]==0x30&&gvc_add_buff[3]==0x39
				&&gvc_add_buff[4]==0x39)
				gvc_addr=combination(ASC_HEX(gvc_add_buff[5]),ASC_HEX(gvc_add_buff[6]));
			EEPROMwrite(SLAVER_ADDR,gvc_addr);
			DIR|=DIR_V;
			uart_send(gvc_addr);

			DIR&=~DIR_V;

		}


}
//-----------------------------------------------------------------------------
#pragma interrupt_handler uart1_rx_isr:31
void uart1_rx_isr(void)
 	{
 
		gvc_tmp=UDR1;

		cy_receive_buf[cy_uartnumber]=gvc_tmp;
		cy_uartnumber++;
				
		if((cy_uartnumber>=128)||((cy_uartnumber==1)&&(cy_receive_buf[0]!=gvc_addr)))
			cy_uartnumber=0;

		TCNT2=0x16;
		TCCR2=0x05;

		//-------------------------------------------
		
		if(gvc_tmp==':')
		{
			gvc_add_counter=0;
			gvc_satue=1;
		}
	if(gvc_satue)
		{
			 gvc_add_buff[gvc_add_counter]=gvc_tmp;
			
			 if(gvc_add_buff[gvc_add_counter]==0x0a&&gvc_add_buff[gvc_add_counter-1]==0x0d)
			 	{
					gvc_add_flg=1;
					gvc_satue=0;
			 	}
		}
	
	gvc_add_counter++;
	if(gvc_add_counter>=20)
		gvc_add_counter=0;
	
 			
	}



#pragma interrupt_handler timer2_ovf_isr:11
void timer2_ovf_isr(void)
{
 	//TCNT2 = 0xB2; //reload counter value
 	//TCNT2=0x16;
 	TCCR2=0x00;
	gvc_num_tmp=cy_uartnumber;
	cy_uartnumber=0;
	cy_uartcomplete=1;
	
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -