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

📄 uart_modbus.c

📁 TLS35协议转换成MODBUS ASCII协议
💻 C
字号:
#include".\Globle.h"
#include".\Function.h"
#include".\Uart_tls.h"
#include<EEPROM.h>
uchar gvc_mod_tmp;
uchar gvc_mod_flg;
uchar gvc_mod_buff[100];
uchar gvc_mod_counter;
uchar gvc_mod_statue;
uchar gvc_slave_addr;


void M_uart_send(unsigned char c) // 发送 
{
	//UDR1 = c|0x80;
	UDR1 = c;
	while(!(UCSR1A & 0x40));
	UCSR1A |=0x40;
}

uchar M_LRC_sum()
{
	uchar lvc_sum=0;
	uchar lvc_counter;
	for(lvc_counter=1;lvc_counter<(gvc_mod_counter-4);lvc_counter++)
		{
			lvc_sum+=gvc_mod_buff[lvc_counter];
		}
	lvc_sum=0-lvc_sum;
	return(lvc_sum);
}

 /*-------------------------------------------------------------------------
 						LRC 校验
 --------------------------------------------------------------------------*/
uchar   LRC_check()
{

	unsigned char *lvc_point;
	unsigned char lvc_counter;
	unsigned char lvc_sum=0;
	uchar tmp;

	lvc_point=gvc_mod_buff;
	for(lvc_counter=1;lvc_counter<gvc_mod_counter-4;lvc_counter++)
		{
			tmp=combination(ASC_HEX(gvc_mod_buff[lvc_counter]),ASC_HEX(gvc_mod_buff[lvc_counter+1]));
			lvc_sum+=tmp;
			lvc_counter++;


		}
	
	lvc_sum=0-lvc_sum;
	return(lvc_sum);
	
}



uchar M_check_sum()
{
	uchar lvc_sum=0;
	uchar lvc_counter;
	for(lvc_counter=1;lvc_counter<(gvc_mod_counter-3);lvc_counter++)
		{
			lvc_sum+=gvc_mod_buff[lvc_counter];
		}
	lvc_sum=0-lvc_sum;
	return(lvc_sum);
}

