官方提醒4 2023-03-18 16:46 采纳率: 68.2%
浏览 57
问题最晚将于03月26日00:00点结题

C#中我想判断头帧后截取后面的7位数据

串口发过来的数据,如何截取我想要的长度 在我判断头帧后 我只想要后面的7位,并可以把我截取的到数据写入文件内,如果有思路请直接贴代码,麻烦带上注释,如果按照需求可以正常运行 我会采纳

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.IO.Ports;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using static System.Windows.Forms.VisualStyles.VisualStyleElement;
 
namespace Ck
{
 
    public partial class Form1 : Form
    {
        string timeStr = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
        
        private List<byte> buffer = new List<byte>(1024);
        byte[] receiveBuffer = new byte[10];
        public Form1()
        {
            InitializeComponent();
        }
        private void Form1_Load_1(object sender, EventArgs e)
        {
            comboBox1.Items.AddRange(System.IO.Ports.SerialPort.GetPortNames());
            serialPort1.DataReceived += new SerialDataReceivedEventHandler(serialPort1_DataReceived);
        }
        private void button1_Click(object sender, EventArgs e)
        {
            try
            {
                if (serialPort1.IsOpen)
                {
                    serialPort1.Close();
                    button1.Text = "点击打开串口";
                }
                else
                {
                    serialPort1.PortName = comboBox1.Text;
                    serialPort1.Open();
                    button1.Text = "点击关闭串口";
                }
            }
            catch (Exception ex)
            {
                //捕获可能发生的异常并进行处理
 
                //捕获到异常,创建一个新的对象,之前的不可以再用
                serialPort1 = new System.IO.Ports.SerialPort();
                //刷新COM口选项
                comboBox1.Items.Clear();
                comboBox1.Items.AddRange(System.IO.Ports.SerialPort.GetPortNames());
                //响铃并显示异常给用户
                System.Media.SystemSounds.Beep.Play();
                button1.Text = "打开串口";
                button1.BackColor = Color.ForestGreen;
                MessageBox.Show(ex.Message);
            }
 
        }
 
        private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e)
        {
            string abc;
            // 检查是否允许跨线程调用控件,这里为了简化代码直接禁用了该功能
            CheckForIllegalCrossThreadCalls = false;
 
 
            // 读取所有可用字节数
            int bytesToRead = serialPort1.BytesToRead;
 
            //用于存储接收到的数据
            byte[] receiveBuffer = new byte[bytesToRead];
 
            //从串口读取数据
            serialPort1.Read(receiveBuffer, 0, bytesToRead);
            buffer.AddRange(receiveBuffer);
            //将接收到的数据转换为字符串格式
            string receivedString = BitConverter.ToString(receiveBuffer).Replace("-", "");
            //将字符串追加至文本框中
            if (buffer[0] ==0x68)
            {
 
                StreamWriter sw = new StreamWriter(@"C:\Users\guoxiaoru\Desktop\ACVB.txt", true);
                sw.WriteLine(receivedString, "\n");
                sw.Close(); 
                
            }
 
        }  
    }
}
 
 

  • 写回答

7条回答 默认 最新

  • 「已注销」 2023-03-18 16:53
    关注

    参考GPT和自己的思路:你可以在 serialPort1_DataReceived 方法中加入以下代码,来实现你的需求。在接收到头帧时,将后面的7位数据截取出来,并写入文件:

    private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e)
    {
        // ...
    
        // 从串口读取数据
        serialPort1.Read(receiveBuffer, 0, bytesToRead);
        buffer.AddRange(receiveBuffer);
    
        // 如果接收到头帧 0x68
        if (buffer[0] == 0x68)
        {
            // 如果接收到的数据长度不足 8,说明数据不完整,等待下一次接收
            if (buffer.Count < 8) 
                return;
    
            // 截取后面的 7 个字节
            byte[] data = buffer.Skip(1).Take(7).ToArray();
    
            // 将字节数组转换为字符串,并写入文件
            string dataString = BitConverter.ToString(data).Replace("-", "");
            using (StreamWriter sw = new StreamWriter(@"C:\Users\guoxiaoru\Desktop\ACVB.txt", true))
            {
                sw.WriteLine(dataString);
            }
    
            // 清空缓冲区,等待下一次接收
            buffer.Clear();
        }
    }
    
    
    

    解释一下代码:

    buffer 是一个 List,用于存储从串口接收到的数据。注意,该缓冲区不一定保存完整的数据帧,可能只保存了数据帧的一部分。
    当接收到头帧时,先检查缓冲区中是否已经接收了完整的数据帧,如果数据不完整,则等待下一次接收。
    使用 LINQ 的 Skip 和 Take 方法截取后面的 7 个字节。
    使用 BitConverter 类将字节数组转换为字符串,并将字符串写入文件。使用 using 语句可以自动关闭文件流。
    最后清空缓冲区,等待下一次接收。

    评论

报告相同问题?

问题事件

  • 已采纳回答 3月19日
  • 创建了问题 3月18日

悬赏问题

  • ¥15 郑州牧原测试岗值得去吗
  • ¥100 复现论文:matlab仿真代码编写
  • ¥15 esp32驱动GC9A01循环播放视频
  • ¥15 惠普360g9的最新bios
  • ¥30 这个功能用什么软件发合适?
  • ¥60 微信小程序,取消订单,偶尔订单没有改变状态
  • ¥15 用pytorch实现PPO算法
  • ¥15 关于调制信号的星座图?
  • ¥30 前端传参时,后端接收不到参数
  • ¥15 这是有什么问题吗,我检查许可证了但是显示有呢