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.h | 15 + keil/include/drivers/Usart.h | 8 keil/include/main/main.c | 21 + pin_config.c | 22 ++ keil/include/drivers/serial_at_cmd_app.c | 443 ++++++++++++++++++++++++-------------------- keil/include/drivers/Usart.c | 36 ++- keil/include/drivers/uwb_app.c | 1 7 files changed, 317 insertions(+), 229 deletions(-) diff --git a/keil/include/drivers/Usart.c b/keil/include/drivers/Usart.c index 4469110..a9949bd 100644 --- a/keil/include/drivers/Usart.c +++ b/keil/include/drivers/Usart.c @@ -12,16 +12,21 @@ volatile int8_t m_EUART_TxFrm_FreeFrmLen = 0; //数据发送帧队列剩余帧数 //DMA数据接收缓存 uint8_t m_EUART_DMA_RXBuf[EUART_RX_BUF_SIZE]; //DMA数据接收缓存 +uint8_t m_EUART0_DMA_RXBuf[EUART_RX_BUF_SIZE]; //DMA数据接收缓存 volatile int32_t m_EUART_DMA_RXPtr = 0; //当前数据地址 +volatile int32_t m_EUART0_DMA_RXPtr = 0; //当前数据地址 //int16_t DMA_rxtemp = 0,DMA_rxtemp2 = 0; //当前数据地址缓存 //uint16_t datadelaycount = 0; //剩余1位数据延时等待处理 //标志变量 volatile uint8_t m_bEUARTPushingFrms = 0; //正在往发送队列存数据 +volatile uint8_t m_bEUART0PushingFrms = 0; //正在往发送队列存数据 volatile uint8_t m_bEUARTCheckingSend = 0; //正在确认数据发送 volatile uint8_t m_bEUARTCheckingRec = 0; //正在确认接收数据 +volatile uint8_t m_bEUART0CheckingRec = 0; //正在确认接收数据 volatile uint8_t m_bEUARTTxEn = 0; //使能发送 void (*Usart1ParseDataCallback)(uint8_t); +void (*Usart0ParseDataCallback)(uint8_t); void Usart1InitVariables(void) { m_EUART_TxFrm_FreeFrmLen = EUART_TX_FRM_SIZE-1; @@ -35,9 +40,10 @@ //uint16_t t1,t2,t3,t4; uint16_t t3; -uint32_t cndtr=0; + void UART_CheckReceive(void) { + uint32_t cndtr=0; int32_t DMACnt = 0; int32_t MaxDataLen = EUART_RX_BUF_SIZE; cndtr=get_uart1_dma_cndtr(); @@ -72,37 +78,37 @@ } void UART0_CheckReceive(void) -{ +{ uint32_t cndtr=0; int32_t DMACnt = 0; - int32_t MaxDataLen = EUART_RX_BUF_SIZE; + int32_t MaxDataLen = EUART0_RX_BUF_SIZE; cndtr=get_uart0_dma_cndtr(); //缺少check保护 //如果正在往发送队列中添加数据,退出 - if(m_bEUARTPushingFrms) + if(m_bEUART0PushingFrms) return; //判断是否正在Check - if(m_bEUARTCheckingRec) + if(m_bEUART0CheckingRec) return; - m_bEUARTCheckingRec = 1; + m_bEUART0CheckingRec = 1; if(cndtr== 0) { - m_bEUARTCheckingRec = 0; + m_bEUART0CheckingRec = 0; return; } - DMACnt = EUART_RX_BUF_SIZE - cndtr; - while( m_EUART_DMA_RXPtr != DMACnt && MaxDataLen > 0) + DMACnt = EUART0_RX_BUF_SIZE - cndtr; + while( m_EUART0_DMA_RXPtr != DMACnt && MaxDataLen > 0) { - Usart1ParseDataCallback(m_EUART_DMA_RXBuf[m_EUART_DMA_RXPtr]); + Usart0ParseDataCallback(m_EUART0_DMA_RXBuf[m_EUART0_DMA_RXPtr]); //waitusart_timer = tag_frequency*USART_KEEPWAKE_TIME; - m_EUART_DMA_RXPtr++; - if( m_EUART_DMA_RXPtr >= EUART_RX_BUF_SIZE ) + m_EUART0_DMA_RXPtr++; + if( m_EUART0_DMA_RXPtr >= EUART_RX_BUF_SIZE ) { - m_EUART_DMA_RXPtr = 0; + m_EUART0_DMA_RXPtr = 0; } - DMACnt = EUART_RX_BUF_SIZE - cndtr; + DMACnt = EUART0_RX_BUF_SIZE - cndtr; MaxDataLen--; } - m_bEUARTCheckingRec = 0; + m_bEUART0CheckingRec = 0; } diff --git a/keil/include/drivers/Usart.h b/keil/include/drivers/Usart.h index 4f3f7bf..bfd7edf 100644 --- a/keil/include/drivers/Usart.h +++ b/keil/include/drivers/Usart.h @@ -38,7 +38,8 @@ #define EUART_TX_FRM_SIZE 2 //发送队列中的最大帧数 #define EUART_TX_FRMBUF_SIZE 100 //发送队列每帧缓存大小 -#define EUART_RX_BUF_SIZE 1024 //接收缓存大小 +#define EUART_RX_BUF_SIZE 512 //接收缓存大小 +#define EUART0_RX_BUF_SIZE 512 //接收缓存大小 #define EXT_UART USART1 #define EXT_UART_RCC RCC_APB2Periph_USART1 @@ -55,11 +56,12 @@ void UART_PushFrame(uint8_t* pdata, int32_t data_len); void UART_PopFrame(void); extern void (*Usart1ParseDataCallback)(uint8_t); - +extern void (*Usart0ParseDataCallback)(uint8_t); #define USART_TX_BUF_SIZE 50 //发送缓存大小 #define USART_RX_BUF_SIZE 100 //接收缓存大小 -extern uint8_t m_EUART_DMA_RXBuf[EUART_RX_BUF_SIZE]; +extern uint8_t m_EUART_DMA_RXBuf[EUART_RX_BUF_SIZE]; +extern uint8_t m_EUART0_DMA_RXBuf[EUART0_RX_BUF_SIZE]; extern uint8_t USART_DMA_RXBuf[USART_RX_BUF_SIZE]; //USART2 DMA数据接收缓存 //void Uart2_SendString( uint8_t *str); diff --git a/keil/include/drivers/serial_at_cmd_app.c b/keil/include/drivers/serial_at_cmd_app.c index 14b5902..aa7ce9b 100644 --- a/keil/include/drivers/serial_at_cmd_app.c +++ b/keil/include/drivers/serial_at_cmd_app.c @@ -143,7 +143,7 @@ extern uint8_t enable_sleep_count,sleep_flag; void UsartParseDataHandler(uint8_t data) { - static UsartRecvPackState usart_receive_state = UsartReceiveWaitHead0; +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; @@ -225,219 +225,256 @@ usart_receive_state = UsartReceiveWaitHead0; pack_index = 0; pack_length = 0; - } + } } - -void Usart2ParseDataHandler(uint8_t data)//UART蓝牙数据分析处理 +void uart0_send_ComMap_to_BLE(uint8_t data_length, uint8_t index) { - //打印接收到的蓝牙模块信息 - //printf("这个是传入的数据%c",data); -// static UsartRecvPackState usart2_receive_state = UsartReceiveWaitHead0; - //static UsartRecvPackState usart2_receive_state = UsartReceiveWaitData; - - static ST_BLERecv BLE_recvive;//创建蓝牙状态结构体 - - + static uint8_t send_frame[100]; 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; + 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); -// uint8_t dev_id[14],dev_ssi[5],i,k=0; -// //char char_mac[14],char_ssi[6]; -// int j=0; -// //uint16_t temp_16,temp_16_id,temp_16_distance; -// uint8_t temp8_H,temp8_L; -// //float temp_float; -// //double ssi_double;//,distance_double; -// //int32_t distance_int; -// uint16_t Label_id=0; //标签id + 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); +} - //接收数据开始分析 - mUsart2ReceivePack[index] = data; //char数组传进来参数data - mUsart2ReceivePack_before = mUsart2ReceivePack_now; - mUsart2ReceivePack_now=data; - index++; - if( mUsart2ReceivePack_before == 0x0D && mUsart2ReceivePack_now==0x0A )//接收数据到“0x0D 0x0A”结束 - { - mUsart2ReceivePack[index]=0; - //printf("0D0A进入后的数据为%s到此结束",mUsart2ReceivePack); -// if(strncmp("RF-CRAZY",(char*)mUsart2ReceivePack,8)==0) -// { -// BLE_recvive.m_eState=BLE_RECV_STATE_MAC;//如果为名字后判断并改为MAC接收状态 +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]; // } -// - switch(BLE_recvive.m_eState) - { case BLE_RECV_STATE_IDLE: - if(strncmp("RF-CRAZY",(char*)mUsart2ReceivePack,8)==0) - BLE_recvive.m_eState=BLE_RECV_STATE_MAC;//如果为名字后判断并改为MAC接收状态 - break; - case BLE_RECV_STATE_MAC://MAC接受处理状态 - strcpy(BLE_recvive.m_macHeader,(char*)mUsart2ReceivePack+5);//复制到蓝牙结构体中,+5是为了跳过MAC字符和冒号未处理0D0A - //处理MAC字符不让换行 - char*p=BLE_recvive.m_macHeader+strlen(BLE_recvive.m_macHeader)-2; - *p='\0'; - //printf("处理过后的MAC为%s",BLE_recvive.m_macHeader); - BLE_recvive.m_eState=BLE_RECV_STATE_RSSI; - break; - case BLE_RECV_STATE_RSSI://RSSI接收处理状态 - strcpy(BLE_recvive.m_rssiHeader2,(char*)mUsart2ReceivePack+6);//复制到蓝牙结构体中,+5是为了跳过MAC字符和冒号未处理0D0A - //printf(" 处理过后的RSSI为%s",BLE_recvive.m_rssiHeader2); - BLE_recvive.m_eState=BLE_RECV_STATE_IDLE; - break; - } - -// if(mUsart2ReceivePack[0] ==0x2B ) //“+”扫描到开始或结束字符串的首个字符 +// checksum += pack_cmd; +// checksum += pack_length; +// checksum += pack_index; +// checksum += pack_datalen; +// checksum += pack_msgtype; +// if(((data + checksum)&0xff) == 0xFF) //校验通过 // { -// if (mUsart2ReceivePack[5] ==0x20) -// { -// printf("UART扫描结束 :+SCAN END\r\n"); //本次扫描结束 -// CT_sum++; //包序值 -// if(CT_sum>255) CT_sum=0; -// -// //发送数据缓存 -// Lora_TXD_bff[0] = 0x55; -// Lora_TXD_bff[1] = 0xAA; -// Lora_TXD_bff[2] = 0x12; -// Lora_TXD_bff[3] = 8+4*numb_base; //数据长度 8+4*基站数量 -// -// Label_id=Label_id_local; //标签id -// memcpy(&Lora_TXD_bff[4],&Label_id ,2); -// -// Lora_TXD_bff[6] = CT_sum; //标签包序 -// Lora_TXD_bff[7] = 0x32; //按键/电量,测试数据50 -// Lora_TXD_bff[8] = 0; //LORA等待应答 - -// Lora_TXD_bff[9]= numb_base; //基站数量 - -// for(i=10;i<(10+numb_base*2);i=i+2) -// { -// memcpy(&Lora_TXD_bff[i+0] ,&data_buff[(i-10)/2][0] ,2); //基站ID -// memcpy(&Lora_TXD_bff[i+numb_base*2],&data_buff[(i-10)/2][1] ,2); //基站距离 -// } -// for( i = 2;i<(4+8+4*numb_base); i++) //去包头后 校验 累加取反 -// { -// checksum += Lora_TXD_bff[i]; -// } -// checksum = ~checksum; -// memcpy(&Lora_TXD_bff[2+8+4*numb_base],&checksum ,2); //和取反 校验 -// -// Radio_init(); //唤醒 为发送状态 -// Radio.Send( Lora_TXD_bff, (4+8+4*numb_base)); //LORA模块上传数据 -// - -// //基站距离 清零 -// for(i=0;i<numb_base;i++) -// { -// //for(k=1;k<2;k++) //清距离数据 -// for(k=0;k<2;k++) //清ID号和距离数据 -// { -// data_buff[i][k]=0; -// } -// } -// numb_base =0; -// data_buff_start =0; -// -// printf("\r\n"); -// //delay_ms(5); -// Uart2_SendString( Uart2_str); //发下一次扫描指令 -// } -// -// else if(mUsart2ReceivePack[5] ==0x5F) //“_"下划线 -// { -// printf("UART扫描开始 :+SCAN_MANU:\r\n"); -// } -// } -// else -// { -// j=memcmp(id_cmpare,mUsart2ReceivePack,8); //比较目标蓝牙地址 前4个字节 -// if(j==0)//跟目标蓝牙mac地址相同 +// 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); // -// //拷贝mac地址 -// for(i=0;i<12;i++) -// { -// char_mac[i] = mUsart2ReceivePack[i]; -// } -// char_mac[12]='\0'; -// -// -// //拷贝信号 -// for(i=15;i<18;i++) -// { -// char_ssi[i-15] = mUsart2ReceivePack[i]; -// } -// if(mUsart2ReceivePack[18]==0x0D || mUsart2ReceivePack[18]==0x20) //信号是-两位数 -// { -// char_ssi[3]= '\0' ; -// char_broadcast_data[0]= '\0'; -// if (mUsart2ReceivePack[18]==0x0D) //信号是-两位数,无广播内容 -// { -// CT_satrt=0; -// } -// else if(mUsart2ReceivePack[18]==0x20) //信号是-两位数,有广播内容,空格后一位开始,到0x0D 结束。 -// { -// CT_satrt=19; -// } -// ssi_double = -((char_ssi[1]-0x30)*10 + (char_ssi[2]-0x30)); //2位信号值int -// } -// else if(mUsart2ReceivePack[18]>=0x30 && mUsart2ReceivePack[18]<=0x39 ) //信号是-三位数 -// { -// char_ssi[3]=mUsart2ReceivePack[18]; -// char_ssi[4]= '\0' ; -// char_broadcast_data[0]= '\0'; -// if (mUsart2ReceivePack[19]==0x0D) //信号是-三位数,无广播内容 -// { -// CT_satrt=0; -// } -// else if(mUsart2ReceivePack[19]==0x20) //信号是-三位数,有广播内容,空格后一位开始,到0x0D 结束。 -// { -// CT_satrt=20; -// } -// ssi_double = -((char_ssi[1]-0x30)*100 + (char_ssi[2]-0x30)*10 + (char_ssi[3]-0x30));//3位信号值int -// } -// -// printf("mac= %s ",char_mac); -// printf("ssi= %s ",char_ssi); - -// //基站ID处理 -// temp_16_id = (char_mac[8]-0x30)*1000 + (char_mac[9]-0x30)*100 + (char_mac[10]-0x30)*10 + (char_mac[11]-0x30); -// printf("ID = %d ",temp_16_id ); -// //基站距离处理 -// temp_16_distance = 0.003083 * exp(-0.09909*ssi_double)*100;//单位cm -// printf("距离 = %d cm \r\n",temp_16_distance ); - -// //比较ID号并拷贝数据到缓存区 -// for(i=0;i<data_buff_MAX;i++) -// { -// if(data_buff[i][0] == temp_16_id) //检测到已存ID -// { -// data_buff[i][1] = temp_16_distance; -// data_buff_start=0; -// break; -// } -// else if (data_buff[i][0]==0) -// { -// data_buff_start=i+1; -// numb_base=data_buff_start; //拷贝扫描到基站的数量 -// break; -// } -// } -// if(data_buff_start!=0) -// { -// data_buff[data_buff_start-1][0] = temp_16_id; -// data_buff[data_buff_start-1][1] = temp_16_distance; -// -// } -// } -// } - index=0; - mUsart2ReceivePack_before=0; - mUsart2ReceivePack_now=0; - } -//printf("处理过后的数组为%s\n",mUsart2ReceivePack); +// 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; +// } } diff --git a/keil/include/drivers/serial_at_cmd_app.h b/keil/include/drivers/serial_at_cmd_app.h index adeecab..0f29eff 100644 --- a/keil/include/drivers/serial_at_cmd_app.h +++ b/keil/include/drivers/serial_at_cmd_app.h @@ -20,12 +20,25 @@ UsartReceiveWaitData, UsartReceiveWaitChecksum// }UsartRecvPackState; + +// 定义状态枚举 +typedef enum { + Usart0ReceiveWaitHead0, + Usart0ReceiveWaitHead1, + Usart0ReceiveWaitCmdType, + Usart0ReceiveWaitMsgType, + Usart0ReceiveWaitDataLen, + Usart0ReceiveWaitParamAddr, + Usart0ReceiveWaitData, + Usart0ReceiveWaitChecksum, +} Usart0ReceiveState; + extern uint8_t mUsartReceivePack[100]; extern uint8_t mUsart2ReceivePack[100]; void UsartParseDataHandler(uint8_t data); -void Usart2ParseDataHandler(uint8_t data); +void Usart0ParseDataHandler(uint8_t data); void UpdateProcess(uint8_t index); #endif diff --git a/keil/include/drivers/uwb_app.c b/keil/include/drivers/uwb_app.c index 88ce2e0..dec30a9 100644 --- a/keil/include/drivers/uwb_app.c +++ b/keil/include/drivers/uwb_app.c @@ -541,6 +541,7 @@ uint16_t report_ancdist[ANC_MAX_NUM],report_ancid[ANC_MAX_NUM]; void IdleTask(void) {UART_CheckReceive(); + UART0_CheckReceive(); //if(read_5v_input_pca()) // { // if(state5v==0) diff --git a/keil/include/main/main.c b/keil/include/main/main.c index 0131fcc..0eaf7bf 100644 --- a/keil/include/main/main.c +++ b/keil/include/main/main.c @@ -137,13 +137,14 @@ }else{ flag_secondtask = 0; } - lora_tx_flag=1; + // if(delaysleep_count>0) // delaysleep_count--; } void Program_Init(void) { Usart1ParseDataCallback = UsartParseDataHandler;//需改为默认为gps处理,UsartParseDataHandler为升级处理当调试时候改为 + parameter_init_anchor();//g_com_map表初始化角色默认为基站 dev_id=g_com_map[DEV_ID];//这里不太对 group_id=(uint8_t)g_com_map[GROUP_ID];//组ID @@ -169,7 +170,7 @@ port = g_com_map[TCP_PORT]; g_com_map[VERSION] = (1<<8)|0; LOG_INFO(TRACE_MODULE_APP,"设备ID: %x .\r\n",dev_id); - LOG_INFO(TRACE_MODULE_APP,"固件版本:4G-GPS定位手环 V%d.%d. \r\n",g_com_map[VERSION]>>8,g_com_map[VERSION]&0xff); + LOG_INFO(TRACE_MODULE_APP,"固件版本:MK_Air_tag_免布线模式 V%d.%d. \r\n",g_com_map[VERSION]>>8,g_com_map[VERSION]&0xff); LOG_INFO(TRACE_MODULE_APP,"服务器地址: %d.%d.%d.%d:%d.\r\n",ip0,ip1,ip2,ip3,port); } void MinuteTask(void) @@ -183,12 +184,13 @@ } void SecondTask(void) {static uint8_t second_count; + if(second_count++>60) { second_count = 0; MinuteTask(); } - + lora_tx_flag=1; //Lora_Tx_Poll(); // //UWB状态检测 @@ -338,7 +340,10 @@ { uart_receive(UART_ID1,m_EUART_DMA_RXBuf,EUART_RX_BUF_SIZE,uart_receive_callback); } - +void uart0_receive_callback(void *dev, uint32_t err_code) +{ + uart_receive(UART_ID0,m_EUART0_DMA_RXBuf,EUART0_RX_BUF_SIZE,uart0_receive_callback); +} uint8_t bat_percent; uint8_t stationary_flag; int main(void) @@ -456,12 +461,14 @@ power_manage(); } }else{ -// adc_open(&usr_adc_cfg); + + uart0_Init_normal(); Lora_1268_Init(); SwitchLoraSettings(478,7,22); Uwb_init();//默认为我们测距配置 OpenUWB(); uart_receive(UART_ID1,m_EUART_DMA_RXBuf,EUART_RX_BUF_SIZE,uart_receive_callback); + uart_receive(UART_ID0,m_EUART0_DMA_RXBuf,EUART0_RX_BUF_SIZE,uart0_receive_callback); power_init(); sleep_timer_open(true, SLEEP_TIMER_MODE_RELOAD, sleep_timer_callback_normal); sleep_timer_start(__MS_TO_32K_CNT(SLEEP_TIMER_NUM));//测试 @@ -476,8 +483,8 @@ SecondTask(); //Lora_Tx_Poll(); } - - Lora_Tx_Poll(); + Lora_Tx_Poll(); + IdleTask(); } } diff --git a/pin_config.c b/pin_config.c index 0384fd8..bc02294 100644 --- a/pin_config.c +++ b/pin_config.c @@ -40,6 +40,22 @@ #include "mk_io.h" #include "board.h" +extern void (*Usart0ParseDataCallback)(uint8_t); +extern void Usart0ParseDataHandler(uint8_t data); +struct UART_CFG_T test_uart_cfg = +{ + .parity = UART_PARITY_NONE, + .stop = UART_STOP_BITS_1, + .data = UART_DATA_BITS_8, + .flow = UART_FLOW_CONTROL_NONE, + .rx_level = UART_RXFIFO_CHAR_1, + .tx_level = UART_TXFIFO_EMPTY, + .baud = BAUD_115200, + .dma_en = true, + .int_rx = false, + .int_tx = false, +}; + void boot_deinit(void) { //将boot中串口返回普通gpio @@ -117,4 +133,10 @@ gpio_pin_set_dir(LORA_IRQ , GPIO_DIR_IN, 0); io_pull_set(LORA_IRQ, IO_HIGH_Z, IO_PULL_UP_NONE); gpio_enable_irq(LORA_IRQ, GPIO_IRQ_TYPE_RISING_EDGE, irq_handler); +} +void uart0_Init_normal(void) +{ + Usart0ParseDataCallback = Usart0ParseDataHandler;//确认与蓝牙串口0处理回调 + uart_open(UART_ID0, &test_uart_cfg); + } \ No newline at end of file -- Gitblit v1.9.3