首页 > 编程语言 >C#串口读写,如果是按位读取,遇到有结束符号“0D0A”16进制终止符号的时候,怎么处理,并且保持不粘连

C#串口读写,如果是按位读取,遇到有结束符号“0D0A”16进制终止符号的时候,怎么处理,并且保持不粘连

时间:2024-08-24 11:53:08浏览次数:12  
标签:0D0A 缓存 符号 buffer List startIndex endIndex 串口 数据包

对于串口数据存在以 0D 0A(回车换行)作为结束符号的情况,可以按照以下步骤设计相应的处理逻辑:

一、定义数据包结构

首先定义一个数据包结构,包含数据包长度和实际数据内容两个部分。
示例代码:

public struct SerialPacket
{
    public int Length;
    public byte[] Data;
}

二、读取串口数据并缓存

在 SerialPort_DataReceived 事件中读取串口数据,并将其缓存在一个 List 中。
示例代码:

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

private void SerialPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
    int bytesRead = serialPort.Read(readBuffer, 0, readBuffer.Length);
    buffer.AddRange(readBuffer.Take(bytesRead));
}

三、解析数据包

在缓存的数据中查找 0D 0A 结束符,并将完整的数据包提取出来。
示例代码:

private List<SerialPacket> ParseDataPackets()
{
    List<SerialPacket> packets = new List<SerialPacket>();

    int startIndex = 0;
    while (true)
    {
        int endIndex = buffer.IndexOf(0x0D, startIndex);
        if (endIndex == -1)
            break;

        if (endIndex + 1 < buffer.Count && buffer[endIndex + 1] == 0x0A)
        {
            int packetLength = endIndex - startIndex;
            byte[] packetData = buffer.GetRange(startIndex, packetLength).ToArray();
            packets.Add(new SerialPacket { Length = packetLength, Data = packetData });
            startIndex = endIndex + 2; // 跳过结束符
        }
        else
        {
            startIndex = endIndex + 1;
        }
    }

    // 将未处理的数据移到缓冲区开头
    buffer.RemoveRange(0, startIndex);

    return packets;
}

四、处理数据包

在获取到完整的数据包后,可以对其进行相应的处理。
示例代码:

private void ProcessDataPackets(List<SerialPacket> packets)
{
    foreach (var packet in packets)
    {
        // 对数据包进行处理
        ProcessPacket(packet.Data);
    }
}

private void ProcessPacket(byte[] packetData)
{
    // 对数据包进行解析和处理
    // ...
}

五、定期清理缓存

如果缓存中一直存在未处理的数据,可以定期清理缓存以防止内存消耗过高。
示例代码:

private void CleanupBuffer()
{
    if (buffer.Count > 1024 * 1024) // 缓存超过 1MB
    {
        buffer.Clear();
    }
}

通过上述方法,您可以在 SerialPort_DataReceived 事件中持续读取串口数据,并在缓存中查找完整的数据包。在找到完整的数据包后,将其从缓存中移除并进行相应的处理。同时,您也可以定期清理缓存以防止内存消耗过高。

这种设计可以有效地处理串口数据中存在 0D 0A 结束符的情况,确保应用程序能够正确地接收和处理完整的数据包。

标签:0D0A,缓存,符号,buffer,List,startIndex,endIndex,串口,数据包
From: https://blog.csdn.net/weixin_38812575/article/details/141497573

相关文章

  • 掌握数据科学中的算法效率:大 O 符号和计算复杂性
    机器学习工程师可扩展且高效的数据处理和模型训练的基本策略和工具欢迎来到雲闪世界。    时间和空间复杂度是抽象概念,也是高效数据处理和模型训练的支柱。通过掌握这些原则,数据科学家可以优化工作流程,降低计算成本,并快速构建处理大型数据集的可扩展解决方案。  ......
  • 串口通信协议学习记录
            在日常使用中,我们往往接触的较多的是UART(UniversalAsynchronousReceiverTransmitter:通用异步收发器),即日常说的串口,该总线有两条数据线:发送数据TXD(TransmitData)和接收数据RXD(ReceivedData),在使用中,我们线路连接图如下:注意:信号的传输建立在一个公共的基......
  • CH340C芯片 串口通信
            CH340C是一种芯片‌,具体来说,它是CH340系列中的一款芯片,属于USB转串口芯片。这种芯片的主要功能是通过USB接口将计算机与外部硬件设备连接起来,实现通信。CH340C说白了就是电平转换芯片        可以将串口电平信号转换为USB信号    ......
  • 符号互动理论的起源、发展、应用
    一、符号互动理论的起源与发展1、符号互动理论简介:符号互动理论是当代社会学理论中极具影响力的学派,起源于注重社会心理学研究的英国理论传统,并在美国得到发展。理论基础由**美国心理学家和哲学家如詹姆斯、杜威等人奠定,但主要由库利、米德和布鲁默三位学者推动发展**。2......
  • 串口代码片段
    //Seehttps://aka.ms/new-console-templateformoreinformationusingSystem.IO.Ports;usingSystem.Runtime.InteropServices;Console.WriteLine("Hello,World!");try{varports=SerialPort.GetPortNames();foreach(varportinports)......
  • 二极管常见电路符号说明
    二极管常见电路符号说明摘要本文详细介绍了四种特殊的二极管:TVS二极管用于瞬态电压抑制,响应速度快;肖特基二极管适用于高速电路,导通电压低;隧道二极管利用量子穿隧效应,适用于高频切换;变容二极管则作为可变电容使用,电容量可随电压改变。二极管简介普通的二极管的定义是正向导通,反......
  • 数字IC/FPGA中有符号数的处理探究
    做秋招笔试题时不出意外地又发现了知识盲区,特此学习记录。1.前提说明        有符号数无非分为两种:正数和负数,其中正数的符号位是0,不会引起歧义,负数的符号为1,采用的是补码表示。    此处复习一下补码的知识:对正数而言原码反码补码一致,负数则有区别,要掌握将......
  • 【WCH蓝牙系列芯片】-基于CH582开发板—蓝牙从机HAL_SLEEP模式,串口唤醒收发数据
    -------------------------------------------------------------------------------------------------------------------------------------在之前的博客文档中介绍过CH582作为蓝牙主机,开启睡眠后,通过串口唤醒,并接收串口数据。这里再讲解一下使用CH582芯片作为蓝牙从机,开......
  • [开源&分享]一个用于单片机IAP自动发送的串口助手,上位机,使用Python+tkinter制作
    使用Python+tkinter制作。功能:这是个给单片机通过串口进行IAP的上位机,与单片机中的BOOT程序配合使用,完成对单片机APP程序的升级。可以完成bin文件的切片,CRC校验(使用Crc32Mpeg2),打包自动发送。界面如下图所示:接收区是显示信息的区域,接收和发送的信息都在这显示串口配置区域......
  • 串口通信协议(hal库)
    目录串口通信协议串行/并行同步/异步单工/半双工/全双工DR寄存器轮询方式中断方式主要中断事件:DMA方式USART模块的常用HAL库常用接口函数串口通信协议串口通信(SerialCommunication)指的是数据通过一个串行的通道进行传输,每次传输一位数据。常见的串口通信协议......