如何将COM端口接收的字符串拆分后分别显示在两个文本框中
实现思路
串口接收存在数据分批到达的特性,无法保证每次读取就能拿到完整的拼接字符串,所以需要先定义全局缓冲区暂存所有收到的数据,等缓冲区凑齐可拆分的完整数据后,再拆分赋值到两个文本框即可。
步骤1:在窗体类中声明必要全局成员
// 声明跨线程更新UI的委托 public delegate void SetTextCallback(string text); // 串口接收数据的全局缓冲区 private string _receiveBuffer = string.Empty;
步骤2:修改串口接收与数据处理逻辑
private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e) { // 读取当前批次收到的所有数据 string data = serialPort1.ReadExisting(); // 追加到全局缓冲区暂存 _receiveBuffer += data; ProcessReceivedData(); } private void ProcessReceivedData() { // 跨线程更新UI的兼容处理 if (this.tBoxCV1.InvokeRequired) { this.Invoke(new Action(ProcessReceivedData)); return; } // 拆分规则适配示例:按"1"作为第一段起始标记、"2"作为第二段起始标记拆分 int index1 = _receiveBuffer.IndexOf('1'); int index2 = _receiveBuffer.IndexOf('2'); // 缓冲区同时存在两个合法标记时才执行拆分 if (index1 > -1 && index2 > -1 && index2 > index1) { // 提取第一段赋值到第一个文本框 string part1 = _receiveBuffer.Substring(index1, index2 - index1); this.tBoxCV1.Text = part1; // 提取第二段赋值到第二个文本框,替换为你实际的第二个文本框控件名即可 string part2 = _receiveBuffer.Substring(index2); this.tBoxCV2.Text = part2; // 清空已处理的缓冲区,准备接收下一组数据 _receiveBuffer = string.Empty; } }
注意事项
如果实际业务中数据有固定长度、固定分隔符或者其他校验规则,直接修改ProcessReceivedData方法中的拆分逻辑即可,也可额外添加校验位判断逻辑避免拆分错误。
内容的提问来源于stack exchange,提问作者Linux
相关产品推荐
相关产品推荐