void Modbus_analyse()
{
	uchar lvc_check_sum;
	uchar lvc_commad;
	uint lvi_start_addr;
	uint lvi_data_num;
	uchar *lvp_data_point;
	uchar lvc_tmp;
	uchar lvc_byte_num;
	uchar lvc_addr_tmp;
	uchar lvc_data_tmp;
	uint    lvc_i;
	#if 0
	if((gvc_mod_buff[1]==gvc_slave_addr)||(gvc_mod_buff[1]==0))
		{
			
			//M_uart_send(gvc_mod_buff[gvc_mod_counter-3]);
			//M_uart_send(M_check_sum());
			if(gvc_mod_buff[gvc_mod_counter-3]==M_check_sum())
				{
					//M_uart_send(0x55);
					//M_uart_send(gvc_mod_buff[2]);
					switch(gvc_mod_buff[2])
						{
							case 0x03:

								lvi_start_addr=gvc_mod_buff[3];
								lvi_start_addr<<=8;
								lvi_start_addr+=gvc_mod_buff[4];

								lvi_data_num=gvc_mod_buff[5];	//the number of data
								lvi_data_num<<=8;
								lvi_data_num+=gvc_mod_buff[6];
								//M_uart_send(0x55);
								//M_uart_send(lvi_start_addr/256);
								//M_uart_send(lvi_start_addr%256);
								lvc_byte_num=lvi_data_num<<1;
								
								M_uart_send(':');
								lvc_check_sum=0;
								M_uart_send(gvc_slave_addr);
								lvc_check_sum+=gvc_slave_addr;
								M_uart_send(0x03);
								lvc_check_sum+=0x03;

								M_uart_send(lvi_data_num/256);
								lvc_check_sum+=lvi_data_num/256;

								M_uart_send(lvi_data_num%256);
								lvc_check_sum+=lvi_data_num%256;

								lvp_data_point=&gvc_data_buf[0][0];
								
							#if ASCII
								for(lvc_tmp=0;lvc_tmp<lvc_byte_num;lvc_tmp++)
									{
										
										M_uart_send(lvp_data_point[lvc_tmp+lvi_start_addr]);
										lvc_check_sum+=lvp_data_point[lvc_tmp+lvi_start_addr];
										
									}
							#else
								//M_uart_send(0x66);
								for(lvc_tmp=0;lvc_tmp<lvc_byte_num;lvc_tmp++)
									{
										lvc_data_tmp=combination(lvp_data_point[lvc_tmp+lvi_start_addr],lvp_data_point[lvc_tmp+lvi_start_addr+1]);
										M_uart_send(lvc_data_tmp);
										lvc_check_sum+=lvc_data_tmp;
										lvc_tmp++;
										
									}
							
											

							#endif

								lvc_check_sum=0-lvc_check_sum;
								M_uart_send(lvc_check_sum);
								M_uart_send(0x0d);
								M_uart_send(0x0a);

							break;

							default:
							break;

								
						}
				}
		}
	#endif

	lvc_addr_tmp=combination(ASC_HEX(gvc_mod_buff[1]),ASC_HEX(gvc_mod_buff[2]));
	if((gvc_slave_addr==lvc_addr_tmp)||lvc_addr_tmp==0)		//check the address
		{
		/*
			M_uart_send(0x66);
			lvc_data_tmp=combination(ASC_HEX(gvc_mod_buff[gvc_mod_counter-4]),ASC_HEX(gvc_mod_buff[gvc_mod_counter-3]));
			lvc_check_sum=LRC_check();
			M_uart_send(lvc_check_sum);
			M_uart_send(lvc_data_tmp);
		*/
			lvc_check_sum=LRC_check();						//lrc check sum
			if(lvc_check_sum==combination(ASC_HEX(gvc_mod_buff[gvc_mod_counter-4]),ASC_HEX(gvc_mod_buff[gvc_mod_counter-3]))||lvc_addr_tmp==0)
				{
					//M_uart_send(0x55);
					lvc_commad=combination(ASC_HEX(gvc_mod_buff[3]),ASC_HEX(gvc_mod_buff[4]));
					switch(lvc_commad)
						{
							
							case 0x03:			//muti_read;
								lvi_start_addr=combination(ASC_HEX(gvc_mod_buff[5]),ASC_HEX(gvc_mod_buff[6]));	//start addr
								lvi_start_addr<<=8;
								lvi_start_addr+=combination(ASC_HEX(gvc_mod_buff[7]),ASC_HEX(gvc_mod_buff[8]));

								lvi_data_num=combination(ASC_HEX(gvc_mod_buff[9]),ASC_HEX(gvc_mod_buff[10]));	//the number of data
								lvi_data_num<<=8;
								lvi_data_num+=combination(ASC_HEX(gvc_mod_buff[11]),ASC_HEX(gvc_mod_buff[12]));
								if(lvi_start_addr+lvi_data_num<1700){
									
								//PORTD|=0x10;
								//M_uart_send(0x55);
								//M_uart_send(lvi_start_addr/256);
								//M_uart_send(lvi_start_addr%256);
								
								//M_uart_send(lvi_data_num/256);
								//M_uart_send(lvi_data_num%256);
								lvc_check_sum=0;

								lvc_i=15000;
								while(--lvc_i);						//delay
								
								M_uart_send(':');
								lvc_byte_num=lvi_data_num<<2;
								


								lvc_tmp=Caculate_H_OP (gvc_slave_addr);
								//lvc_check_sum+=gvc_slave_addr;
								M_uart_send(HEX_ASC(lvc_tmp));

								lvc_tmp=Caculate_L_OP (gvc_slave_addr);
								lvc_check_sum+=gvc_slave_addr;
								M_uart_send(HEX_ASC(lvc_tmp));


								lvc_tmp=Caculate_H_OP (lvc_commad);
								lvc_check_sum+=lvc_commad;
								M_uart_send(HEX_ASC(lvc_tmp));

								lvc_tmp=Caculate_L_OP (lvc_commad);
								//lvc_check_sum+=lvc_tmp;
								M_uart_send(HEX_ASC(lvc_tmp));

								lvc_tmp=Caculate_H_OP (lvc_byte_num/2);
								lvc_check_sum+=lvc_byte_num/2;
								M_uart_send(HEX_ASC(lvc_tmp));

								lvc_tmp=Caculate_L_OP (lvc_byte_num/2);
								//lvc_check_sum+=lvc_tmp;
								M_uart_send(HEX_ASC(lvc_tmp));

								lvp_data_point=&gvc_data_buf[0][0];

								for(lvc_tmp=0;lvc_tmp<lvc_byte_num;lvc_tmp++)			//send the app data
									{
										lvc_check_sum+=combination(ASC_HEX(lvp_data_point[lvc_tmp+lvi_start_addr]),ASC_HEX(lvp_data_point[lvc_tmp+lvi_start_addr+1]));
										M_uart_send(lvp_data_point[lvc_tmp+lvi_start_addr]);
										M_uart_send(lvp_data_point[lvc_tmp+lvi_start_addr+1]);
										lvc_tmp++;
									}
								
								lvc_check_sum=0-lvc_check_sum;
								M_uart_send(HEX_ASC(Caculate_H_OP (lvc_check_sum)));
								M_uart_send(HEX_ASC(Caculate_L_OP (lvc_check_sum)));
								M_uart_send(0x0d);
								M_uart_send(0x0a);
									}



							#if 0	
								lvc_tmp=HEX_ASC(Caculate_H_OP (gvc_slave_addr));
								lvc_check_sum+=gvc_slave_addr/256;
								M_uart_send(lvc_tmp);

								lvc_tmp=HEX_ASC(Caculate_L_OP (gvc_slave_addr));
								lvc_check_sum+=lvc_tmp;
								M_uart_send(lvc_tmp);


								lvc_tmp=HEX_ASC(Caculate_H_OP (lvc_commad));
								lvc_check_sum+=lvc_tmp;
								M_uart_send(lvc_tmp);

								lvc_tmp=HEX_ASC(Caculate_L_OP (lvc_commad));
								lvc_check_sum+=lvc_tmp;
								M_uart_send(lvc_tmp);

								lvc_byte_num=lvi_data_num<<1;
								lvc_tmp=HEX_ASC(Caculate_H_OP (lvc_byte_num));
								lvc_check_sum+=lvc_tmp;
								M_uart_send(lvc_tmp);

								lvc_tmp=HEX_ASC(Caculate_L_OP (lvc_byte_num));
								lvc_check_sum+=lvc_tmp;
								M_uart_send(lvc_tmp);

								lvp_data_point=&gvc_data_buf[0][0];
								for(lvc_tmp=0;lvc_tmp<lvc_byte_num;lvc_tmp++)
									{
										
										M_uart_send(lvp_data_point[lvc_tmp+lvi_start_addr]);
										lvc_check_sum+=lvp_data_point[lvc_tmp+lvi_start_addr];
									}

								

								lvc_check_sum=0-lvc_check_sum;
								M_uart_send(HEX_ASC(Caculate_H_OP (lvc_check_sum)));
								M_uart_send(HEX_ASC(Caculate_L_OP (lvc_check_sum)));
								M_uart_send(0x0d);
								M_uart_send(0x0a);
							#endif
							#if 0
								for(lvc_tmp=0;lvc_tmp<56;lvc_tmp++)
									{
										
										M_uart_send(gvc_data_buf[3][lvc_tmp]);
										//lvc_check_sum+=lvp_data_point[lvc_tmp+lvi_start_addr];
									}
							#endif
							break;
						
							case 0x99:
								
								gvc_slave_addr=combination(ASC_HEX(gvc_mod_buff[5]),ASC_HEX(gvc_mod_buff[6]));
								EEPROMwrite(SLAVER_ADDR,gvc_slave_addr);
								M_uart_send(0x3a);
								M_uart_send(0x30);
								M_uart_send(0x30);
								M_uart_send(0x39);
								M_uart_send(0x39);
								M_uart_send(gvc_mod_buff[5]);
								M_uart_send(gvc_mod_buff[6]);
								M_uart_send(0x0d);
								M_uart_send(0x0a);
								
							break;



							default:

							break;

						}


				}



		}



}







#pragma interrupt_handler uart1_rx_isr:31
void uart1_rx_isr(void)
{
	gvc_mod_tmp=UDR1;
//	gvc_mod_tmp=0x7f&gvc_mod_tmp;
	if(gvc_mod_tmp==':')				//head
		{
			gvc_mod_counter=0;
			gvc_mod_statue=1;
		}
	if(gvc_mod_statue)
		{
			 gvc_mod_buff[gvc_mod_counter]=gvc_mod_tmp;
			
			 if(gvc_mod_buff[gvc_mod_counter]==0x0a&&gvc_mod_buff[gvc_mod_counter-1]==0x0d)
			 	{
					gvc_mod_flg=1;
					gvc_mod_statue=0;
			 	}
		}
	
	gvc_mod_counter++;
	if(gvc_mod_counter>=99)
		gvc_mod_counter=0;
 //
}




#if 0

#pragma interrupt_handler uart1_rx_isr:31
void uart1_rx_isr(void)
{
	gvc_mod_tmp=UDR1;
	gvc_mod_flg=1;
 //
}
#endif

⌨️ 快捷键说明

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