List<byte> sp_buffer = new List<byte>(4096); //串口缓存区 int sp_buffer_max = 4096; //串口缓存区最大缓存字节数 private void SerialDataReceive(object sender, SerialDataReceivedEventArgs e) //接收串口数据 { if (serialPort1.IsOpen == false) { serialPort1.Close(); return; } int Byte_len = serialPort1.BytesToRead; //读取缓存的数据长度 byte[] Rc_byte = new byte[Byte_len]; //定义一个字节数组 serialPort1.Read(Rc_byte, 0, Byte_len); //将缓存数据存储进字节数组里面 if (sp_buffer.Count > sp_buffer_max) //缓存超过字节数 先丢弃前面的字节 sp_buffer.RemoveRange(0, sp_buffer_max); //丢弃前面的字节0到sp_buffer_max,存入后进的数据 //?????????????????? sp_buffer.AddRange(Rc_byte); //存入缓存区 byte[] ruffer = new byte[9192]; //用来存放缓冲区的数据流 //??????? //对数据流进行筛选,缓冲区每一组数据个数大于4则为我们想要的数据流 if (sp_buffer.Count > 4) { sp_buffer.CopyTo(0, ruffer, 0, sp_buffer.Count); Task.Run(() => printf_data(ruffer, sp_buffer.Count, 1)); //打印数据流 } }
时间: 2024-02-14 08:35:37 浏览: 131
List<Map<String, Object>>转化为List<JavaBean>工具类
4星 · 用户满意度95%
这段代码实现了串口数据的接收和缓存,并对数据进行筛选后打印出来。
首先,定义了一个名为 sp_buffer 的 List<byte> 类型的缓存区,用于存储串口接收到的数据。同时,定义了一个 sp_buffer_max 变量,表示缓存区的最大缓存字节数为 4096。
接着,在 SerialDataReceive() 方法中,先判断串口是否打开,若未打开则关闭串口并返回。接着,利用 serialPort1.BytesToRead 属性获取串口缓存的数据长度 Byte_len,再定义一个字节数组 Rc_byte,用于存储缓存数据。
然后,利用 serialPort1.Read() 方法将缓存数据存储进字节数组 Rc_byte 里面。接下来,判断缓存区 sp_buffer 的字节数是否超过了设定的 sp_buffer_max,若超过则先丢弃前面的字节0到sp_buffer_max,再存入后进的数据。最后,利用 sp_buffer.AddRange() 方法将缓存数据存入缓存区 sp_buffer。
最后,定义了一个名为 ruffer 的字节数组,用于存放缓冲区的数据流。利用 sp_buffer.Count 属性获取缓存区中数据的个数,若大于4,则将 sp_buffer 中的数据复制到 ruffer 数组中,并利用 Task.Run() 方法打印数据流。
阅读全文