# 嵌入式调试开发指南 ## 项目简介 本项目旨在实现基于 STM32F103 的嵌入式开发,支持通过 TCP/IP 协议进行数据传输。以下内容将详细介绍如何配置和使用相关功能。 --- ## 环境准备 ### 硬件需求 - STM32F103 开发板 - USB 转串口模块 - 连接线 ### 软件需求 - 串口调试工具(如 XCOM 或 SecureCRT) - TCP 测试软件 --- ## 配置步骤 ### 1. 串口配置 1. 选择实际的串口号(如 COM4)。 2. 设置波特率为 `115200`。 ### 2. AT 指令操作 #### 配置 Wi-Fi ```bash AT+CWMODE=1 # 设置工作模式为 STA AT+CWJAP="ssid","password" # 配置 Wi-Fi ``` #### 连接服务器 ```bash AT+CIPSTART="TCP","192.168.1.101",3456 # 连接服务器,IP 为电脑的 IP,端口为 3456 AT+SAVETRANSLINK=1,"192.168.1.101",3456,"TCP" # 保存连接信息,开机后自动连接 AT+CIPMODE=1 # 设置为透传模式 AT+CIPSEND # 发送数据 HELLOWORLD # 示例数据 ``` #### 退出透传模式 进入自动透传模式后,如需重新配置(如更换 IP),需退出透传模式: 1. 在串口助手中发送 `+++`。 2. 注意: - 不要勾选“发送新行”。 - 发送 `+++` 后,停顿 1 秒以上不要发送任何数据。 3. 模块返回 `OK` 后,即可重新进入命令模式。 --- ## 测试与验证 ### 1. 启动服务器 使用 TCP 测试软件创建服务器并启动。 ### 2. 实际连接与发送测试 通过串口助手发送数据,验证数据是否成功传输。 --- ## 连接示意图 ![连接线示意图](image.png) --- ## 常见问题 ### 1. 无法连接服务器 - 检查 IP 和端口是否正确。 - 确保 Wi-Fi 配置无误。 ### 2. 透传模式无法退出 - 确保发送 `+++` 时未勾选“发送新行”。 - 确保发送后停顿 1 秒以上。 --- ## 附录 ### 相关工具截图 #### TCP 测试软件 ![TCP 测试软件](image-2.png) #### 创建服务器 ![创建服务器](image-3.png) #### 启动服务器 ![启动服务器](image-4.png) #### 实际连接发送测试 ![实际连接发送测试](image-5.png) --- ## 串口重定向 使用以下函数,用于串口重定向: ```c #ifdef __GNUC__ #define PUTCHAR_PROTOTYPE int __io_putchar(int ch) #else #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f) #endif PUTCHAR_PROTOTYPE { HAL_UART_Transmit(&huart2, (uint8_t *)&ch, 1, HAL_MAX_DELAY); return ch; } ``` 该函数用于将 `printf` 输出重定向到串口。 --- ## TCP 接收与发送 ### 接收数据 使用空闲中断接收 TCP 数据,开启了 DMA 接收: ```c void UART_IDLE_Callback(UART_HandleTypeDef *huart) { /* 仅处理 USART1 的实例 */ if (huart == NULL || huart->Instance != USART1) return; /* 清除空闲中断标志位(HAL库宏) */ __HAL_UART_CLEAR_IDLEFLAG(huart); /* 停止 DMA 以便安全读取计数器并更新状态 */ HAL_UART_DMAStop(huart); /* 计算接收到的字节数:总缓冲区长度 - DMA 剩余传输计数 */ uint16_t recv_len = UART1_RX_BUF_SIZE - __HAL_DMA_GET_COUNTER(huart->hdmarx); if (recv_len > 0 && recv_len < UART1_RX_BUF_SIZE) { uart1_rx_len = recv_len; uart1_rx_buf[recv_len] = '\0'; /* 添加字符串结束符,方便后续字符串处理 */ uart1_rx_flag = 1; /* 置位标志,通知应用层新消息到达 */ /* 仅供调试:在中断中打印接收到的数据(注意:printf 可能会影响实时性) */ elog_raw("UART1 Received: %s\r\n", (char *)uart1_rx_buf); } /* 重新启动新一轮的 DMA 接收 */ HAL_UART_Receive_DMA(&huart1, uart1_rx_buf, UART1_RX_BUF_SIZE); } ``` ### 发送数据 封装了发送函数,只需填入数据即可发送: ```c const char *message = "Hello, ESP12F! This is a test message."; HAL_StatusTypeDef status = ESP12F_TCP_SendMessage(message); ```