首页 > 编程语言 >c#通过串口读取到的分段json提取方法

c#通过串口读取到的分段json提取方法

时间:2024-12-09 16:35:04浏览次数:4  
标签:endIndex int ch c# List depth buffer json 串口

 private List<byte> receivedBuffer = new List<byte>();
 private void btnConnect_Click(object sender, EventArgs e)
 {
     this.btnConnect.Enabled = false;
     this.btnDisconnect.Enabled = true;

     _deviceAdapter = new ComDeviceAdapter(this.cbxComPorts.SelectedItem?.ToString() ?? "", 9600);
     _deviceAdapter.Connect();
     _deviceAdapter.DataReceived += (s, e) =>
     {
         receivedBuffer.AddRange(e);

         foreach (var item in this.ParseJson(receivedBuffer))
         {
             AppendLog(Encoding.UTF8.GetString(item));
         }
     };
 }

 private List<byte[]> ParseJson(List<byte> buffer)
 {
     int startIndex = 0;
     int endIndex = -1;
     int depth = 0;
     List<byte[]> jsonArray = new List<byte[]>();

     // 寻找JSON数据的起始位置和结束位置
     for (int i = 0; i < buffer.Count; i++)
     {
         char ch = (char)buffer[i];

         if (ch == '{' || ch == '[')
         {
             if (depth == 0)
             {
                 startIndex = i;
             }
             depth++;
         }
         else if (ch == '}' || ch == ']')
         {
             depth--;
             if (depth == 0)
             {
                 endIndex = i;

                 //解析成功
                 byte[] jsonBytes = buffer.GetRange(startIndex, endIndex - startIndex + 1).ToArray();
                 jsonArray.Add(jsonBytes);
             }
         }
     }

     if (endIndex != -1)
     {
         buffer.RemoveRange(0, endIndex + 1);
     }

     return jsonArray;
 }

  

串口读取到的数据不是完整的,应该先存放缓冲区然后用上面解析方法提取。

标签:endIndex,int,ch,c#,List,depth,buffer,json,串口
From: https://www.cnblogs.com/htsboke/p/18595316

相关文章

  • linux安装和使用Rancher
    linux安装和使用RancherRancher介绍请看如下博客arm架构安装Rancher并导入k8s集群解决Error:noobjectspassedtoapply华为云arm架构安装k8s(kubernetes)")linux下安装RancherRancher部署======监控k8s集群状态等,比Dashboard插件强大======提前安装好K8S在master上执行......
  • 白骑士的JavaScript教学生态系统篇之现代前端开发流程 5.3.4 持续集成与部署(CI/CD)
            在现代软件开发中,持续集成与持续部署(CI/CD)已经成为提高开发效率、确保软件质量的关键流程。CI/CD不仅能够自动化代码的构建、测试和部署,还能帮助开发团队快速地将新功能和修复发布到生产环境。本文将深入探讨CI/CD的概念、优势、常用工具以及如何在JavaScript......
  • rsync教程
    一、简介rsync是一个常用的Linux应用程序,用于文件同步。它可以在本地计算机与远程计算机之间,或者两个本地目录之间同步文件(但不支持两台远程计算机之间的同步)。它也可以当作文件复制工具,替代cp和mv命令。它名称里面的r指的是remote,rsync其实就是"远程同步"(remotesync)的......
  • [ARC189B] Minimize Sum 题解
    场上被创死了。思路考虑一次操作会造成什么影响。加入操作的是:\[x_1,x_2,x_3,x_4\]它们会变成:\[x_1,x_1+x_4-x_3,x_1+x_4-x_2,x_4\]发现没有什么规律。考虑它们的差分序列:\[x_1,x_4-x_3,x_3-x_2,x_2-x_1\]改变为交换\(2,4\)的差分。那么修改就变成很简单的形式了。......
  • MSI安装包制作工具 Advanced Installer v21.9 便携版
    这款PC端的软件集成了打包、配置和部署功能,界面简洁,功能全面。即使你是安装脚本的新手,也能轻松上手,快速制作符合WindowsInstaller标准的MSI和MSP安装包。该版本已注册,可以使用全部功能。使用说明:1、将压缩文件解压到固定位置,不要随意移动。2、解压后,双击start_AInstaller......
  • JavaScript 写css的内联样式
    一、使用style属性-直接设置单个CSS属性//获取元素varelement=document.getElementById("myElement");//设置样式element.style.color="red";element.style.backgroundColor="blue";element.style.fontSize="20px";二、使用cssText属性-一次性设......
  • Mitel MiCollab企业协作平台存在任意文件读取漏洞(CVE-2024-41713)
    免责声明:本文旨在提供有关特定漏洞的深入信息,帮助用户充分了解潜在的安全风险。发布此信息的目的在于提升网络安全意识和推动技术进步,未经授权访问系统、网络或应用程序,可能会导致法律责任或严重后果。因此,作者不对读者基于本文内容所采取的任何行为承担责任。读者在使用本......
  • DockerUI存在默认口令漏洞
    免责声明:本文旨在提供有关特定漏洞的深入信息,帮助用户充分了解潜在的安全风险。发布此信息的目的在于提升网络安全意识和推动技术进步,未经授权访问系统、网络或应用程序,可能会导致法律责任或严重后果。因此,作者不对读者基于本文内容所采取的任何行为承担责任。读者在使用本......
  • Scala隐式转换:提高代码灵活性的利器
    引言Scala的隐式转换是一种允许开发者在特定情境下自动转换类型的特性,它极大地提高了代码的灵活性和可读性。本文将全面介绍Scala隐式转换的概念、应用场景、代码示例、注意事项以及最佳实践。隐式转换基础在Scala中,隐式转换通过implicit关键字定义,可以是隐式值、隐式类或者......
  • Cargo 教程
    在Rust开发中,几乎所有的项目都是使用Cargo来进行管理和构建的,因为它提供了便捷的工作流程和强大的功能,使得Rust开发变得更加高效和可靠。Cargo是什么Cargo是Rust的官方构建系统和包管理器。它主要有两个作用:主要有两个作用:项目管理:Cargo用于创建、构建和管理R......