2015-05-07 2 views
0

На встроенной системе я хотел бы проанализировать данные, поступающие через последовательный интерфейс (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

Как я могу различать сообщения в элегантный способ?

ответ

0

В зависимости от того, какие ограничения у вас есть из-за того, что вы являетесь встроенной системой и какие гарантии у вас есть на полученных данных (которые, как представляется, не имеют завершающего символа для сообщения), вероятно, будут лучшие решения, но мои два предложения будут :

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

2/Прочитайте один символ за раз, сохранив их в буфере. Когда вы читаете «X» (который, кажется, является символом, сигнализирующим о начале нового сообщения) просто разбирайте буфер, пустите его, храните «X», а затем продолжайте движение.

+0

1: Данные не гарантированно являются абсолютно однородными ('R46 P22 A5 \ r' против' R46 P22 A5432 \ r'), но я попробую. 2: Ожидание следующего «X» отходов некоторое время (есть задержка между каждыми двумя строками данных) и поэтому не идеальна. – plats1

+0

@ plats1 Вы говорите, что в полном сообщении может быть количество строк? –

+0

@wonkorealtime Сообщение может состоять только из одной строки «X ...» и от одной до четырех строк «R ...» (сообщения в моем примере с тремя строками «R ...»). – plats1