Ты почти у цели. Ваша проблема в том, что данные, которые вы передаете, поступают в виде блоков, которые не совпадают с тем, где начинаются и заканчиваются операторы. Я собираюсь предположить, что end оператора найден 1A-31, который идентифицирует начало следующего оператора. Если это не так, интерпретируйте этот ответ соответствующим образом.
Теперь вы не сможете ничего сделать с самыми первыми фрагментами данных в вашем примере, которые содержат половину утверждения. Итак, давайте начнем с предположения, что первый кусок данных, который вы получаете, действительно начинается с 1A-31.
Теперь есть два варианта:
- Вы можете найти все утверждение внутри фрагмента (то есть вы встретите еще 1A-31 внутри него). В этом случае съешьте его и сделайте с ним все, что вы хотите с ним сделать (я бы добавил событие
StatementReceived
и отправил бы его туда, или что-то в этом роде). Повторяйте это упражнение, пока кусок не будет полностью обработан.
- Заявление не полностью содержится внутри фрагмента. Скопируйте полученные данные во временный буфер и дождитесь следующего вызова
port_DataReceived
.
Если был выбран второй вариант, вы знаете, что данные для следующего port_DataReceived
не будут начинаться с 1A-31 (поскольку временный буфер не пуст). Однако вы можете отсканировать его до конца (до следующего 1А-31), добавить к нему временный буфер (сохраненный в предыдущем вызове port_DataReceived
), повысить StatementReceived
и стереть временный буфер.
С подобным подходом вы также можете иметь дело с выписками, которые требуют отправки более 2 порций данных; каждый раз, когда вы не встречаете 1A-31, добавляйте полученные данные во временный буфер, пока инструкция не будет завершена.
Наконец, если самые первые байты, которые вы читаете при запуске, не начинаются с 1A-31, вам просто нужно их отбросить. Не могу что-то сделать с половиной утверждения.