From 43d055054fc3eee6d0c63f429a14ce74712626c1 Mon Sep 17 00:00:00 2001 From: chen <15335560115@163.com> Date: 星期四, 22 五月 2025 18:08:48 +0800 Subject: [PATCH] 初步写好MK与蓝牙的传输交互函数未测试 --- keil/include/drivers/serial_at_cmd_app.c | 549 ++++++++++++++++++++++++++++++++++++++---------------- 1 files changed, 381 insertions(+), 168 deletions(-) diff --git a/keil/include/drivers/serial_at_cmd_app.c b/keil/include/drivers/serial_at_cmd_app.c index 3776eee..aa7ce9b 100644 --- a/keil/include/drivers/serial_at_cmd_app.c +++ b/keil/include/drivers/serial_at_cmd_app.c @@ -19,17 +19,8 @@ #define Lora_TXD_bff_MAX 220 //发送缓存区大小 >4+8+4*基站数量+2=14+4*基站数量 uint8_t mUsartReceivePack[100] = {0}; -uint8_t mUsart2ReceivePack[150] = {0}; -double jd,wd; -int analysis_num,pos_state; -uint8_t state5V_prase_flag,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; -extern uint8_t gps_success_state,gps_enable_flag,gps_need_data_flag,gps_timeout_flag; -extern uint16_t gps_wait_count; +uint8_t mUsart2ReceivePack[100] = {0}; + typedef enum { BLE_RECV_STATE_IDLE = 0, @@ -37,12 +28,6 @@ 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; @@ -57,7 +42,7 @@ 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: +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];//广播数据 @@ -70,7 +55,7 @@ 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 Checksum_u16(uint8_t* pdata, uint32_t len) { uint16_t sum = 0; uint32_t i; @@ -79,27 +64,47 @@ sum = ~sum; return sum; } - +void SendComMap0(uint8_t data_length, uint8_t index)//表示成功读取的回应包 + { + static uint8_t send_frame[EUART_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[EUART_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); + static uint8_t send_frame[EUART_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) { @@ -110,158 +115,366 @@ __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); + 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 + NVIC_SystemReset(); //软复位回到bootloader } if(index == 2*CNT_REBOOT) - { g_com_map[CNT_REBOOT]=0; + { g_com_map[CNT_REBOOT]=0; g_com_map[MAP_SIGN_INDEX]=0; save_com_map_to_flash(); - delay_us(100000); - NVIC_SystemReset(); //软复位回到bootloader + 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 + delay_us(100000); + NVIC_SystemReset(); //软复位回到bootloader } } +extern uint8_t enable_sleep_count,sleep_flag; void UsartParseDataHandler(uint8_t data) { - if(state5V_prase_flag) - { //升级程序 - 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; +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: + //从mUsartReceivePack中读取pack_length长度的字节,放到全局变量中,赋值保存的参数并且存入flash + enable_sleep_count=0; + 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: + enable_sleep_count=0; + //read包中data字节,即mUsartReceivePack[0]表示数据长度; + //从g_com_data结构体中的第index位置读取长度为mUsartReceivePack[0]的字节,发送出来 + SendComMap(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; + } - 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: - //从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]的字节,发送出来 - SendComMap(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) - { -//GPS解析数据 -// static ST_BLERecv BLE_recvive; - GGA_DataStruct jdrecv,wdrecv,Posstate; - static uint8_t index = 0; - //接收数据开始分析 - 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)) - { - wd=strtod(wdrecv.m_pData,NULL); - jd=strtod(jdrecv.m_pData,NULL); - pos_state=atoi(Posstate.m_pData); - } else { - wd=0; - jd=0; - } - blink_led(&gps_success_state); - if(pos_state!=0) - { - //4g.jd=jd; - //4g.wd=wd; - gps_timeout_flag=1;//不超时接收状态 - gps_need_data_flag=0;//接收数据完成 - gps_wait_count=0;//清0接收状态 -// gps_enable_flag=0;//收到有效数据关闭GPS - } - //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; - } - } } +void uart0_send_ComMap_to_BLE(uint8_t data_length, uint8_t index) +{ + static uint8_t send_frame[100]; + uint16_t checksum = 0; + send_frame[0] = 0x55; + send_frame[1] = 0xAA; + send_frame[2] = 0x40; + send_frame[3] = CMD_REPLY; + send_frame[4] = data_length+6; + send_frame[5] = index; + memcpy(&send_frame[6], &g_com_map[index], data_length); + checksum = Checksum_u16(&send_frame[2],5+data_length); + memcpy(&send_frame[6+data_length],&checksum,2); + + uart_send(UART_ID0, send_frame,data_length+8, NULL); +} +void Send_Commap_mk_to_ble(uint8_t data_length, uint8_t index) +{ +static uint8_t send_frame[100]; + uint16_t checksum = 0; + send_frame[0] = 0x55; + send_frame[1] = 0xAA; + send_frame[2] = 0x40; + send_frame[3] = CMD_WRITE; + send_frame[4] = data_length+6; + send_frame[5] = index; + memcpy(&send_frame[6], &g_com_map[index], data_length); + checksum = Checksum_u16(&send_frame[2],5+data_length); + memcpy(&send_frame[6+data_length],&checksum,2); + + uart_send(UART_ID0, send_frame,data_length+8, NULL); +} + +void read_com_map(uint8_t data_length, uint8_t index) +{ +static uint8_t send_frame[100]; + uint16_t checksum = 0; + send_frame[0] = 0x55; + send_frame[1] = 0xAA; + send_frame[2] = 0x40; + send_frame[3] = CMD_READ; + send_frame[4] = data_length; + send_frame[5] = index; + checksum = Checksum_u16(&send_frame[2],5+data_length); + uart_send(UART_ID0, send_frame,6, NULL); +} +void Usart0ParseDataHandler(uint8_t data)//UART蓝牙数据分析处理 +{ + // 全局变量 +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; + + 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 == 0x40) { + pack_cmd_type = data; + usart0_receive_state = Usart0ReceiveWaitMsgType; + send_frame[frame_index++] = data; + } else { + usart0_receive_state = Usart0ReceiveWaitHead0; + } + break; + + case Usart0ReceiveWaitMsgType: + if(data == 0x2) { // 写消息类型 + 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 = Usart0ReceiveWaitParamAddr; + send_frame[frame_index++] = data; + break; + + case Usart0ReceiveWaitParamAddr: + pack_param_addr = data; + usart0_receive_state = Usart0ReceiveWaitData; + send_frame[frame_index++] = data; + break; + + case Usart0ReceiveWaitData: + mUsart2ReceivePack[index++] = data; + send_frame[frame_index++] = data; + if(index == pack_data_len-6) { + usart0_receive_state = Usart0ReceiveWaitChecksum; + pack_datalen=pack_data_len-6; + } + break; + + case Usart0ReceiveWaitChecksum: + pack_checksum = data << 8; // 高字节 + pack_checksum |= data; // 低字节 + + // 计算校验和 (从第3个字节开始,长度为5+数据长度) + calculated_checksum = Checksum_u16(&send_frame[2],pack_datalen+5); + + // 验证校验和 + if(pack_checksum == calculated_checksum) { + // 校验通过,处理数据 + switch(pack_cmd_type) + { + case CMD_WRITE: + //从mUsartReceivePack中读取pack_length长度的字节,放到全局变量中,赋值保存的参数并且存入flash + + memcpy((uint8_t*)&g_com_map + pack_param_addr, mUsart2ReceivePack, pack_datalen); + + //返回一个error状态 + //SendComMap(pack_datalen,pack_index); + save_com_map_to_flash(); + //delay_ms(100); +// NVIC_SystemReset(); + break; + case CMD_READ: + Send_Commap_mk_to_ble(pack_datalen,pack_param_addr); + + break; + case CMD_REPLY: + memcpy((uint8_t*)&g_com_map + pack_param_addr, mUsart2ReceivePack, pack_datalen); + save_com_map_to_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; + } + + +// if(usart_receive_state == UsartReceiveWaitChecksum) { //若收到校验和包 +// checksum = 0; +// for(int i = 0; i<pack_length-5; i++) { +// checksum += mUsart2ReceivePack[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: +// //从mUsartReceivePack中读取pack_length长度的字节,放到全局变量中,赋值保存的参数并且存入flash +// enable_sleep_count=0; +// memcpy((uint8_t*)&g_com_map + pack_index, mUsart2ReceivePack, pack_datalen); +// +// if(mUsart2ReceivePack[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) ) { //若果收到的是正常通讯包 +// mUsart2ReceivePack[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; +// } +} + -- Gitblit v1.9.3