+ message_complete = FALSE;
+ turn = 0;
+ max_turns = 200;
+ message_length = 0;
+ buf[message_length] = 0;
+
+ /* Try to read data. */
+ while (!message_complete && turn < max_turns) {
+ /* Wait for header byte. */
+ message_length = 0;
+ while ((buf[0] != MSG_FRAME_BEGIN) && (turn < max_turns)) {
+ ret = serial_read_blocking(serial, &buf[0], 1, serial_timeout(serial, 1));
+ if (ret < 0) {
+ sr_err("Error %d reading byte.", ret);
+ return ret;
+ } else if (ret == 1) {
+ if (buf[message_length] != MSG_FRAME_BEGIN) {
+ sr_warn("Not frame begin byte %02x received",
+ buf[message_length]);
+ } else {
+ sr_dbg("Message header received: %02x",
+ buf[message_length]);
+ message_length += ret;
+ }
+ }
+ turn++;
+ }
+ /* Read until end byte. */
+ while ((buf[message_length - 1] != MSG_FRAME_END)
+ && (message_length < length) && (turn < max_turns)) {
+
+ ret = serial_read_blocking(serial, &buf[message_length], 1, serial_timeout(serial, 1));
+ if (ret < 0) {
+ sr_err("Error %d reading byte.", ret);
+ return ret;
+ } else if (ret == 1) {
+ if (buf[message_length] == MSG_FRAME_BEGIN) {
+ sr_warn("Frame begin before end received");
+ message_length = 1;
+ } else {
+ sr_dbg("Message data received: %02x",
+ buf[message_length]);
+ message_length += ret;
+ }
+ }
+ turn++;
+ }
+ /* Verify frame. */
+ if (turn < max_turns) {
+ if (buf[message_length - 1] == MSG_FRAME_END) {
+ message_complete = TRUE;
+ sr_dbg("Message end received");
+ } else {
+ sr_warn("Frame end not received");
+ }
+ } else {
+ sr_warn("Invalid data and timeout");
+ }
+ }