- 集成 EasyLogger,增强日志功能。 - 更新 UART DMA 回调以使用 EasyLogger 记录日志。 - 重新格式化 README.md,提升可读性和清晰度。 - 添加新的 CMSIS DSP 和 FreeRTOS 源文件。 - 更新 CMake 配置以包含 EasyLogger 源文件。 此提交改进了日志功能,为后续开发做好了准备。
3.8 KiB
3.8 KiB
嵌入式调试开发指南
项目简介
本项目旨在实现基于 STM32F103 的嵌入式开发,支持通过 TCP/IP 协议进行数据传输。以下内容将详细介绍如何配置和使用相关功能。
环境准备
硬件需求
- STM32F103 开发板
- USB 转串口模块
- 连接线
软件需求
- 串口调试工具(如 XCOM 或 SecureCRT)
- TCP 测试软件
配置步骤
1. 串口配置
- 选择实际的串口号(如 COM4)。
- 设置波特率为
115200。
2. AT 指令操作
配置 Wi-Fi
AT+CWMODE=1 # 设置工作模式为 STA
AT+CWJAP="ssid","password" # 配置 Wi-Fi
连接服务器
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 秒以上不要发送任何数据。
- 模块返回
OK后,即可重新进入命令模式。
测试与验证
1. 启动服务器
使用 TCP 测试软件创建服务器并启动。
2. 实际连接与发送测试
通过串口助手发送数据,验证数据是否成功传输。
连接示意图
常见问题
1. 无法连接服务器
- 检查 IP 和端口是否正确。
- 确保 Wi-Fi 配置无误。
2. 透传模式无法退出
- 确保发送
+++时未勾选“发送新行”。 - 确保发送后停顿 1 秒以上。
附录
相关工具截图
TCP 测试软件
创建服务器
启动服务器
实际连接发送测试
串口重定向
使用以下函数,用于串口重定向:
#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 接收:
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);
}
发送数据
封装了发送函数,只需填入数据即可发送:
const char *message = "Hello, ESP12F! This is a test message.";
HAL_StatusTypeDef status = ESP12F_TCP_SendMessage(message);




