Последовательный порт на C#, читайте до байтовой последовательности

У меня есть поток данных из COM-порта. Этот поток состоит из наборов по 30 байтов. Первые 26 байтов являются информацией, а последние четыре - набором 0xFFF, Например, набор массивов [0xFF,0x5A,0x44,0x15,...,0x5F,0xFF,0xFF,0xFF,0xFF], В первых 26 байтах нет возможности получить подобную последовательность.
Таким образом, я не нахожу никакого метода в C# для того, чтобы "читать до". Часть кода C#, которую я использую для чтения последовательных данных:

    public static int count;
    public static void Main()
    {
        SerialPort mySerialPort = new SerialPort("COM8");

        mySerialPort.BaudRate = 250000;
        mySerialPort.Parity = Parity.None;
        mySerialPort.StopBits = StopBits.One;
        mySerialPort.DataBits = 8;

        mySerialPort.Handshake = Handshake.None;
        mySerialPort.DtrEnable = true;
        mySerialPort.RtsEnable = true;
        mySerialPort.DataReceived += new SerialDataReceivedEventHandler(DataReceivedHandler);

        mySerialPort.Open();

        count = 0;

        Console.WriteLine("Press any key to continue...");
        Console.WriteLine();

        Console.ReadKey();
        mySerialPort.Close();
    }


    private static void DataReceivedHandler(object sender, SerialDataReceivedEventArgs e)
    {
        SerialPort sp = (SerialPort)sender;
        string indata = sp.ReadExisting();
        count++;
    }

Есть ли другой способ, чтобы получить List<> из 26 интересных байтов? Учитывая, что данные находятся на Arduino, и я могу редактировать код Arduino, и мой Arduino отправляет около 800 байтовых наборов каждую секунду. Код Arduino, если вам интересно, (в данный момент запускается под Arduino Due):

#define MAX_ADC_RESOLUTION 12 

int val;
void setup() {


 Serial.begin(250000);

 analogReadResolution(MAX_ADC_RESOLUTION); //

  adc_init(ADC, SystemCoreClock, ADC_FREQ_MAX*2, 4); //~220000 samples per second, A/D readings OK

val = 0;


}


void loop() {  

 int start = millis();
 int num_samples = 0; //This identify the sample frequency

 while( millis() - start < 1000 )
 {


  for(int channel=0;channel<12;channel++){ //loop for each analog (0-11)

    val = analogRead(channel);
    val++;
    Serial.write((unsigned char)((val & 0xFF00) >> 8));
    Serial.write(((unsigned char)(val & 0x00FF)));    
  }
  Serial.write((unsigned char)((num_samples & 0xFF00) >> 8));
  Serial.write(((unsigned char)(num_samples & 0x00FF)));  
  Serial.write(0xFF);
  Serial.write(0xFF);
  Serial.write(0xFF);
  Serial.write(0xFF);

  num_samples++;
 }


}

Отредактируйте, чтобы лучше объяснить, в чем моя проблема:

Если я установлю просто длину буферизованного чтения, я получу часть входящего потока. Таким образом, конечные байты управления могут быть размещены везде в массиве байтов (например, я обычно получаю 0x44,0x53,...,0xFF,0xFF,0xFF,0xFF,..,0x55). Кроме того, предположим, чтобы получить набор следующим образом: 0x22,...,0x00,0xFF,0xFF,0xFF,0xFF,0xFF. Это возможно, и мое программное обеспечение будет вырезать последний байт.

1 ответ

Почему бы вам не использовать Read вроде как:

byte[] buffer = new byte[30];
sp.Read(buffer, 0, 30);

Таким образом, вы получаете массив байтов и можете проверять значения, которые вам нужны / не нужны.

Другие вопросы по тегам