官方提醒4 2023-03-17 19:38 采纳率: 68.2%
浏览 21
已结题

C#串口接收到的数据在起始值等于68的时候拿到后面的7位

C#串口接收到的数据在起始值等于68的时候拿到后面的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>(4096);
        private SerialPort serialPort;
        public object BytesBuffer { get; private set; }

        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)
        {
            CheckForIllegalCrossThreadCalls = false;
            byte ReceiveData;
            ReceiveData = (byte)serialPort1.ReadByte();
            //string str = Convert.ToString(ReceiveData, 16).ToUpper();       
            //textBox1.AppendText(timeStr  + str);
            StreamWriter sw = new StreamWriter(@"C:\Users\guoxiaoru\Desktop\ACVB.txt", true);//写入文件夹
            //   //定义一个数组
            //byte[] buffer = new byte[serialPort.BytesToRead];
            //    //从缓存里拿数据出来
            //serialPort.Read(buffer, 2, buffer.Length);
            if (ReceiveData == 0x68) 
            {
                //这里想在等于68的时候 拿到后面的7个字节 我该如何拿 
            }
            sw.Write(buffer);

            sw.Close();
        }  
    }
}


  • 写回答

3条回答 默认 最新

  • lshen01 2023-03-17 19:42
    关注

    参考GPT和自己的思路:在接收到数据时,判断如果该数据为起始值 0x68,则可以在接下来的七个数据读取到缓存中。具体实现可以使用一个变量记录当前是否处于起始值状态,如果是,则依次将后续七个字节加入缓存中,直到所有数据接收完毕。代码示例如下:

    private bool isStart = false; //是否处于起始值状态
    private byte[] data = new byte[7]; //存储后续七个字节的数组
    private int dataIndex = 0; //当前已接收的字节数
    private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e)
    {
        CheckForIllegalCrossThreadCalls = false;
        byte ReceiveData;
        ReceiveData = (byte)serialPort1.ReadByte();
        if (isStart) //当前处于起始值状态
        {
            data[dataIndex] = ReceiveData;
            dataIndex++;
            if (dataIndex == 7) //接收到了七个字节
            {
                buffer.AddRange(data); //将七个字节加入缓存中
                isStart = false; //重置状态
                dataIndex = 0; //重置计数器
            }
        }
        else if (ReceiveData == 0x68)
        {
            isStart = true; //进入起始值状态
            data[dataIndex] = ReceiveData;
            dataIndex++;
        }
        else
        {
            buffer.Add(ReceiveData); //普通数据直接加入缓存中
        }
        StreamWriter sw = new StreamWriter(@"C:\Users\guoxiaoru\Desktop\ACVB.txt", true);
        sw.Write(buffer);
        sw.Close();
    }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 3月27日
  • 已采纳回答 3月19日
  • 创建了问题 3月17日

悬赏问题

  • ¥15 虚幻5 UE美术毛发渲染
  • ¥15 CVRP 图论 物流运输优化
  • ¥15 Tableau online 嵌入ppt失败
  • ¥100 支付宝网页转账系统不识别账号
  • ¥15 基于单片机的靶位控制系统
  • ¥15 真我手机蓝牙传输进度消息被关闭了,怎么打开?(关键词-消息通知)
  • ¥15 装 pytorch 的时候出了好多问题,遇到这种情况怎么处理?
  • ¥20 IOS游览器某宝手机网页版自动立即购买JavaScript脚本
  • ¥15 手机接入宽带网线,如何释放宽带全部速度
  • ¥30 关于#r语言#的问题:如何对R语言中mfgarch包中构建的garch-midas模型进行样本内长期波动率预测和样本外长期波动率预测