#include <serial_at_cmd_app.h>
|
#include <global_param.h>
|
#include <string.h>
|
#include <stdio.h>
|
#include "Usart.h"
|
#include "mk_flash.h"
|
//#include "dw_app.h"
|
//#include "UsartII.h"
|
//#include "main.h"
|
#include "board.h"
|
//#include "Spi.h"
|
//#include "radio.h"
|
|
|
|
//#define EUART0_RX_BUF_SIZE 100
|
#define Label_id_local 1 //±êÇ©id
|
#define data_buff_MAX 50 //»ùÕ¾ÊýÁ¿
|
#define Lora_TXD_bff_MAX 220 //·¢ËÍ»º´æÇø´óС >4+8+4*»ùÕ¾ÊýÁ¿+2=14+4*»ùÕ¾ÊýÁ¿
|
|
uint8_t mUsartReceivePack[100] = {0};
|
uint8_t mUsart2ReceivePack[150] = {0};
|
uint8_t GPS_GGAmessage[150]={0};
|
uint8_t GPS_GSVmessage[150]={0};
|
double jd,wd;
|
int analysis_num,pos_state;
|
uint8_t state5V_prase_flag=1,gps_prase_flag=1;
|
extern void IO_LED_control_change(uint8_t data);
|
extern void IO_control_init(void);
|
extern void blink_led(uint8_t*state);
|
extern void updata_led_power_state(void);
|
extern uint8_t gps_success_state,gps_open_flag;
|
extern uint8_t gps_success_state,gps_enable_flag,gps_need_data_flag,gps_timeout_flag,gps_power_state;
|
extern uint16_t gps_wait_count;
|
typedef enum
|
{
|
BLE_RECV_STATE_IDLE = 0,
|
BLE_RECV_STATE_MAC,
|
BLE_RECV_STATE_RSSI,
|
//BLE_RECV_STATE_LF,
|
} E_BLERecvState;
|
static char gps_header[20];
|
typedef struct
|
{
|
char m_pData[100];
|
uint32_t m_u32Len;
|
} GGA_DataStruct;
|
typedef struct
|
{
|
E_BLERecvState m_eState;
|
char m_macHeader[100],m_rssiHeader2[100];
|
uint32_t m_u32HeaderLen,m_u32Header2Len;
|
|
char m_acRecvBuf[128];
|
uint32_t m_u32RecvLen;
|
} ST_BLERecv;
|
|
|
uint8_t mUsart2ReceivePack_before , mUsart2ReceivePack_now;
|
uint8_t j_ct=0,CT_satrt_temp=0,CT_satrt=0,numb_base=0 ;
|
|
uint8_t id_cmpare[12]= {0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x30, 0x30, 0x30, 0x31}; //123456780001//²âÊÔ//RC2202A£º
|
uint32_t CT_sum=0;
|
char char_broadcast_data[80];//¹ã²¥Êý¾Ý
|
|
uint8_t Lora_TXD_bff[Lora_TXD_bff_MAX]; //lora·¢ËÍ»º´æÇø
|
uint16_t data_buff[data_buff_MAX][2]; //»ùÕ¾Êý¾Ý»º´æÇø
|
|
char char_mac[14],char_ssi[6];
|
//int32_t distance_int;
|
double ssi_double;
|
uint16_t temp_16,temp_16_id,temp_16_distance,data_buff_start;
|
|
|
uint16_t Checksum_u16(uint8_t* pdata, uint32_t len)
|
{
|
uint16_t sum = 0;
|
uint32_t i;
|
for(i=0; i<len; i++)
|
sum += pdata[i];
|
sum = ~sum;
|
return sum;
|
}
|
void SendComMap0(uint8_t data_length, uint8_t index)//±íʾ³É¹¦¶ÁÈ¡µÄ»ØÓ¦°ü
|
{
|
static uint8_t send_frame[EUART0_RX_BUF_SIZE];
|
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], 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_send(UART_ID0, send_frame,data_length+9, NULL);
|
}
|
void SendComMap(uint8_t data_length, uint8_t index)//±íʾ³É¹¦¶ÁÈ¡µÄ»ØÓ¦°ü
|
{
|
static uint8_t send_frame[EUART0_RX_BUF_SIZE];
|
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], 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_send(UART_ID1, send_frame,data_length+9, NULL);
|
}
|
void UpdateProcess(uint8_t index)
|
{
|
if(index == 2*CNT_UPDATE)
|
{
|
uint32_t result = 0;
|
uint16_t tmp = 0xAAAA;
|
__disable_irq();
|
result = flash_open(FLASH_ID0,NULL);
|
if(!result)//´ò¿ª³É¹¦
|
flash_erase(FLASH_ID0,APP_CONFIG_IAPFLAG_SECTOR_ADDR,FLASH_SECTOR_SIZE);
|
result = flash_write_nbytes(FLASH_ID0,APP_CONFIG_IAPFLAG_MAP,(uint8_t*)&tmp,2);
|
__enable_irq();
|
Serial0PutString("½øÈëÉý¼¶Ä£Ê½\r\n");
|
g_com_map[CNT_UPDATE]=0;
|
save_com_map_to_flash();
|
delay_us(100000);
|
NVIC_SystemReset(); //Èí¸´Î»»Øµ½bootloader
|
}
|
if(index == 2*CNT_REBOOT)
|
{ g_com_map[CNT_REBOOT]=0;
|
g_com_map[MAP_SIGN_INDEX]=0;
|
save_com_map_to_flash();
|
delay_us(100000);
|
NVIC_SystemReset(); //Èí¸´Î»»Øµ½bootloader
|
}
|
if(index == 2*CNT_RESTART)
|
{
|
g_com_map[CNT_RESTART]=0;
|
save_com_map_to_flash();
|
delay_us(100000);
|
NVIC_SystemReset(); //Èí¸´Î»»Øµ½bootloader
|
}
|
|
}
|
double d_value;
|
uint16_t test_calculate,pack_checksum_test;
|
extern uint32_t tag_id_authorization_list[1024];
|
extern uint16_t bind_distance,button_determinate_distance,change_by_frequency_distance;
|
extern uint8_t tag_near_frequency;
|
extern tag_id_authorization_list_num;
|
#define ID_SIZE 4
|
uint32_t temp_key;
|
uint8_t required_size_temp;
|
uint8_t delete_count_temp;
|
int low_temp,high_temp,mid_temp,elements_to_move_temp,temp_index;
|
void add_new_tag_id_to_list(uint8_t* add_list,uint32_t*tag_authorization_idlist,uint32_t*authorization_list_num)
|
{
|
uint32_t count = add_list[0];
|
uint32_t current_size = *authorization_list_num;
|
uint32_t new_size = current_size + count;
|
|
// ´¦Àíÿ¸öÐÂID
|
for (uint32_t i = 0; i < count; i++) {
|
uint32_t add_offset = 1 + i * 4; // Ìø¹ý¼ÆÊýbyte
|
uint32_t new_id=0;
|
memcpy(&new_id,&add_list[add_offset],4);
|
|
// ¶þ·Ö²éÕÒÈ·¶¨²åÈëλÖÃ
|
uint32_t left = 0;
|
uint32_t right = current_size;
|
uint32_t insert_pos = current_size;
|
bool exists = false;
|
while (left < right) {
|
uint32_t mid = left + (right - left) / 2;
|
uint32_t mid_val = tag_authorization_idlist[mid];
|
|
if (mid_val == new_id) {
|
exists = true;
|
break;
|
} else if(tag_authorization_idlist[mid] < new_id) {
|
left = mid + 1;
|
} else {
|
right = mid;
|
}
|
}
|
|
// Èç¹ûID²»´æÔÚ£¬Ôò²åÈë
|
if (!exists) {
|
insert_pos = left;
|
// ʹÓÃmemmoveÒÆ¶¯ÔªËØÎªÐÂIDÌÚ³ö¿Õ¼ä
|
memmove(
|
&tag_authorization_idlist[left + 1],
|
&tag_authorization_idlist[left],
|
(current_size - left) * sizeof(uint32_t)
|
);
|
|
// ²åÈëÐÂID
|
tag_authorization_idlist[left] = new_id;
|
current_size++; // ¸üе±Ç°´óС
|
}
|
}
|
*authorization_list_num = current_size; // ¸üÐÂ×ÜÊý
|
|
}
|
void delete_authorization_list(uint8_t* delete_list,uint32_t*tag_authorization_idlist,uint32_t*authorization_list_num)
|
{
|
if (*authorization_list_num == 0) {
|
// for (int i = 0; i < taglist_num; i++) {
|
// tag_authorized_List[i] = 0;
|
// }
|
return;
|
}
|
uint8_t delete_count = delete_list[0];
|
delete_count_temp=delete_count;
|
// ±éÀúÐèÒª²éÕÒµÄÿ¸öID
|
for (int i = 0; i < delete_count; i++) {
|
uint32_t key=0;
|
uint8_t required_size = 1 + i * ID_SIZE;
|
required_size_temp= required_size;
|
memcpy(&key,&delete_list[required_size],4);
|
int low = 0;
|
int high = *authorization_list_num - 1;
|
int found = 0; // ±ê¼ÇÊÇ·ñÕÒµ½
|
int index=0;
|
// ÔÚÊÚȨÁбíÖÐÖ´Ðжþ·Ö²éÕÒ
|
low_temp=low;//²âÊÔ
|
high_temp=high;//²âÊÔ
|
temp_key=key;
|
while (low <= high) {
|
int mid = low + (high - low) / 2; // ·ÀÖ¹ÕûÊýÒç³ö
|
LOG_INFO(TRACE_MODULE_APP,"high%d,low%d,mid%d,key%#x\r\n",high,low,mid,key);
|
if (tag_id_authorization_list[mid] == key) {
|
found = 1; // ÕÒµ½Æ¥ÅäÏî
|
index=mid;
|
temp_index=index;
|
break;
|
} else if (tag_id_authorization_list[mid] < key) {
|
low = mid + 1; // ÔÚÓҰ벿·Ö¼ÌÐø²éÕÒ
|
} else {
|
high = mid - 1; // ÔÚ×ó°ë²¿·Ö¼ÌÐø²éÕÒ
|
}
|
|
}
|
|
if(found)
|
{
|
LOG_INFO(TRACE_MODULE_APP,"½øÈëɾ³ýindex%d,key%#x\r\n",index,key);
|
int elements_to_move = *authorization_list_num - index - 1;
|
elements_to_move_temp=elements_to_move;
|
if (elements_to_move > 0) {
|
// ¼ÆËãÔ´µØÖ·ºÍÄ¿±êµØÖ·
|
void *src = (uint32_t *)tag_authorization_idlist + (index + 1);
|
void *dest =(uint32_t *)tag_authorization_idlist + index;
|
|
// ʹÓÃmemmove½øÐÐÄÚ´æ¿éÒÆ¶¯£¨´¦ÀíÖØµþÄÚ´æÇøÓò£©
|
memmove(dest, src, elements_to_move * 4);
|
*authorization_list_num=*authorization_list_num-1;//³É¹¦É¾³ýÒ»¸ö¸üÐÂÊýÁ¿
|
tag_authorization_idlist[*authorization_list_num]=0xffffffff;//½«¶àÓàÖØµþ²¿·ÖÖØÖÃ
|
}else if (elements_to_move==0&&index==0){
|
*authorization_list_num=*authorization_list_num-1;//³É¹¦É¾³ýÒ»¸ö¸üÐÂÊýÁ¿
|
tag_authorization_idlist[index]=0xffffffff;
|
}
|
|
}
|
}
|
}
|
extern uint8_t bind_flag;
|
void Usart0ParseDataHandler(uint8_t data)
|
{
|
// È«¾Ö±äÁ¿
|
static Usart0ReceiveState usart0_receive_state = Usart0ReceiveWaitHead0;
|
|
static uint8_t index = 0; // »º³åÇøË÷Òý
|
static uint8_t pack_cmd_type = 0; // Ö¸ÁîÀàÐÍ
|
static uint8_t pack_msg_type = 0; // ÏûÏ¢ÀàÐÍ
|
static uint8_t pack_data_len = 0; // Êý¾Ý³¤¶È
|
static uint8_t pack_param_addr = 0; // ²ÎÊýµØÖ·
|
static uint16_t pack_checksum = 0; // ½ÓÊÕµ½µÄУÑéºÍ
|
static uint16_t calculated_checksum = 0; // ¼ÆËãµÃµ½µÄУÑéºÍ
|
static uint8_t send_frame[256]; // ÓÃÓÚ¼ÆËãУÑéºÍµÄÖ¡
|
static uint8_t frame_index = 0; // Ö¡»º³åÇøË÷Òý
|
static uint8_t pack_datalen = 0;
|
LOG_INFO(TRACE_MODULE_APP,"ÊÕµ½Êý¾Ý%c\r\n",data);
|
//LOG_INFO(TRACE_MODULE_APP,"ÊÕµ½ %#x\r\n",data);
|
switch(usart0_receive_state) {
|
case Usart0ReceiveWaitHead0:
|
if(data == 0x55) {
|
usart0_receive_state = Usart0ReceiveWaitHead1;
|
// ³õʼ»¯Ö¡»º³åÇø
|
frame_index = 0;
|
send_frame[frame_index++] = data;
|
}
|
break;
|
|
case Usart0ReceiveWaitHead1:
|
if(data == 0xAA) {
|
usart0_receive_state = Usart0ReceiveWaitCmdType;
|
send_frame[frame_index++] = data;
|
} else {
|
usart0_receive_state = Usart0ReceiveWaitHead0;
|
}
|
break;
|
|
case Usart0ReceiveWaitCmdType:
|
if(data == 0x23) {
|
pack_cmd_type = data;
|
usart0_receive_state = Usart0ReceiveWaitMsgType;
|
send_frame[frame_index++] = data;
|
} else {
|
usart0_receive_state = Usart0ReceiveWaitHead0;
|
}
|
break;
|
|
case Usart0ReceiveWaitMsgType:
|
if(data == 0x2||data==0x1||data == 0x3||data==0x4||data==0x5||data==0x6) { // ¶Áд»Ø¸´ÏûÏ¢ÀàÐÍ
|
pack_msg_type = data;
|
usart0_receive_state = Usart0ReceiveWaitDataLen;
|
send_frame[frame_index++] = data;
|
} else {
|
usart0_receive_state = Usart0ReceiveWaitHead0;
|
}
|
break;
|
|
case Usart0ReceiveWaitDataLen:
|
pack_data_len = data;
|
index = 0;
|
usart0_receive_state = Usart0ReceiveWaitData;
|
send_frame[frame_index++] = data;
|
if( pack_data_len-3==0)//ÈôµÈÓÚ0Ìáǰµ÷µ½Ð£Ñé
|
usart0_receive_state=Usart0ReceiveWaitChecksum1;
|
break;
|
|
// case Usart0ReceiveWaitParamAddr:
|
// pack_param_addr = data;
|
// if(pack_msg_type==CMD_READ)
|
// {
|
// usart0_receive_state = Usart0ReceiveWaitChecksum1;
|
// pack_datalen=pack_data_len-6;
|
// }else{
|
// usart0_receive_state = Usart0ReceiveWaitData;
|
// }
|
// send_frame[frame_index++] = data;
|
// break;
|
|
case Usart0ReceiveWaitData:
|
|
send_frame[frame_index++] = data;
|
mUsart2ReceivePack[index++] = data;
|
|
if(index == pack_data_len-3) {
|
usart0_receive_state = Usart0ReceiveWaitChecksum1;
|
//pack_datalen=pack_data_len;
|
}
|
break;
|
|
case Usart0ReceiveWaitChecksum1:
|
pack_checksum = data; // µÍ×Ö½Ú
|
pack_checksum_test = data; // µÍ×Ö½Ú
|
send_frame[frame_index++] = data;
|
usart0_receive_state = Usart0ReceiveWaitChecksum2;
|
LOG_INFO(TRACE_MODULE_APP,"ÊÕµ½Ð£Ñé1 %#x\r\n",data);
|
break;
|
case Usart0ReceiveWaitChecksum2:
|
pack_checksum |= data<<8; // ¸ß×Ö½Ú
|
pack_checksum_test |= data<<8; // ¸ß×Ö½Ú
|
LOG_INFO(TRACE_MODULE_APP,"ÊÕµ½Ð£Ñé2 %#x\r\n",data);
|
// ¼ÆËãУÑéºÍ (´ÓµÚ3¸ö×Ö½Ú¿ªÊ¼£¬³¤¶ÈΪ4+Êý¾Ý³¤¶È)
|
// if(pack_msg_type!=CMD_REPLY)
|
// {
|
calculated_checksum = Checksum_u16(&send_frame[2],pack_data_len);
|
// }else{
|
// //calculated_checksum = Checksum_u16(&send_frame[2],4);
|
//
|
// }
|
test_calculate=calculated_checksum;
|
LOG_INFO(TRACE_MODULE_APP,"ÊÕµ½Ð£Ñé %#x,%#x\r\n",calculated_checksum,pack_checksum);
|
// Ñé֤УÑéºÍ
|
if(pack_checksum == calculated_checksum) {
|
// УÑéͨ¹ý£¬´¦ÀíÊý¾Ý
|
switch(pack_msg_type)
|
{
|
case BIND_DISTANCE_FOR_TAG:
|
memcpy(&bind_distance,&mUsart2ReceivePack[0],2);
|
memcpy(&g_com_map[BIND_DISTANCE],&bind_distance,2);
|
bind_flag=1;
|
save_com_map_to_flash();
|
break;
|
case DELETE_ALL:
|
memset(tag_id_authorization_list,0,sizeof(tag_id_authorization_list));
|
save_taglist_map_to_flash();
|
break;
|
case DELETE_PART:
|
delete_authorization_list(&mUsart2ReceivePack,&tag_id_authorization_list,&tag_id_authorization_list_num);//ɾ±íÖÐÔªËØ²Ù×÷
|
save_taglist_map_to_flash();
|
break;
|
case SET_DISTANCE_DETERMINATION:
|
memcpy(&button_determinate_distance,&mUsart2ReceivePack[0],2);//É趨¿ª¹ØÅжϾàÀë
|
memcpy(&g_com_map[DETERMINATION_DISTANCE],&button_determinate_distance,2);
|
save_com_map_to_flash();
|
break;
|
case SET_FREQUENCE_BY_DISTANCE:
|
memcpy(&change_by_frequency_distance,&mUsart2ReceivePack[0],2);//É趨¸½½ü¾àÀë
|
memcpy(&g_com_map[FREQUENCY_DISTANCE],&change_by_frequency_distance,2);
|
tag_near_frequency=mUsart2ReceivePack[2];//»ñÈ¡É趨ƵÂÊ
|
memcpy(&g_com_map[NERA_FREQUENCY],&tag_near_frequency,1);
|
save_com_map_to_flash();
|
break;
|
case ADD_NEW_TAG_IN_LIST:
|
add_new_tag_id_to_list(&mUsart2ReceivePack,&tag_id_authorization_list,&tag_id_authorization_list_num);
|
save_taglist_map_to_flash();//´æÈëflash
|
break;
|
default:
|
break;
|
}
|
}
|
|
// ÖØÖÃ״̬»ú
|
usart0_receive_state = Usart0ReceiveWaitHead0;
|
index = 0;
|
frame_index = 0;
|
break;
|
|
default:
|
usart0_receive_state = Usart0ReceiveWaitHead0;
|
index = 0;
|
frame_index = 0;
|
break;
|
}
|
|
|
}
|
void Usart1ParseDataHandler(uint8_t data)
|
{
|
if(state5V_prase_flag&&!g_com_map[MODBUS_MODE])
|
{ //Éý¼¶³ÌÐò
|
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 == UsartReceiveWaitChecksum)
|
{ //ÈôÊÕµ½Ð£ÑéºÍ°ü
|
checksum = 0;
|
for(int i = 0; i<pack_length-5; i++) {
|
checksum += mUsartReceivePack[i];
|
}
|
checksum += pack_cmd;
|
checksum += pack_length;
|
checksum += pack_index;
|
checksum += pack_datalen;
|
checksum += pack_msgtype;
|
if(((data + checksum)&0xff) == 0xFF) //УÑéͨ¹ý
|
{
|
switch(pack_cmd)
|
{
|
case CMD_WRITE:
|
if(pack_index==MODBUS_MODE*2)
|
{
|
Uart1GpsRecDebugSend();
|
g_com_map[MODBUS_MODE] = 1;
|
return;
|
}
|
//´ÓmUsartReceivePackÖжÁÈ¡pack_length³¤¶ÈµÄ×Ö½Ú£¬·Åµ½È«¾Ö±äÁ¿ÖÐ,¸³Öµ±£´æµÄ²ÎÊý²¢ÇÒ´æÈëflash
|
memcpy((uint8_t*)&g_com_map + pack_index, mUsartReceivePack, pack_datalen);
|
if(mUsartReceivePack[0]==1)
|
UpdateProcess(pack_index);
|
//·µ»ØÒ»¸öerror״̬
|
//SendComMap(pack_datalen,pack_index);
|
save_com_map_to_flash();
|
//delay_ms(100);
|
NVIC_SystemReset();
|
break;
|
case CMD_READ:
|
//read°üÖÐdata×Ö½Ú£¬¼´mUsartReceivePack[0]±íʾÊý¾Ý³¤¶È£»
|
//´Óg_com_data½á¹¹ÌåÖеĵÚindexλÖöÁÈ¡³¤¶ÈΪmUsartReceivePack[0]µÄ×Ö½Ú£¬·¢ËͳöÀ´
|
SendComMap0(pack_datalen,pack_index>>1);
|
break;
|
default:
|
break;
|
}
|
}
|
usart_receive_state = UsartReceiveWaitHead0;
|
pack_index = 0;
|
pack_length = 0;
|
index=0;
|
} else if((usart_receive_state == UsartReceiveWaitData) ) { //Èô¹ûÊÕµ½µÄÊÇÕý³£Í¨Ñ¶°ü
|
mUsartReceivePack[index] = data;
|
index++;
|
if(index == pack_length-5) { //Èç¹ûÊÕµ½µÄindexÓ볤¶ÈÏàµÈ
|
usart_receive_state = UsartReceiveWaitChecksum;
|
}
|
} 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) && (data == 0x3)) {
|
usart_receive_state = UsartReceiveWaitLength;
|
pack_msgtype = data;
|
}
|
|
else {
|
usart_receive_state = UsartReceiveWaitHead0;
|
pack_index = 0;
|
pack_length = 0;
|
}
|
} else if(gps_prase_flag)
|
{
|
static uint8_t index = 0;
|
//GPS½âÎöÊý¾Ý
|
// static ST_BLERecv BLE_recvive;
|
GGA_DataStruct jdrecv,wdrecv,Posstate;
|
|
//½ÓÊÕÊý¾Ý¿ªÊ¼·ÖÎö
|
mUsart2ReceivePack[index] = data; //charÊý×é´«½øÀ´²ÎÊýdata
|
mUsart2ReceivePack_before = mUsart2ReceivePack_now;
|
mUsart2ReceivePack_now=data;
|
index++;
|
if( mUsart2ReceivePack_before == 0x0D && mUsart2ReceivePack_now==0x0A )//½ÓÊÕÊý¾Ýµ½¡°0x0D 0x0A¡±½áÊø
|
{
|
//½âÎö¸ÃÌõGPS±¨ÎÄ
|
|
analysis_num=sscanf((char*)mUsart2ReceivePack,"$%[^,],%*[^,],%[^,],%*[^,],%[^,],%*[^,],%[^,],%*[^,],%*[^,],%*[^,],%*[^,],%*[^,],%*[^,],%*[^,],%*s",gps_header,wdrecv.m_pData,jdrecv.m_pData,Posstate.m_pData);
|
if(!memcmp(gps_header,"GNGGA",5))
|
{
|
memcpy(GPS_GGAmessage,mUsart2ReceivePack,strlen(mUsart2ReceivePack)-2);
|
|
wd=strtod(wdrecv.m_pData,NULL);
|
jd=strtod(jdrecv.m_pData,NULL);
|
if(wd!=0)
|
pos_state=atoi(Posstate.m_pData);
|
if(pos_state!=0)
|
{
|
pos_state=0;//·ÀÖ¹¶à´Î½øÈë
|
}
|
|
}
|
// if(!memcmp(gps_header,"GBGSV",5))
|
// {memcpy(GPS_GSVmessage,mUsart2ReceivePack,strlen(mUsart2ReceivePack)-2);
|
// GPS_ParseGSV(GPS_GSVmessage,strlen(GPS_GSVmessage));
|
//
|
// }
|
|
memset(mUsart2ReceivePack,0,sizeof(mUsart2ReceivePack));
|
memset(wdrecv.m_pData,0,sizeof(wdrecv.m_pData));
|
memset(jdrecv.m_pData,0,sizeof(jdrecv.m_pData));
|
memset(Posstate.m_pData,0,sizeof(Posstate.m_pData));
|
index=0;
|
mUsart2ReceivePack_before=0;
|
mUsart2ReceivePack_now=0;
|
}
|
}
|
}
|