📄 serial.c
字号:
#include "sfr_r81b.h"
#include "serial.h"
#include "global.h"
#include "iic.h"
//AT89S51JI PLC
uchar receive_array[60] ;
uint temp_mm ;
uchar send_array[60];
uchar array_temp_write[10] ;
uchar read_check_one_array(uchar eeprom_block_address,uchar *data_write_array,uchar read_long,uint eeprom_block_in_address);
void error_data_return(void);
void ok_data_return(uchar send_long);
union
{
uint di01;
uchar di[2];
}di_union;
uchar test;
void init_serial(void)
{
pd1 = pd1|0x10 ;
pd1 = pd1 & 0xdf ;
u0mr = 0x65 ;
// u0c0 = 0x00 ;//00 4800 01 2400
u0brg = 0x40 ;
u0c0 = 0x01 ;//2400
te_u0c1 = 1 ;
re_u0c1 = 1 ;
u0rrm = 0 ;
// s0tic = 0x05 ;
s0ric = 0x04 ;
pd1_4 = 1 ;
}
void interrupt_serial0_tx(void)
{
uchar i ;
i = 0 ;
ti_u0c1 = 0 ;
asm("nop") ;
asm("nop") ;
asm("nop") ;
asm("nop") ;
}
void interrupt_serial0_rx(void)
{
uchar i ;
i = 0 ;
temp_mm = u0rb;
series_receive_counter = 0x00 ;
series_receive_sign = 0x01 ;
if(series_receive_long == 0 )
{
if( u0rbl == 0xfe)
{
}
else if(u0rbl == 0x68)
{
receive_array[series_receive_long] = u0rbl ;
series_receive_long = 0x01 ;
ri_u0c1 = 0 ;
series_receive_counter = 0x00 ;
series_receive_sign = 0x01 ;
}
else
{
series_receive_counter = 0x00 ;
series_receive_sign = 0x00 ;
}
}
else
{
receive_array[series_receive_long++] = u0rbl ;
ri_u0c1 = 0 ;
if(series_receive_long == 0x08)
{
if(receive_array[7] != 0x68)
{
series_receive_long = 0;
series_receive_sign = 0;
series_receive_counter = 0 ;
}
}
if(series_receive_long == 0x09)
{
if((receive_array[8]&0x80)==0x80)
{
series_receive_long = 0;
series_receive_sign = 0;
series_receive_counter = 0 ;
}
}
}
ri_u0c1 = 0 ;
u0rb = 0x0000;
}
void series_process(void)
{
uchar i ,j,series_temp;
uchar address_array_temp[20] ;
uchar check_even;
series_temp = 0x00 ;
if(series_receive_end == 0xaa)
{
for(i=0;i<20;i++){address_array_temp[i] = 0x00;}
series_receive_end =0x00 ;
for(j=0;j<6;j++)
{
if(receive_array[j+1] != 0xaa) break ;
if(j == 5) goto not_check_address ;
}
for(j=0;j<6;j++)
{
if(receive_array[j+1] != 0x99) break ;
if(j == 5) goto not_check_address ;
}
for(i=0;i<6;i++) address_array_temp[i] = receive_array[i+1];
for(i=0;i<6;i++){if(address_array_temp[i] == 0xaa ){address_array_temp[i] = 0 ;}}
Read_EeprData(0xa1,address_array ,6,meter_number,0) ;
for(i=0;i<6;i++)
{
if(address_array[i] != address_array_temp[i])
{
series_receive_long = 0 ;
return ;
}
}
not_check_address:
j = 10 + receive_array[9] ;
for(i=0;i<j;i++){series_temp +=receive_array[i] ;}
if(series_temp !=receive_array[j] )
{
series_receive_long = 0 ;
return_read_function(0x00,address_array,0x00,0x00,0x01,0x01) ;
return ;
}
if(receive_array[j+1] != 0x16)
{
return_read_function(0x00,address_array,0x00,0x00,0x01,0x01) ;
series_receive_long = 0 ;
return ;
}
if(receive_array[8]&0x40)
{
series_receive_long = 0 ;
return ;
}
di_union.di[1] = receive_array[11] - 0x33 ;
di_union.di[0] = receive_array[10] - 0x33;
series_receive_long = 0 ;
switch(receive_array[8]&0x1f)
{
case 0x01:
{
switch(di_union.di01)
{
case 0x9010 :
{
if(read_check_one_array(0xa1,send_array+12,5,now_total_power) == 0x55){error_data_return();return;}
ok_data_return(4);return ;
}
case 0x9020 :
{
if(read_check_one_array(0xa1,send_array+12,5,fu_now_power) == 0x55){error_data_return();return;}
ok_data_return(4);return ;
}
case 0x901f:
{
if(read_check_one_array(0xa1,send_array+12,5,now_total_power) == 0x55){error_data_return();return;}
ok_data_return(4);return ;
}
case 0xc030 :
{
if(read_check_one_array(0xa1,send_array+12,4,kwh) == 0x55){error_data_return();return;}
ok_data_return(3);return ;
}
case 0xc032 :
{
if(read_check_one_array(0xa1,send_array+12,7,meter_number) == 0x55){error_data_return();return;}
ok_data_return(6);return ;
}
case 0xc033 ://user_number
{
if(read_check_one_array(0xa1,send_array+12,7,user_number) == 0x55){error_data_return();return;}
ok_data_return(6);return ;
}
case 0xc034 ://sb_number
{
if(read_check_one_array(0xa1,send_array+12,7,sb_number) == 0x55){error_data_return();return;}
ok_data_return(6);return ;
}
case 0xc035 ://password
{
if(read_check_one_array(0xa1,send_array+12,5,password) == 0x55){error_data_return();return;}
ok_data_return(4);return ;
}
case 0xc036 ://password
{
if(read_check_one_array(0xa1,send_array+12,5,password_didu) == 0x55){error_data_return();return;}
ok_data_return(4);return ;
}
default :
{
return_read_function(0x00,address_array,0x00,0x00,0x05,0x02) ;
return ;
}
}
}
case 0x04:// 68 05 05 05 05 05 05 68 04 0C 66 F3 34 33 33 33 34 33 33 33 33 33 57 16
{
if((receive_array[1] ==0xaa)&(receive_array[2] ==0xaa)&(receive_array[3] ==0xaa)&(receive_array[4] ==0xaa)&(receive_array[5] ==0xaa)){return ;}
// if((receive_array[1] ==0x99)&(receive_array[2] ==0x99)&(receive_array[3] ==0x99)&(receive_array[4] ==0x99)&(receive_array[5] ==0x99)){return ;}
switch (di_union.di01)
{
case 0xc030 :
{
series_temp = receive_array[12] - 0x33 ;
if(series_temp == 0x01)
{
return_read_function(0xa0,receive_array+16,3,kwh,0x02,0x00) ;
}
return;
}
/* case 0xc032 :
{
series_temp = receive_array[12] - 0x33 ;
if(series_temp == 0x01)
{
return_read_function(0xa0,receive_array+16,6,meter_number,0x02,0x00) ;
}
return;
}*/
case 0xc033 : //write user_number
{
series_temp = receive_array[12] - 0x33 ;
if(series_temp == 0x01)
{
return_read_function(0xa0,receive_array+16,6,user_number,0x02,0x00) ;
}
return;
}
case 0xc034 ://write sb_number
{
series_temp = receive_array[12] - 0x33 ;
if(series_temp == 0x01)
{
return_read_function(0xa0,receive_array+16,6,sb_number,0x02,0x00) ;
}
return;
}
case 0xc119 ://68 11 11 11 11 11 11 68 04 0A 4C F4 33 33 33 33 33 33 33 33 1C 16
{
series_temp = receive_array[12] - 0x33 ;
if(series_temp == 0x00)
{
return_read_function(0xa0,receive_array+16,4,now_total_power,0x07,0x00) ;
}
return ;
}
default :
{
return_read_function(0x00,address_array,0x00,0x00,0x05,0x02) ;
return;
}
}
}
case 0x08:
{
return;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -