c # Последовательный порт Обработка двоичного потока - PullRequest
1 голос
/ 24 октября 2011

У меня есть последовательное устройство с двоичным выходом, и я собираю данные, используя следующее:

        private void port_DataReceived(object sender, SerialDataReceivedEventArgs e)
        {
            int count = sp.BytesToRead;
            byte[] data = new byte[count];
            sp.Read(data, 0, data.Length);
            file.WriteLine(BitConverter.ToString(data));
        }

Данные поступают и выглядят следующим образом ...

06-14-F2-A1-64-2D-62-00-1A-31-00-06-14-F3-84-62-59-01-00-1A-31-00-06-14-F3-85-56-52-55-31
1A-31-00-06-14-F4-18-04-2E-62-00-1A-31-00-06-14-F4-E3-27-5B-01-00-1A-31-00-06-14-F4-E4-1C-51-55-31
1A-31-00-06-14-F5-71-4C-59-71-20-1A-31-00-06-14-F5-8E-A5-2E-62-00-1A-31-00-06-14-F5-F4-47-56-55-31-1A-31-00-06-14-F6-10-1A-1A-31-52-24-1A-31-00-06-14-F6-3D-40-19-70-00-1A-31-00-06-14-F6-3E-9C-4C-55-31-1A-33-00-06-14-F6-F6-11-3D-A0-00-17-B0-C8-4E-42-70-AA-00-00-59-51-1E-1A-31-00-06-14-F7-05-4A-2E-62-00-1A-31-00-06-14-F7-83-5C-56-55-31-1A-31-00-06-14-F7-99-04-5A-01-00-1A-31-00-06-14-F7-99-F8-51-55-31-1A-31-00-06-14-F8-7B-EA-2E-62-00-1A-31-00-06-14-F9-00-CE-56-01-00-1A-31-00-06-14-F9-0E-DF-51-55-31-1A-31-00-06-14-F9-F2-8B-2B-62-00-1A-31-00-06-14-FA-15-1F-1D-05-30-1A-31-00-06-14-FA-62-4D-59-01-00-1A-31-00-06-14-FA-63-41-55-55-31-1A-31-00-06-14-FA-6F-6E-1D-67-67-1A-31-00-06-14-FA-EC-50-2E-72-00-1A-31-00-06-14-FB-22-96-38-62-00-1A-31-00-06-14-FB-3B-7A-40-20-43-1A-31-00-06-14-FB-69-2E-2B-62-00-1A-31-00-06-14-FC-62-F1-2D-72-00-1A-31-00-06-14-FC-DF-D1-2E-62-00-1A-31-00-06

Шестнадцатеричный код здесь не является проблемой, поскольку я могу его расшифровать, но искомое утверждение начинается с 1A-31 , а затем составляет заданное количество байтов.Как вы можете видеть, последовательный поток в этом случае начинает средний поток и поэтому не является полным оператором.

Как я могу найти этот маркер, отменить начало и затем начать обработку.Также имейте в виду, что это произойдет несколько раз, так как readBuffer в какой-то момент урежет поток, и мне нужно будет снова собрать его вместе?

1 Ответ

3 голосов
/ 24 октября 2011

Ты почти у цели. Ваша проблема в том, что данные, которые вы передаете, поступают в виде блоков, которые не совпадают с тем, где начинаются и заканчиваются операторы. Я собираюсь предположить, что end оператора найден 1A-31, который идентифицирует начало следующего оператора. Если это не так, интерпретируйте этот ответ соответствующим образом.

Теперь вы не сможете ничего сделать с самыми первыми фрагментами данных в вашем примере, которые содержат половину утверждения. Итак, давайте начнем с предположения, что первый кусок данных, который вы получаете, действительно начинается с 1A-31.

Теперь есть два варианта:

  • Вы можете найти все утверждение внутри фрагмента (то есть вы встретите еще 1A-31 внутри него). В этом случае съешьте его и сделайте с ним все, что вы хотите с ним сделать (я бы добавил событие StatementReceived и отправил бы его туда, или что-то в этом роде). Повторяйте это упражнение, пока кусок не будет полностью обработан.
  • Заявление не полностью содержится внутри фрагмента. Скопируйте полученные данные во временный буфер и дождитесь следующего вызова port_DataReceived.

Если был выбран второй вариант, вы знаете, что данные для следующего port_DataReceived не будут начинаться с 1A-31 (поскольку временный буфер не пуст). Однако вы можете отсканировать его до конца (до следующего 1А-31), добавить к нему временный буфер (сохраненный в предыдущем вызове port_DataReceived), повысить StatementReceived и стереть временный буфер.

С подобным подходом вы также можете иметь дело с выписками, которые требуют отправки более 2 порций данных; каждый раз, когда вы не встречаете 1A-31, добавляйте полученные данные во временный буфер, пока инструкция не будет завершена.

Наконец, если самые первые байты, которые вы читаете при запуске, не начинаются с 1A-31, вам просто нужно их отбросить. Не могу что-то сделать с половиной утверждения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...