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

C# System.IO.Ports中BytesToRead异常致串口接收数据不全

WinForm串口接收数据不完整问题解决

问题原因

你代码里的循环条件i < com.BytesToRead存在逻辑漏洞:BytesToRead是动态变化的属性,每调用一次ReadByte(),串口缓冲区的剩余字节数就会减1。比如初始缓冲区有20字节,循环开始时BytesToRead=20,当i递增到10时,BytesToRead已经变成10,此时i < BytesToRead的条件不成立,循环提前终止,自然只能读到一半数据。

修复方案

方案1:缓存剩余字节数再循环

先把当前BytesToRead的值存入固定变量,用这个静态值作为循环上限:

string Data = "";
Thread.Sleep(1000);

// 先缓存缓冲区当前的字节总数
int totalBytes = com.BytesToRead;
for (int i = 0; i < totalBytes; i++)
{ 
    Data += ((char)com.ReadByte()).ToString();
}
                
MessageBox.Show(Data);

方案2:一次性读取所有字节(更高效)

直接读取缓冲区全部字节后再转换为字符串,彻底避免循环中的动态判断问题:

Thread.Sleep(1000);

byte[] buffer = new byte[com.BytesToRead];
com.Read(buffer, 0, buffer.Length);
// 根据实际通信编码调整,比如UTF8
string Data = Encoding.ASCII.GetString(buffer);

MessageBox.Show(Data);

额外提示

  • Thread.Sleep(1000)是临时的妥协方案,实际项目建议使用串口的DataReceived事件处理接收逻辑,这是WinForm串口编程的标准做法,既能避免阻塞UI线程,又能更及时响应数据。
  • 确保收发两端使用相同的字符编码(如ASCII、UTF8),否则可能出现乱码。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 10:45:38