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

📄 uart_pv4.c

📁 PV4协议转换为MODBUS RTU协议的程序
💻 C
字号:
#include".\Globle.h"
#include".\Function.h"
#include".\Modbus_RTU.h"
uchar	gvc_pv_tmp;
uchar	gvc_pv_buff[100];
uchar	gvc_pv_counter;
uchar	gvc_pv_flg;
uchar 	gvc_data_buf[17][100];
//Data_buffer buffer;
uchar 	gvc_com_buf[7];
uchar 	gvc_free_flg;
uchar	gvc_slaver_addr;
LongType	gvl_tmp;

void PV_Uart_send(unsigned char c) // 发送 
{
	UDR0 = c;
	while(!(UCSR0A & 0x40));
	UCSR0A |=0x40;
}

uchar Pv_check_sum()
{
	uchar lvc_counter;
	uchar lvc_tmp;
	uint lvi_sum_buf;
	uint lvi_sum=0;
	for(lvc_counter=0;lvc_counter<gvc_pv_counter;lvc_counter++)
		{
			lvi_sum^=gvc_pv_buff[lvc_counter];

		}
	if(lvi_sum==0)
		return(1);
	else
		return(0);
		
/*
	Tls_Uart_send(lvi_sum/256);
	Tls_Uart_send(lvi_sum%256);
	
	Tls_Uart_send(lvi_sum_buf/256);
	Tls_Uart_send(lvi_sum_buf%256);
*/
	
}

unsigned char DEC_ASC(unsigned char indata, unsigned char s)

{
	if(s)							//high bit
		{
			return(HEX_ASC(indata/10));

		}
	else
		{
			return(HEX_ASC(indata%10));
		}

}

void PV4_com(uchar message,uchar addr)
{
	uchar lvc_i=0;
	uchar lvc_check;
	
	gvc_com_buf[0]=0x02;
	gvc_com_buf[5]=0x02;
	
	gvc_com_buf[1]=message;
	gvc_com_buf[5]^=message;
	
	gvc_com_buf[2]=DEC_ASC(addr,1);
	gvc_com_buf[5]^=gvc_com_buf[2];
	
	gvc_com_buf[3]=DEC_ASC(addr,0);
	gvc_com_buf[5]^=gvc_com_buf[3];
	
	gvc_com_buf[4]=0x03;
	gvc_com_buf[5]^=0x03;
	
	//PORTD|=0x10;			
	for(lvc_i=0;lvc_i<6;lvc_i++)
		{

			PV_Uart_send(gvc_com_buf[lvc_i]);
		
		}

	//PORTD&=~0x10;

}

