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
相关产品推荐
相关产品推荐

