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

C#串口(UART)接收数据按字节拆分方法及代码修改指导

串口接收数据按字节拆分的C#代码修改方案

原代码通过ReadExisting()读取字符串再转字节的方式,容易因编码问题导致字节数据失真,且无法精准按原始字节拆分。以下是针对性修改步骤:

1. 添加全局字节缓冲区

在Form类中定义一个全局缓冲区,用于暂存串口接收的字节数据(解决串口分批接收导致的字节截断问题):

private List<byte> _receivedBytesBuffer = new List<byte>();

2. 替换字符串读取为直接字节读取

修改timer1_Tick方法,放弃ReadExisting(),改用直接读取字节的方式:

private void timer1_Tick(object sender, EventArgs e)
{
    try
    {
        if (serialPort1.IsOpen && serialPort1.BytesToRead > 0)
        {
            byte[] tempBuffer = new byte[serialPort1.BytesToRead];
            int readCount = serialPort1.Read(tempBuffer, 0, tempBuffer.Length);
            // 将读取到的字节加入全局缓冲区
            _receivedBytesBuffer.AddRange(tempBuffer.Take(readCount));
            
            // 按字节拆分处理缓冲区中的所有数据
            ProcessReceivedBytes();
        }
    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.Message);
        timer1.Stop();
    }
}

3. 实现按字节拆分的处理逻辑

新增ProcessReceivedBytes()方法,逐个处理缓冲区中的字节:

private void ProcessReceivedBytes()
{
    while (_receivedBytesBuffer.Count > 0)
    {
        byte currentByte = _receivedBytesBuffer[0];
        _receivedBytesBuffer.RemoveAt(0);
        
        // 这里添加对单个字节的处理逻辑,比如显示、判断等
        string byteInfo = $"字节值: 0x{currentByte:X2} ({currentByte})";
        label1.Text = byteInfo;
        listBox1.Items.Add(byteInfo);
        
        // 保留原代码的0XFF判断逻辑
        if (currentByte == 0xFF)
        {
            Console.WriteLine($"有效字节: 0x{currentByte:X2}");
        }
        else
        {
            Console.WriteLine($"无效字节: 0x{currentByte:X2}");
        }
    }
}

4. 清理冗余代码

删除原timer1_Tick中字符串转字节的冗余代码(Encoding.Default.GetBytes(sonuc)相关逻辑)。

修改说明

  • 直接读取字节避免了编码转换带来的字节丢失或错误,确保拿到的是串口传输的原始字节数据。
  • 全局缓冲区解决了串口分批接收数据的问题,保证每个字节都能被单独处理。
  • 拆分后的字节可以直接用于协议解析、数值转换等场景,无需额外转换。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 16:39:51