From e8fae59212dd962e2f13137f53d70bd1625891fb Mon Sep 17 00:00:00 2001 From: zhangbo <zhangbo@qq.com> Date: 星期五, 28 二月 2025 13:56:50 +0800 Subject: [PATCH] 修改串口蓝牙转发 --- keil/include/drivers/serial_at_cmd_app.c | 161 +++++++++++++++-------------------------------------- 1 files changed, 45 insertions(+), 116 deletions(-) diff --git a/keil/include/drivers/serial_at_cmd_app.c b/keil/include/drivers/serial_at_cmd_app.c index 2ed793f..9f08f46 100644 --- a/keil/include/drivers/serial_at_cmd_app.c +++ b/keil/include/drivers/serial_at_cmd_app.c @@ -139,128 +139,57 @@ #define buff_lenth 1024 #define MAX_BASE_STATIONS 10 uint8_t DMA_RXBuf_BT[200]={0}; -uint8_t Forward_BT_buff[buff_lenth]={0}; -uint8_t report_ancnum_bt=0; +uint8_t data_length_flag=0; void UsartParseDataHandler(uint8_t data) { - uint8_t buff[buff_lenth] = {0}; - uint8_t length = 0; - uint8_t base_station_count = 0; - memcpy(buff, m_EUART_DMA_RXBuf, 1024); - //memcpy(buff, Forward_BT_buff, 1024); - // 遍历 - for (int n = 0; n < 1024 - 6; n++) - { - // 包头 0x55 0xAA 0x41 - if (buff[n] == 0x55 && buff[n+1] == 0xAA && buff[n+2] == 0x41) - { - report_ancnum_bt=buff[n+4]; - length = buff[n+3]; - if (n + 6 + report_ancnum_bt * 6 + length > 1024) { - continue; // 如果数据越界,跳过该包 + + 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,pack_num=0; + static uint8_t index = 0; + + if(usart_receive_state == UsartReceiveWaitChecksum) + { //若收到校验和包 + if(mUsartReceivePack[pack_datalen-1]==0x66&&data==0xBB) + { + memcpy(&DMA_RXBuf_BT[0],&mUsartReceivePack[0], pack_datalen-1); + } + usart_receive_state = UsartReceiveWaitHead0; + pack_index = 0; + pack_length = 0; + index=0; + } else if((usart_receive_state == UsartReceiveWaitData) ) { //若果收到的是正常通讯包 + mUsartReceivePack[pack_index] = data; + pack_index++; +// if(data_length_flag==1) +// { +// data_length_flag=0; +// usart_receive_state = UsartReceiveWaitDataLen; +//// pack_length=0x03+data; +// } + + if(pack_index == pack_datalen) { //如果收到的index与长度相等 + usart_receive_state = UsartReceiveWaitChecksum; } - - // 将数据复制到 DMA 缓冲区 - memcpy(DMA_RXBuf_BT, &buff[n+4], length); + } else if(usart_receive_state == UsartReceiveWaitDataLen) { //收到指令类型字节 + pack_datalen = data; + pack_index = 0; + usart_receive_state = UsartReceiveWaitData; + } 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 == 0x41)) { + usart_receive_state = UsartReceiveWaitDataLen; + - // 为了避免多次重复解析同一个数据包,可以在这里添加跳跃 - n += 6 + report_ancnum_bt * 6 + length - 1; // 跳过当前数据包 } - } - - // 清除临时缓冲区 - memset(buff, 0, buff_lenth); - -// 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]的字节,发送出来 -// 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 { + usart_receive_state = UsartReceiveWaitHead0; + pack_index = 0; + pack_length = 0; + } // } else if(gps_prase_flag) // { // static uint8_t index = 0; -- Gitblit v1.9.3