/****************************************************************************** * @file drv_qfc41d.c * @brief drv_qfc41d driver * @version V1.0 * @author Gary * @copyright ******************************************************************************/ #include "drv_qfc41d.h" uint8_t rev_buff[QFC41D_MAX_RECV_SIZE] = {0}; uint8_t send_buff[QFC41D_MAX_SEND_SIZE] = {0}; uint8_t wifiName[40] = {0}, wifiPassWord[40] = {0}; //定义 WifiBleItem qfc41dItem = { .dev = QFC41D_UART_PORT, .buf_pos = 0, .buf_size = QFC41D_MAX_RECV_SIZE, .buf = rev_buff, .sendCall = NULL, }; static void drv_qfc41d_push_data(WifiBleItem* item, uint8_t *buf, uint16_t len) { uint16_t i = 0; if((item != NULL) && (item->buf_pos + len < item->buf_size)) { item->buf[item->buf_pos++] = buf[i]; // 处理换行符,表示一条完整的 AT 指令返回 if (buf[i] == '\n') { item->buf[item->buf_pos] = '\0'; // 添加结束符 item->buf_pos = 0; // 重置索引,准备下一条数据 } } } static void qf41d_uart_rx_it_call(kit_ret_e res, void *data) { OS_TRACE_ISR_ENTER(); drv_qfc41d_push_data(&qfc41dItem, data, 1); OS_TRACE_ISR_EXIT(); } // 发送单个字符 void drv_wireless_send_char(char c) { while (!(USART2->SR & USART_SR_TXE)); // 等待发送缓冲区空 USART2->DR = c; } // 发送字符串 void drv_wireless_send_string(const char *str) { while (*str) { drv_wireless_send_char(*str++); } drv_wireless_send_char('\r'); // 发送 CR drv_wireless_send_char('\n'); // 发送 LF } // 发送 AT 指令并等待返回值 int drv_wifi_send_cmd(const char *cmd, const char *response, uint32_t timeout) { memset(qfc41dItem.buf, 0, QFC41D_MAX_RECV_SIZE); qfc41dItem.buf_pos = 0; // 清空接收缓冲区索引 drv_wireless_send_string(cmd); uint32_t start_time = kit_time_get_tick(); // 获取当前时间 while (kit_time_get_tick() - start_time < timeout) { if (strstr((char *)qfc41dItem.buf, response)) { return 1; // 成功匹配返回值 } } return 0; // 超时未收到期望数据 } static uint8_t drv_wifi_init() { // 1. 测试 AT 指令 if (!drv_wifi_send_cmd("AT", "OK", WIFI_TIMEOUT)) { KIT_PRINTF("WiFi Module not responding!\r\n"); return 1 ; } // 2. 设置 Wi-Fi 为 STA 模式 if (!drv_wifi_send_cmd("AT+CWMODE=1", "OK", WIFI_TIMEOUT)) { KIT_PRINTF("Failed to set WiFi mode!\r\n"); return 1; } // 3. 连接 Wi-Fi char cmd[128]; snprintf(cmd, sizeof(cmd), "AT+CWJAP=\"%s\",\"%s\"", wifiName, wifiPassWord); if (!drv_wifi_send_cmd(cmd, "WIFI CONNECTED", WIFI_TIMEOUT * 2)) { KIT_PRINTF("Failed to connect to WiFi!\r\n"); //return 1; //错误不返回-防止影响主任务执行 } // 4. 获取 IP 地址 if (!drv_wifi_send_cmd("AT+CIFSR", ".", WIFI_TIMEOUT)) { KIT_PRINTF("Failed to get IP address!\r\n"); //return 1; //错误不返回-防止影响主任务执行 } KIT_PRINTF("WiFi Initialization Successful!\r\n"); return 0; } uint8_t drv_qfc41d_init(void) { //初始化串口 drv_uart_init((UartDev)qfc41dItem.dev, 115200, 0 | UART_CFG_STOP_BIT_1, kGpioType_WIRELESSUart_Tx, kGpioType_WIRELESSUart_Rx); //设置接收回调函数 drv_uart_set_interrupt(QFC41D_UART_PORT, kUartInterrupt_Rx, APP_CFG_INT_PRIO_UART2_RX, qf41d_uart_rx_it_call);//#define SIM_UART_PORT kUartDev_2 //初始化wifi if(drv_wifi_init() != 0) { return 1; ` } //初始化蓝牙 return 0; }