STM32H743ZI串口服务器全栈开发实战

张开发
2026/4/10 3:58:50 15 分钟阅读

分享文章

STM32H743ZI串口服务器全栈开发实战
目录一、串口服务器核心功能定义二、硬件与开发环境准备1. 硬件平台2. 软件环境三、STM32CubeMX 工程配置基础框架1. 新建工程2. 以太网配置ETH LwIP3. 串口配置USART14. 生成工程代码四、核心软件架构设计五、完整软件代码实现1. 初始化函数系统启动后执行2. 以太网 TCP Server 实现核心3. 串口数据处理中断 DMA4. 核心透传逻辑双向数据转发5. 主函数逻辑六、关键优化点H7 高性能适配七、功能扩展可选1. UDP 模式实现2. 串口参数动态配置3. 参数掉电存储八、测试验证步骤总结一、串口服务器核心功能定义STM32H743ZI 串口服务器核心是UART/USART 串口 ↔ Ethernet 以太网双向透传实现串口设备传感器、MCU、仪表与网络端PC、服务器、云平台无缝数据交互核心功能以太网通信支持 TCP Server/Client、UDP 模式DHCP 自动获取 IP / 静态 IP串口透传串口数据 → 以太网发送以太网数据 → 串口输出无协议解析多缓存机制H7 高性能适配高速串口最高 921600 波特率 大缓存防丢包参数可配置串口波特率、数据位、校验位、网络 IP / 端口可固化存储二、硬件与开发环境准备1. 硬件平台主控STM32H743ZIT6核心板 / 开发板自带以太网 PHY、串口外设以太网内置 MAC 外置 PHY如 LAN8742串口USART1/2/3TTL/RS232/RS485本文用 USART1调试J-Link/ST-LinkUSB 转串口模块2. 软件环境IDESTM32CubeIDE 1.12免费官方推荐固件库STM32CubeH7 V1.9HAL 库 LwIP 协议栈工具串口调试助手、网络调试助手NetAssist三、STM32CubeMX 工程配置基础框架1. 新建工程打开 STM32CubeMX选择STM32H743ZITx配置系统时钟H7 最高 400MHz外部晶振 25MHz → 配置为400MHzPLLM5, PLLN160, PLLP2 → 系统时钟 400MHz以太网时钟H7 以太网需 50MHz 时钟配置为 50MHz2. 以太网配置ETH LwIPETH 外设配置ModeRMII最常用节省 IO自动生成 PHY 初始化引脚LAN8742 地址通常为 0x01开启 ETH 全局中断LwIP 协议栈配置开启LwIP中间件网络模式DHCPDHCP_Enable 1自动获取 IP静态 IP关闭 DHCP设置IP_ADDR192.168.1.100NETMASK255.255.255.0GATEWAY192.168.1.1开启 TCP/UDP 功能TCP_ENABLED1UDP_ENABLED1缓存优化TCP_MSS 1460MEM_SIZE 16384TCP_WND 2048关闭不必要功能减少资源占用3. 串口配置USART1选择USART1模式Asynchronous异步串口基础参数波特率115200可后续代码动态修改数据位8停止位1校验位无流控无开启串口接收中断 DMA 接收关键高速串口防丢包开启USART1 global interrupt开启USART1 RX DMA模式循环模式 / 普通模式优先级串口中断 以太网中断4. 生成工程代码选择STM32CubeIDE工程生成初始化代码HAL 库 LwIP 串口初始化自动完成四、核心软件架构设计采用任务化分层架构H7 主频高无需 RTOS 也可稳定运行裸机实现降低复杂度┌─────────────────────────────────────────┐ │ 主循环(main) │ ├─────────────┬─────────────┬─────────────┤ │ LwIP轮询处理 │ 串口数据处理 │ 透传逻辑处理 │ ├─────────────┼─────────────┼─────────────┤ │ 以太网数据接收 │ 串口数据接收 │ 双向数据转发 │ │ 以太网数据发送 │ 串口数据发送 │ 参数配置存储 │ └─────────────┴─────────────┴─────────────┘核心数据结构定义全局缓存、透传参数/* 串口服务器核心参数结构体 */ typedef struct { // 串口参数 uint32_t baudrate; // 波特率 uint8_t parity; // 校验位 uint8_t data_bits; // 数据位 uint8_t stop_bits; // 停止位 // 网络参数 uint8_t net_mode; // 0:TCP Server 1:TCP Client 2:UDP uint8_t local_ip[4]; // 本地IP uint16_t local_port; // 本地端口 uint8_t remote_ip[4]; // 远端IP(Client模式) uint16_t remote_port; // 远端端口 } NetSer_ConfigTypeDef; /* 全局缓存定义 */ #define UART_RX_BUF_SIZE 2048 #define ETH_RX_BUF_SIZE 2048 uint8_t uart_rx_buf[UART_RX_BUF_SIZE]; // 串口接收缓存 uint8_t eth_rx_buf[ETH_RX_BUF_SIZE]; // 以太网接收缓存 uint32_t uart_rx_len 0; // 串口接收数据长度 /* 全局句柄与状态 */ extern ETH_HandleTypeDef heth; extern UART_HandleTypeDef huart1; NetSer_ConfigTypeDef net_config; // 服务器配置参数 int tcp_socket -1; // TCP套接字五、完整软件代码实现1. 初始化函数系统启动后执行#include main.h #include lwip.h #include usart.h #include lwip/sockets.h #include lwip/netdb.h // 串口服务器默认参数初始化 void NetSer_Init(void) { // 默认串口参数115200 8N1 net_config.baudrate 115200; net_config.parity UART_PARITY_NONE; net_config.data_bits 8; net_config.stop_bits 1; // 默认网络参数TCP Server 192.168.1.100:8080 net_config.net_mode 0; net_config.local_ip[0] 192;net_config.local_ip[1] 168;net_config.local_ip[2] 1;net_config.local_ip[3] 100; net_config.local_port 8080; // 重新配置串口 HAL_UART_DeInit(huart1); huart1.Init.BaudRate net_config.baudrate; huart1.Init.Parity net_config.parity; huart1.Init.WordLength UART_WORDLENGTH_8B; huart1.Init.StopBits UART_STOPBITS_1; HAL_UART_Init(huart1); // 开启串口DMA接收 HAL_UART_Receive_DMA(huart1, uart_rx_buf, UART_RX_BUF_SIZE); // LwIP初始化CubeMX已生成此处调用 MX_LWIP_Init(); }2. 以太网 TCP Server 实现核心// 创建TCP Server int NetSer_TCP_Server_Create(uint16_t port) { struct sockaddr_in server_addr, client_addr; int sockfd, client_fd; socklen_t client_len sizeof(client_addr); // 创建套接字 sockfd socket(AF_INET, SOCK_STREAM, 0); if(sockfd 0) return -1; // 绑定端口 memset(server_addr, 0, sizeof(server_addr)); server_addr.sin_family AF_INET; server_addr.sin_addr.s_addr INADDR_ANY; server_addr.sin_port htons(port); if(bind(sockfd, (struct sockaddr*)server_addr, sizeof(server_addr)) 0) { closesocket(sockfd); return -1; } // 监听连接 listen(sockfd, 1); // 等待客户端连接 client_fd accept(sockfd, (struct sockaddr*)client_addr, client_len); if(client_fd 0) { closesocket(sockfd); return -1; } // 关闭监听套接字保留客户端连接 closesocket(sockfd); return client_fd; } // TCP数据发送 void NetSer_TCP_Send(int sock, uint8_t *data, uint32_t len) { if(sock 0 len 0) { send(sock, data, len, 0); } } // TCP数据接收 int NetSer_TCP_Recv(int sock, uint8_t *buf, uint32_t max_len) { if(sock 0) return -1; return recv(sock, buf, max_len, MSG_DONTWAIT); // 非阻塞接收 }3. 串口数据处理中断 DMA// 串口DMA接收完成中断回调函数 void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) { if(huart-Instance USART1) { // 获取接收到的数据长度 uart_rx_len UART_RX_BUF_SIZE - __HAL_DMA_GET_COUNTER(huart-hdmarx); // 重新开启DMA接收循环接收 HAL_UART_Receive_DMA(huart1, uart_rx_buf, UART_RX_BUF_SIZE); } } // 串口数据发送 void NetSer_UART_Send(uint8_t *data, uint32_t len) { HAL_UART_Transmit(huart1, data, len, 100); }4. 核心透传逻辑双向数据转发// 串口 - 以太网 透传主函数 void NetSer_Transparent_Transmit(void) { int32_t recv_len; // 1. 串口数据 → 以太网发送 if(uart_rx_len 0) { NetSer_TCP_Send(tcp_socket, uart_rx_buf, uart_rx_len); uart_rx_len 0; // 清空长度标记 } // 2. 以太网数据 → 串口发送 recv_len NetSer_TCP_Recv(tcp_socket, eth_rx_buf, ETH_RX_BUF_SIZE); if(recv_len 0) { NetSer_UART_Send(eth_rx_buf, recv_len); } // 连接断开处理 if(recv_len 0) { closesocket(tcp_socket); tcp_socket NetSer_TCP_Server_Create(net_config.local_port); } }5. 主函数逻辑int main(void) { // 系统初始化 HAL_Init(); SystemClock_Config(); MX_GPIO_Init(); // 串口服务器初始化 NetSer_Init(); // 创建TCP Server tcp_socket NetSer_TCP_Server_Create(net_config.local_port); // 主循环 while(1) { // LwIP协议栈轮询必须调用 MX_LWIP_Process(); // 透传逻辑处理 NetSer_Transparent_Transmit(); } }六、关键优化点H7 高性能适配串口 DMA 中断避免 CPU 轮询串口高速波特率921600不丢包LwIP 非阻塞接收MSG_DONTWAIT保证系统实时性大缓存配置H7 内存大512KB RAM缓存设为 2KB适配大包传输连接异常重连TCP 断开后自动重启监听保证设备在线七、功能扩展可选1. UDP 模式实现int NetSer_UDP_Create(uint16_t port) { struct sockaddr_in addr; int sockfd socket(AF_INET, SOCK_DGRAM, 0); memset(addr, 0, sizeof(addr)); addr.sin_family AF_INET; addr.sin_addr.s_addr INADDR_ANY; addr.sin_port htons(port); bind(sockfd, (struct sockaddr*)addr, sizeof(addr)); return sockfd; }2. 串口参数动态配置通过网络发送指令如BAUD115200代码解析后重新初始化串口// 重新配置串口波特率 void NetSer_UART_ReConfig(uint32_t baud) { HAL_UART_DeInit(huart1); huart1.Init.BaudRate baud; HAL_UART_Init(huart1); HAL_UART_Receive_DMA(huart1, uart_rx_buf, UART_RX_BUF_SIZE); }3. 参数掉电存储使用 H7 内部 Flash 存储配置参数断电不丢失。八、测试验证步骤硬件连接STM32H743 以太网接路由器 / PCUSART1 接 USB 转串口模块网络配置PC 与串口服务器设为同一网段192.168.1.x软件测试网络调试助手连接 TCP Server192.168.1.100:8080串口调试助手波特率 115200双向发送数据验证透传功能总结本方案基于STM32H743 HAL 库 LwIP 裸机实现无需 RTOS简单稳定核心是串口 DMA 接收LwIP 套接字通信双向透传逻辑支持 TCP Server 默认模式可扩展 UDP/TCP Client、参数配置、掉电存储适配 STM32H7 高性能特性最高支持 921600 波特率无丢包风险

更多文章