Как сохранить данные из последовательного порта в кольцевой буфер?
Я разрабатываю настольное приложение для связи через последовательный порт.Аппаратное обеспечение, подключенное к последовательному порту, отправляет данные в пакете.
Но количество байтов в этом пакете неизвестно,поэтому используется кольцевой буфер.
в C#нет стандартной реализации циклического/кольцевого буфера,поэтому я использую один из них, предоставленный на GitHub https://github.com/xorxornop/RingBuffer/blob/master/PartiallyConcurrent/RingBuffer.cs
Я хочу сохранить данные в кольцевом буфере как полученные,а затем проанализировать их(например,проверить наличие байтов заголовка, идентификатора устройства, байта состояния и т. д.), И если их там нет, то отбросить их.
Я пробовал различные реализации, но не смог получить правильную реализацию.
Что я уже пробовал:
using CircularBuffer; using CircularBufferCommunicationModification; using OpenJobScheduler; using System; using System.Collections.Generic; using System.IO.Ports; using System.Linq; using System.Text; using System.Threading.Tasks; using RingByteBuffer; namespace SerialPortCommunicationWithStateMachines { public class DataReceiveHandle { public static int MAX_PACKET_LENGTH = ChannelDataCount.count; public static bool newData = false; public static int rxOffset = 0; public static int rxWrite = 0; public static int rxRead = 0; public static byte[] rxBuffer = new byte[MAX_PACKET_LENGTH]; public static byte[] rxPackage = new byte[MAX_PACKET_LENGTH]; public static void DataReceivedHandler(object sender, SerialDataReceivedEventArgs e) { if (e.EventType != SerialData.Chars) return; SerialPort port = (SerialPort)sender; int bytesCount = port.BytesToRead; //reading all the bytes from port int bufferSize = port.ReadByte(); SequentialRingBuffer rBuffer = new SequentialRingBuffer(4096, rxBuffer, true); //puting the bytes from ports into ring buffer rBuffer.Put((byte)bufferSize); //ring buffer with two pointers so rxWrite will be pinting towards the poistion in ring buffer where there is last byte writing is done. //and if it is end of circular buffer then should go back to first poistion and start writing there rxWrite=rBuffer.CurrentLength; //now the rxRead should read byte from ring buffer one by one so to parse it. byte[] tempArray = new byte[256]; tempArray=rBuffer.ToArray(); } } }