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();
}
}
}
参考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();
}
参考GPT和自己的思路:
在等于68的时候,可以设置一个标记变量来标记后面7个字节是否已经被接收到。如果标记变量为真,则将接收到的数据加入到buffer列表中即可。具体实现如下:
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)
{
buffer.Clear(); //清空buffer列表
buffer.Add(ReceiveData); //将起始值加入到buffer列表中
isStartReceived = true; //标记变量置为真
}
else if (isStartReceived)
{
buffer.Add(ReceiveData); //将接收到的数据加入到buffer列表中
if (buffer.Count == 8)
{
isStartReceived = false; //7个字节已经接收完毕,将标记变量置为假
//这里可进行后续操作,例如将接收到的数据写入文件或者显示到文本框中
}
}
sw.Write(buffer); //将接收到的数据写入文件
sw.Close();
}
这个用正则表达式或者substring 都可以