void PV4_analyse()
{
	uchar lvc_add;
	
	
	if(gvc_pv_flg&&Pv_check_sum())
		{
			
			gvc_pv_flg=0;
			lvc_add= ASC_HEX(gvc_pv_buff[3]);
			lvc_add=lvc_add*10+ASC_HEX(gvc_pv_buff[4]);		//slaver address

			gvl_tmp.longword=ASC_HEX(gvc_pv_buff[8]);				//ppppppp
			gvl_tmp.longword=gvl_tmp.longword*10+ASC_HEX(gvc_pv_buff[9]);
			gvl_tmp.longword=gvl_tmp.longword*10+ASC_HEX(gvc_pv_buff[10]);
			gvl_tmp.longword=gvl_tmp.longword*10+ASC_HEX(gvc_pv_buff[11]);
			gvl_tmp.longword=gvl_tmp.longword*10+ASC_HEX(gvc_pv_buff[12]);
			gvl_tmp.longword=gvl_tmp.longword*10+ASC_HEX(gvc_pv_buff[13]);
			gvl_tmp.longword=gvl_tmp.longword*10+ASC_HEX(gvc_pv_buff[14]);
			gvc_data_buf[lvc_add][0]=gvl_tmp.words.wh.bytes.bh;
			gvc_data_buf[lvc_add][1]=gvl_tmp.words.wh.bytes.bl;
			gvc_data_buf[lvc_add][2]=gvl_tmp.words.wl.bytes.bh;
			gvc_data_buf[lvc_add][3]=gvl_tmp.words.wl.bytes.bl;

			gvl_tmp.longword=ASC_HEX(gvc_pv_buff[15]);				//wwwwwww
			gvl_tmp.longword=gvl_tmp.longword*10+ASC_HEX(gvc_pv_buff[16]);
			gvl_tmp.longword=gvl_tmp.longword*10+ASC_HEX(gvc_pv_buff[17]);
			gvl_tmp.longword=gvl_tmp.longword*10+ASC_HEX(gvc_pv_buff[18]);
			gvl_tmp.longword=gvl_tmp.longword*10+ASC_HEX(gvc_pv_buff[19]);
			gvl_tmp.longword=gvl_tmp.longword*10+ASC_HEX(gvc_pv_buff[20]);
			gvl_tmp.longword=gvl_tmp.longword*10+ASC_HEX(gvc_pv_buff[21]);
			gvc_data_buf[lvc_add][4]=gvl_tmp.words.wh.bytes.bh;
			gvc_data_buf[lvc_add][5]=gvl_tmp.words.wh.bytes.bl;
			gvc_data_buf[lvc_add][6]=gvl_tmp.words.wl.bytes.bh;
			gvc_data_buf[lvc_add][7]=gvl_tmp.words.wl.bytes.bl;

			gvl_tmp.longword=ASC_HEX(gvc_pv_buff[22]);				//PPPPP
			gvl_tmp.longword=gvl_tmp.longword*10+ASC_HEX(gvc_pv_buff[23]);
			gvl_tmp.longword=gvl_tmp.longword*10+ASC_HEX(gvc_pv_buff[24]);
			gvl_tmp.longword=gvl_tmp.longword*10+ASC_HEX(gvc_pv_buff[25]);
			gvl_tmp.longword=gvl_tmp.longword*10+ASC_HEX(gvc_pv_buff[26]);
		
			gvc_data_buf[lvc_add][8]=gvl_tmp.words.wh.bytes.bh;
			gvc_data_buf[lvc_add][9]=gvl_tmp.words.wh.bytes.bl;
			gvc_data_buf[lvc_add][10]=gvl_tmp.words.wl.bytes.bh;
			gvc_data_buf[lvc_add][11]=gvl_tmp.words.wl.bytes.bl;

			
			gvl_tmp.longword=ASC_HEX(gvc_pv_buff[27]);				//WWWW
			gvl_tmp.longword=gvl_tmp.longword*10+ASC_HEX(gvc_pv_buff[28]);
			gvl_tmp.longword=gvl_tmp.longword*10+ASC_HEX(gvc_pv_buff[29]);
			gvl_tmp.longword=gvl_tmp.longword*10+ASC_HEX(gvc_pv_buff[30]);
			//gvl_tmp.longword=gvl_tmp.longword*10+ASC_HEX(gvc_pv_buff[31]);
			
			gvc_data_buf[lvc_add][12]=gvl_tmp.words.wh.bytes.bh;
			gvc_data_buf[lvc_add][13]=gvl_tmp.words.wh.bytes.bl;
			gvc_data_buf[lvc_add][14]=gvl_tmp.words.wl.bytes.bh;
			gvc_data_buf[lvc_add][15]=gvl_tmp.words.wl.bytes.bl;
			

			gvl_tmp.longword=ASC_HEX(gvc_pv_buff[31]);				//UUUUU
			gvl_tmp.longword=gvl_tmp.longword*10+ASC_HEX(gvc_pv_buff[32]);
			gvl_tmp.longword=gvl_tmp.longword*10+ASC_HEX(gvc_pv_buff[33]);
			gvl_tmp.longword=gvl_tmp.longword*10+ASC_HEX(gvc_pv_buff[34]);
			gvl_tmp.longword=gvl_tmp.longword*10+ASC_HEX(gvc_pv_buff[35]);

			gvc_data_buf[lvc_add][16]=gvl_tmp.words.wh.bytes.bh;
			gvc_data_buf[lvc_add][17]=gvl_tmp.words.wh.bytes.bl;
			gvc_data_buf[lvc_add][18]=gvl_tmp.words.wl.bytes.bh;
			gvc_data_buf[lvc_add][19]=gvl_tmp.words.wl.bytes.bl;


			gvl_tmp.longword=ASC_HEX(gvc_pv_buff[36]);				//TTTT
			gvl_tmp.longword=gvl_tmp.longword*10+ASC_HEX(gvc_pv_buff[37]);
			gvl_tmp.longword=gvl_tmp.longword*10+ASC_HEX(gvc_pv_buff[38]);
			gvl_tmp.longword=gvl_tmp.longword*10+ASC_HEX(gvc_pv_buff[39]);

			gvc_data_buf[lvc_add][20]=gvl_tmp.words.wh.bytes.bh;
			gvc_data_buf[lvc_add][21]=gvl_tmp.words.wh.bytes.bl;
			gvc_data_buf[lvc_add][22]=gvl_tmp.words.wl.bytes.bh;
			gvc_data_buf[lvc_add][23]=gvl_tmp.words.wl.bytes.bl;
		
		}

}



#pragma interrupt_handler uart0_rx_isr:19
void uart0_rx_isr(void)
{
	gvc_pv_tmp=UDR0;
	if(gvc_pv_tmp==0x02)
		gvc_pv_counter=0;

	gvc_pv_buff[gvc_pv_counter]=gvc_pv_tmp;
	gvc_pv_counter++;
	
	if(gvc_pv_tmp==0x03)
		gvc_pv_flg=1;

	if(gvc_pv_counter>=99)
		gvc_pv_counter=0;
	
 //uart has received a character in UDR

}

⌨️ 快捷键说明

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