#include "uart.h" #include "addr.h" #include "debug_printf.h" #include "bl24c512.h" #include "WaterMetermanager.h" #include "Led.h" #include "keywd.h" #include "update.h" #include "Flash.h" #include "PHY.h" #include "rtc_ext.h" #include "hbframe.h" extern void gprs_recv_judge_timeset(); extern u8 * get_uart_recv(); extern u8 * get_uart_send(); extern u16 MODBUS_CRC16(u8 *updata, u16 len) ; extern u16 get_crc(u8 * val,u16 len); extern u8 * addr_get(); extern void rpprocess_recv_ack(); const u8 tmp[] = {0x7E,0x7E,0x01,0x13,0x10,0x02,0x00,0x28,0x12,0x34,0x32,0x00,0x3C,0x02,0x05,0xFD,0x20,0x12,0x19,0x01,0x30,0x00,0xF1,0xF1,0x13,0x10,0x02,0x00,0x28,0x49,0xF0,0xF0,0x20,0x12,0x19,0x01,0x10,0x28,0x2B,0x00,0x00,0x00,0x00,0x00,0xFF,0x01,0x2A,0x00,0x02,0x67,0x03,0x00,0x60,0x33,0x00,0x00,0x00,0x00,0x00,0x00,0x45,0x20,0x00,0x00,0x00,0x01,0x38,0x12,0x00,0x00,0xFF,0x02,0x08,0x12,0x03};//,0x03,0x0B,0xB7 u8 send_buff[512]; u16 send_buff_len = 0; u8 recv_buff[512]; u16 recv_buff_len = 0; u8 recv_ana_buff1[512]; u16 recv_ana_buff_len1 = 0; static u8 center_addr = 0x01; static u8 hb_addr[6]; static u8 hb_dl_time[6]; static u16 password = 0x1234; static u16 recvserial = 0; static u16 sendserial = 1; //将2个字节转换成 u16数字。 unsigned short hbu16fromp2(unsigned char * p2) { return (((p2[0]<<8) &0xFF00) + p2[1]); } //将u16数字转换成 2个字节。 void hbp2from16(unsigned char * p2,unsigned short val) { p2[1] = (val&0xFF); p2[0] = ((val)>>8)&0xFF; } u16 get_send_serial() { sendserial ++; return sendserial; } u16 get_recv_seral() { return recvserial; } void set_recv_seral(u16 serial) { recvserial = serial; } void set_dl_time() { } /* void test_crc() { // u16 cc = MODBUS_CRC16((u8*)tmp,sizeof(tmp)); u16 cc = get_crc((u8*)tmp,sizeof(tmp)); // u8 kk = 0; } */ /* 得到中心地址 */ u8 get_center_addr() { return center_addr; } /* 得到集中器地址 */ u8 * get_hb_addr() { u8 * addr = addr_get(); u8 tmp[6]; u8 tmptmp[2] = {0}; MemCpy(tmp,addr,6); MemCpy(hb_addr,addr,6); hb_addr[0] = tmp[5]; hb_addr[1] = tmp[4]; hb_addr[2] = tmp[3]; hb_addr[3] = tmp[2]; hb_addr[4] = tmp[1]; tmptmp[0] = BCDToHex(hb_addr[3]); tmptmp[1] = BCDToHex(hb_addr[4]); u16 aa= tmptmp[0] * 100 + tmptmp[1]; hb_addr[3] = (aa>>8)&0xFF; hb_addr[4] = (aa)&0xFF; return hb_addr; } /* 得到密码 */ u16 get_password() { return password; } void hb_setdl_time() { st_rtc_ext rtc_dat = {0x00}; read_rtc_time(&rtc_dat); hb_dl_time[0] = rtc_dat.year; hb_dl_time[1] = rtc_dat.month; hb_dl_time[2] = rtc_dat.day; if(rtc_dat.hour == 0x00) { hb_dl_time[3] = 0x23; } else { hb_dl_time[3] = rtc_dat.hour-1; } hb_dl_time[4] = 0x00; hb_dl_time[5] = 0; } void hb_get_time(u8 * time) { st_rtc_ext rtc_dat = {0x00}; read_rtc_time(&rtc_dat); time[0] = rtc_dat.year; time[1] = rtc_dat.month; time[2] = rtc_dat.day; /* if(rtc_dat.hour == 0x00) { time[3] = 0x23; } else { time[3] = rtc_dat.hour; } */ time[3] = rtc_dat.hour; time[4] = rtc_dat.min; time[5] = 0; } u8 * hb_getdl_time() { return hb_dl_time; } bool hb_frame_recv() { u8 * p = get_uart_recv(); u8 * q = get_uart_send(); // u16 len = 0; u8 fn = p[10]; // struct hb_struct * hb = (struct hb_struct *)p; memset(send_buff,0,sizeof(send_buff)); switch(fn) { default: break; case AFN_RP_TIME: //0x32 遥测站定时报 gprs_recv_judge_timeset(); rpprocess_recv_ack(); break; case AFN_RP_HOURTIME: //0x34 遥测站小时报 break; case AFN_INIT: //0x47 初始化固态存储数据 break; case AFN_RECOVER: //0x48 恢复终端出厂设置 break; case AFN_MODIFY_PWD: //0x49 修改密码 break; case AFN_SET_RTC: //0x4A 设置遥测站时钟 break; case AFN_SET_ICCARD: //0x4B 设置遥测终端 IC 卡状态 break; case AFN_CTL_SHUIBANG: //0x4C 控制水泵开关命令/水泵状态信息自报 break; case AFN_CTL_FAMEN: //0x4D 控制阀门开关命令/阀门状态信息自报 break; case AFN_CTL_ZAMEN: //0x4E 控制闸门开关命令/闸门状态信息自报 break; case AFN_CTL_WATER_VALUE: //0x4F 水量定值控制命令 break; case AFN_QRY_EVENT: //0x50 中心站查询遥测站事件记录 break; case AFN_QRY_RTC: //0x51 中心站查询遥测站时钟 break; } return true; } void set_uart_recv(u8 * val,u16 len) { memmove(recv_buff,val,len); recv_buff_len = len; //将接收的序列号也放这里 //set_recvserial(U16From2(&val[3])); } void frame_process(u8 * val,u16 len) { memmove(recv_buff,val,len); recv_buff_len = len; set_uart_recv(val,len); u8 * p = recv_buff; u16 i = 0; while(1) { u16 ck1 = 0; u16 ck2 = 0; if(0x7E == p[0] && 0x7E == p[1]) { //0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 //7E 7E 01 00 00 00 00 01 0C 50 2F 00 08 02 00 02 12 12 07 08 56 50 03 22 8D u16 tmplen = (p[11])<<8|p[12]; tmplen = tmplen&0xFFF; tmplen = tmplen + 15+2; ck1 = get_crc(&p[0],tmplen-2); ck2 = hbu16fromp2(&p[tmplen-2]); if(ck1 == ck2) { //仅仅只是替换用 memmove(recv_ana_buff1,recv_buff,recv_buff_len); recv_ana_buff_len1 = recv_buff_len; memmove(recv_buff,p,tmplen); recv_buff_len = tmplen; hb_frame_recv(); //处理完后,恢复 recv_buff_len = recv_ana_buff_len1; memmove(recv_buff,recv_ana_buff1,recv_buff_len); gprs_recv_judge_timeset(); p = p + tmplen; i = i + tmplen; continue; } else { printf("[frame] crc err\r\n"); } } i++; p++; if(i>recv_buff_len) { break; } } }