📄 uart_modbus.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 + -