Как обнаружить ошибку байта последовательного бита в классе SerialPort C # - PullRequest
0 голосов
/ 05 ноября 2019

Я использую System.IO.Ports.SerialPort для чтения данных из последовательной связи. Проблема в том, что я хочу определить, какой байт плох, когда я читаю буфер байтового массива и записываю файл. Если я знаю, какой байт плохой, тогда я могу воссоздать правильный файл, так как я знаю хэш файла. Но похоже, что System.IO.Ports.SerialPort только позволяет «перезаписать» ошибочный байт с помощью свойства SerialPort.ParityReplace. Если я читаю массив байтов в миллион, то я не хочу устанавливать битовый шаблон в качестве значения замены, а затем искать этот битовый шаблон в массиве, так как у меня может быть много совпадений. Есть ли способ для меня, чтобы определить, какой байт не прошел проверку четности, когда я читаю буфер байтов? Если нет, то что было бы для меня лучшим способом обнаружения ошибок в стиле четности при отправке файла через последовательный порт?

Приведенный ниже код показывает, как я сейчас смотрю на последовательные данные, но я открыт для других методов, если они быстрее или дают больше надежности.

//... earlier code:
_serialPort.ReadBufferSize = 100000000;
//... more irrelevant code

Thread.Sleep(150000); // wait for 150 seconds for the data to come in.
byte[] HundredKBBuffer = new byte[_serialPort.ReadBufferSize]; // the byte array I'll read from
//read data then discard buffer to get new data from the transmitting machine
_serialPort.Read(HundredKBBuffer, 0, HundredKBBuffer.Length);
_serialPort.DiscardInBuffer();
Console.WriteLine("data received");
//code that reads the byte array, looks for header and trailer and writes file
findHeadAndWriteDataToFile(HundredKBBuffer);

Ответы [ 2 ]

1 голос
/ 05 ноября 2019

Вы пытались читать данные асинхронно в виде потока вместо ожидания, чтобы получить весь блок сразу? Похоже, это даст вам больше возможностей для проверки ошибок.

Как правильно читать последовательный порт, используя .NET Framework?

0 голосов
/ 05 ноября 2019

Первая идея для вас - проверка четности после каждого байта, но вы можете потерять скорость обмена данными (1 байт данных, 1 байт проверки четности).

Вы можете использовать код CRC, который похож на расширениепроверки четности. Например, вы отправляете 8 байтов, а девятый - CRC. Это позволяет вам контролировать данные для указанного размера пакета. Функция CRC выглядит следующим образом (это функция CRC-8, но вы можете использовать другую):

private byte CRC8(byte[] Array, int length)
    {
        byte CRC = 0x00;
        int length_buffer = length;
        int length_refreshed = length;
        CRC = Array[0];
        length_refreshed--; ;
        for (; length_refreshed > 0; length_refreshed--)
        {
            CRC = (byte)(((int)CRC) ^ (int)Array[length_buffer - length_refreshed]);
        }

        return CRC;
    }

EDIT Проверьте здесь для CRC: https://en.wikipedia.org/wiki/Cyclic_redundancy_check

...