c++ - parsing complete messages from serial port -


i trying read complete messages gps via serial port.

the message looking starts with:

0xb5 0x62 0x02 0x13 

so read serial port so

while (running !=0) {  int n = read (fd, input_buffer, sizeof input_buffer);    (int i=0; i<buffer_size; i++) {       if (input_buffer[i]==0xb5  && input_buffer[i+1]== 0x62 && input_buffer[i+2]== 0x02 && input_buffer[i+3]== 0x13    && i<(buffer_size-1) )      {               // process message.      }  } 

the problem having need complete message. half of message in buffer 1 iteration. , other half come message next iteration.

somebody suggested free buffer complete message. , move rest of data in buffer beginning of buffer.

how do or other way make sure every complete selected message comes in?

edit// enter image description here

i want particular class , id. can read in length

you can break read 3 parts. find start of message. length. read rest of message.

// should clear these in case data left on previous read input_buffer[0] = input_buffer[1] = 0;  // first make sure first char 0xb5 {     n = read(fd, input_buffer, 1);  } while (0xb5 != input_buffer[0]);  // check 2nd sync char n = read(fd, &input_buffer[1], 1);  if (input_buffer[1] != 0x62) {      // error      return; }  // read length n = read(fd, &input_buffer[2], 4);   // parse length //int length = *((int *)&input_buffer[4]); // since don't know size int on system, way better int length = input_buffer[4] | (input_buffer[5] << 8);  // read rest of message n = read(fd, &input_buffer[6], length);  // input_buffer should have complete message 

you should add error checking...


Comments

Popular posts from this blog

Retrieving ETA (estimated time of arrival) with Google Distance Matrix API and public transit as transport mode -

android - ConstraintLayout: Realign baseline constraint in case if dependent view visibility was set to GONE -

c# - Populating Gridview inside Listview ItemTemplate On Web User Control from Code Behind -