То, как большинство систем делают это при работе с сегментами данных переменной длины, заключается в том, что в первом проходящем пакете есть что-то уникальное, что уведомляет принимающий драйвер о том, что он состоит из двух частей. Например, это может быть просто MSB (старший значащий бит), установленный или не установленный в первом пакете, где 0 может означать, что второго пакета нет, а 1 может означать, что существует второй пакет. Тогда нужно просто замаскировать его, когда вы его получите, и вызвать функцию для получения второй части, или установить флаг, что вторая часть должна быть получена, и что это НЕ новый пакет.
Что касается области видимости, я немного туманен в отношении того, что вы спрашиваете, но на основании приведенного выше кода, если вы объявляете переменные вне цикла, т. Е .:
string hexid;
string oddpart;
string evenpart;
while (serialportopen)
{
}
Они будут поддерживать область действия для нескольких итераций цикла. Лучше делать это независимо от того, что она не будет повторно объявлять переменную каждый раз. Это может или не может быть оптимизировано компилятором.
В противном случае в битовой структуре этого пакета есть что-то уникальное, что уведомляет драйвер о необходимости другого пакета. В этом пакете может быть код операции или поле команды, это может быть просто проблемой маскировки, вызывающей функцию для извлечения и возврата второй части, т. Е.
if ((command & CERTAIN_PACKET) == CERTAIN_PACKET)
odpart = GetSecondPart();
Надеюсь, это вам поможет!