You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

STM32发送256字节,VS串口分两次接收(32+224)原因咨询

STM32发送256字节数据,SerialPort分两次接收(32+224字节)的原因分析

问题描述

我从STM32发送256字节数据,通过Visual Studio的SerialPort接收时,却分两次收到数据,分别为32字节和224字节,请问这是什么原因?

STM32 USART配置

huart2.Instance = USART2;
huart2.Init.BaudRate = 9600;
huart2.Init.WordLength = UART_WORDLENGTH_8B;
huart2.Init.StopBits = UART_STOPBITS_1;
huart2.Init.Parity = UART_PARITY_NONE;
huart2.Init.Mode = UART_MODE_TX_RX;
huart2.Init.HwFlowCtl = UART_HWCONTROL_NONE;
huart2.Init.OverSampling = UART_OVERSAMPLING_16;
huart2.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE;
huart2.Init.ClockPrescaler = UART_PRESCALER_DIV1;
huart2.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT;

STM32发送代码

uint8_t memory[256];
for (int i = 0; i < 256; i++)
memory[i] = 0xFF;
HAL_UART_Transmit(&huart2, memory, sizeof(memory), HAL_MAX_DELAY);

Visual Studio接收代码

private void readerSerialPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
  if (!this.readerSerialPort.IsOpen) return;
  int bytes = this.readerSerialPort.BytesToRead;
  byte[] buffer = new byte[bytes];
  this.readerSerialPort.Read(buffer, 0, bytes);
  MessageBox.Show(buffer.Length.ToString());
}

原因分析

  • 串口流式传输的本质:串口是字节流式通信,发送端即使一次性调用发送函数,数据也是逐字节通过物理链路传输的。PC端的串口驱动不会等待所有数据都抵达才通知应用层,只要缓冲区积累了一定数据,就会触发DataReceived事件,自然会出现分批次接收的情况。
  • 底层驱动的触发阈值:你遇到的32字节是常见的驱动触发阈值——部分Windows串口驱动或硬件芯片会在接收缓冲区达到32字节时就主动通知应用层,剩余的224字节后续到达后再次触发事件,这是底层驱动的默认行为,和SerialPort的配置无关。
  • 无应用层帧协议约束:当前通信没有定义完整的帧格式(比如帧头、长度字段、校验位),接收端无法判断什么时候是完整的数据包,只能被动接收驱动推送的片段数据。

解决建议

  • 实现应用层帧协议:这是最可靠的方案。给每个数据包添加固定帧头(如0xAA)、2字节长度字段(标识总字节数)和校验位。接收端收到数据后先缓存,解析出长度字段后,等待缓存数据达到指定长度再处理完整数据包。
  • 循环读取累加数据:在DataReceived事件中,不要只读取当前可用字节,而是循环读取并累加数据,直到累计收到256字节。注意要添加超时逻辑,避免因丢包导致无限等待。
  • 调整触发阈值(不推荐):可以设置SerialPort.ReceivedBytesThreshold = 256,让事件在收到256字节时才触发。但这种方式容错性差,一旦传输中出现丢包,接收端会一直等待,导致数据积压。

内容的提问来源于stack exchange,提问作者Sem

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 17:17:42