#include "serial_at_cmd_app.h" #include "global_param.h" #include #include #include "dw_app.h" #include "RTC.h" #define MSG_RW 3 #define MSG_WTAG 6 #define MSG_USERDATA 0x10 #define CMD_READ 1 #define CMD_WRITE 2 #define CMD_REPLY 3 #define EUART_RX_BUF_SIZE 200 typedef enum{ UsartReceiveWaitHead0, UsartReceiveWaitHead1, UsartReceiveWaitMsgType, UsartReceiveWaitLength, UsartReceiveWaitCMD, UsartReceiveWaitIndex, UsartReceiveWaitDataLen, UsartReceiveWaitData, UsartReceiveWaitChecksum0, UsartReceiveWaitChecksum1 }UsartRecvPackState; uint8_t mUsartReceivePack[100] = {0}; uint8_t send_frame[200]; void SendConfigConfirm(uint8_t pack_msgtype,uint8_t pack_length) { uint16_t checksum = 0; send_frame[0] = 0x55; send_frame[1] = 0xAA; send_frame[2] = 0x09; send_frame[3] = 8; send_frame[4] = pack_msgtype; send_frame[5] = pack_length; OUT485_ENABLE; checksum = Checksum_u16(&send_frame[2],8); memcpy(&send_frame[10],&checksum,2); USART_puts(send_frame, 12); OUT485_DISABLE; } void SendComMap(uint8_t data_length, uint8_t index) { uint16_t checksum = 0; send_frame[0] = 0x55; send_frame[1] = 0xAA; send_frame[2] = 0x03; send_frame[3] = data_length+5; send_frame[4] = CMD_REPLY; send_frame[5] = index; send_frame[6] = data_length; memcpy(&send_frame[7], &g_com_map[index>>1], data_length); for(int i = 0; i<(data_length+5); i++) { checksum += send_frame[2+i]; } checksum = Checksum_u16(&send_frame[2],5+data_length); memcpy(&send_frame[7+data_length],&checksum,2); UART_PushFrame(send_frame, data_length+9); } u8 remotetag_para[30],remotetag_paralen,userdata_len,userdata[50]; u8 remotesend_state=0; u16 rec_checksum,userdata_targetid; u32 getuserdata_tick; void UsartParseDataHandler(uint8_t data) { static UsartRecvPackState usart_receive_state = UsartReceiveWaitHead0; uint16_t checksum = 0; static uint8_t pack_datalen = 0,pack_length = 0,pack_index = 0,pack_msgtype = 0,pack_cmd = CMD_READ; static uint8_t index = 0; if(usart_receive_state == UsartReceiveWaitChecksum1) { //???????. checksum = 0; for(int i = 0; iAIRCR = 0X05FA0000|(unsigned int)0x04; //?????bootloader break; case CMD_READ: //read??data??,?mUsartReceivePack[0]??????; //?g_com_data??????index???????mUsartReceivePack[0]???,???? SendComMap(pack_datalen,pack_index); break; default: break; } break; case MSG_WTAG: remotesend_state++; if(remotesend_state>14) remotesend_state=1; memcpy(remotetag_para,mUsartReceivePack,REMOTEPARA_LEN); break; case MSG_USERDATA: userdata_targetid = pack_cmd|pack_index<<8; userdata_len = pack_datalen; //memcpy(&userdata_targetid,mUsartReceivePack,2); if(userdata_len==USERDATA_LEN) { memcpy(userdata,&userdata_targetid,2); userdata[2] = userdata_len; memcpy(&userdata[3],&mUsartReceivePack,USERDATA_LEN); getuserdata_tick = time32_incr; SendConfigConfirm(pack_msgtype,pack_length); } break; } } usart_receive_state = UsartReceiveWaitHead0; pack_index = 0; pack_length = 0; index=0; } else if((usart_receive_state == UsartReceiveWaitChecksum0) ) { rec_checksum = data; usart_receive_state = UsartReceiveWaitChecksum1; }else if((usart_receive_state == UsartReceiveWaitData) ) { //??????????? mUsartReceivePack[index] = data; index++; if(index == pack_length-5) { //?????index????? usart_receive_state = UsartReceiveWaitChecksum0; } } else if(usart_receive_state == UsartReceiveWaitDataLen) { //???????? pack_datalen = data; usart_receive_state = UsartReceiveWaitData; }else if(usart_receive_state == UsartReceiveWaitIndex) { //???????? pack_index = data; usart_receive_state = UsartReceiveWaitDataLen; } else if(usart_receive_state == UsartReceiveWaitCMD) { //???????? pack_cmd = data; usart_receive_state = UsartReceiveWaitIndex; } else if(usart_receive_state == UsartReceiveWaitLength) { //?????? pack_length = data; pack_index = 0; usart_receive_state = UsartReceiveWaitCMD; } else if((usart_receive_state == UsartReceiveWaitHead0) && (data == 0x55)) { //??????? usart_receive_state = UsartReceiveWaitHead1; } else if((usart_receive_state == UsartReceiveWaitHead1) && (data == 0xAA)) { //??????? usart_receive_state = UsartReceiveWaitMsgType; }else if ((usart_receive_state == UsartReceiveWaitMsgType)) { usart_receive_state = UsartReceiveWaitLength; pack_msgtype = data; } else { usart_receive_state = UsartReceiveWaitHead0; pack_index = 0; pack_length = 0; } }