官方提醒4 2023-03-19 15:47 采纳率: 68.2%
浏览 109
已结题

C#如何筛选出自己想要的数据

在判断头帧以后 下位机发过的数据 偶尔会发过来9个字节的数据 如果我按照10个字节的数据进行截取 后面就截取不到对的数据,我该如何把中间9个字节的数据 筛选掉 只要10个字节的数据 如果有思路请直接贴代码并注释上 注释,如果按照需求可以正常运行 我会采纳

img

img

    private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e)
        {
            // 检查是否允许跨线程调用控件,这里为了简化代码直接禁用了该功能
            CheckForIllegalCrossThreadCalls = false;
            // 读取所有可用字节数
            int bytesToRead = serialPort1.BytesToRead;
            //用于存储接收到的数据
            byte[] receiveBuffer = new byte[bytesToRead];
            //从串口读取数据
            serialPort1.Read(receiveBuffer, 0, bytesToRead);
            buffer.AddRange(receiveBuffer);
            //将接收到的数据转换为字符串格式
            if (buffer.Count >0 && buffer[0] == 0x68)
            {   
                //如果缓冲区的长度大于等于8,则表示已经接收到完整的数据帧
                if (buffer.Count >= 10)
                {   //截取需要的10个字节数据
                    byte[] data = buffer.GetRange(0,10).ToArray();
                    //将接收到的数据转换为字符串格式
                    receivedString = BitConverter.ToString(data).Replace("-", "");
                    textBox1.AppendText(receivedString);
                    //将字符串追加至文本框中
                    string timeStr = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
                    using (StreamWriter sw = new StreamWriter(@"C:\Users\guoxiaoru\Desktop\ACVB.txt", true))
                    {
                        sw.WriteLine(timeStr + "   " + receivedString, "\n");
                        sw.Close();
                    }
                    //清空缓冲区
                    buffer.Clear();
                }
            }
            //清空缓冲区
            else { buffer.Clear(); }
        }

  • 写回答

8条回答 默认 最新

  • 「已注销」 2023-03-19 16:05
    关注

    参考gpt和自己的思路,在判断头帧以后,可以先判断缓冲区的长度是否为9,如果是,则将缓冲区清空;如果不是,则按照10个字节的数据进行截取。可以参考如下代码:

    
    private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e)
    {
    // 检查是否允许跨线程调用控件,这里为了简化代码直接禁用了该功能
    CheckForIllegalCrossThreadCalls = false;
    // 读取所有可用字节数
    int bytesToRead = serialPort1.BytesToRead;
    //用于存储接收到的数据
    byte[] receiveBuffer = new byte[bytesToRead];
    //从串口读取数据
    serialPort1.Read(receiveBuffer, 0, bytesToRead);
    buffer.AddRange(receiveBuffer);
    //将接收到的数据转换为字符串格式
    if (buffer.Count > 0 && buffer[0] == 0x68)
    {
    //如果缓冲区的长度等于9,则表示中间有9个字节的无用数据
    if (buffer.Count == 9)
    {
    //清空缓冲区
    buffer.Clear();
    }
    //如果缓冲区的长度大于等于10,则表示已经接收到完整的数据帧
    else if (buffer.Count >= 10)
    { //截取需要的10个字节数据
    byte[] data = buffer.GetRange(0,10).ToArray();
    //将接收到的数据转换为字符串格式
    receivedString = BitConverter.ToString(data).Replace("-", "");
    textBox1.AppendText(receivedString);
    //将字符串追加至文本框中
    string timeStr = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
    using (StreamWriter sw = new StreamWriter(@"C:\Users\guoxiaoru\Desktop\ACVB.txt", true))
    {
    sw.WriteLine(timeStr + " " + receivedString, "\n");
    sw.Close();
    }
    //清空缓冲区
    buffer.Clear();
    }
    }
    //清空缓冲区
    else { buffer.Clear(); }
    }
    
    
    评论

报告相同问题?

问题事件

  • 系统已结题 3月27日
  • 修改了问题 3月19日
  • 创建了问题 3月19日

悬赏问题

  • ¥15 工价表引用工艺路线,应如何制作py和xml文件
  • ¥15 根据历史数据,推荐问题类型
  • ¥15 需要仿真图,简单的二阶系统实例
  • ¥15 stm32光控照明仿真
  • ¥15 使用人工智能的方法生成满足一定统计参数要求的随机数序列
  • ¥15 SENT协议中相关问题咨询
  • ¥15 URL地址href跳转问题
  • ¥15 mysql数据库备份恢复
  • ¥15 mmdetection mask-rcnn
  • ¥25 matlab可以将微分方程的解显示为相图形式吗