На встроенной системе я хотел бы проанализировать данные, поступающие через последовательный интерфейс (RS232). Данные поступают по одной строке за раз (строки разделяются \r
символами и через некоторое время) из запатентованного источника. См. Примеры данных ниже.C++ string parsing: как определить конец сообщения?
Что бы я хотел сделать, так это разобрать все сообщений (состоящих из нескольких строк). Как я мог это сделать? Как я могу крючок на каждый полученный символ (они получены через ISR), я думаю, что я мог бы записать полученные данные в std::stringstream
и проанализировать его после получения полного сообщения. Но как можно обнаружить конец такого сообщения?
Пример данные:
...
X20\r
R46 P20 A231 \r
R45 P20 A287 \r
R44 P20 A347 \r
X21\r
R46 P21 A284 \r
R45 P21 A341 \r
R44 P21 A436 \r
X22\r
R46 P22 A319 \r
R45 P22 A386 \r
R44 P22 A455 \r
...
где
X22\r
R46 P22 A319 \r
R45 P22 A386 \r
R44 P22 A455 \r
является примером для одно сообщение. Я забочусь о
например. X = 22
, R46 = 319
, R45 = 386
, R44 = 455
Как я могу различать сообщения в элегантный способ?
1: Данные не гарантированно являются абсолютно однородными ('R46 P22 A5 \ r' против' R46 P22 A5432 \ r'), но я попробую. 2: Ожидание следующего «X» отходов некоторое время (есть задержка между каждыми двумя строками данных) и поэтому не идеальна. – plats1
@ plats1 Вы говорите, что в полном сообщении может быть количество строк? –
@wonkorealtime Сообщение может состоять только из одной строки «X ...» и от одной до четырех строк «R ...» (сообщения в моем примере с тремя строками «R ...»). – plats1