- do {
- ret = serial_read_blocking(serial, buf + received,
- count - received, serial_timeout(serial, count));
- if (ret < 0) {
- sr_err("Error %d reading %d bytes.", ret, count);
- return ret;
+ int ret;
+ gboolean message_complete = FALSE;
+ int message_length = 0;
+ unsigned int turn = 0;
+ const unsigned int TURNS = 200;
+ buf[message_length] = 0;
+ // try to read data
+ while (!message_complete && turn < TURNS) {
+ // wait for header byte
+ message_length = 0;
+ while (MSG_FRAME_BEGIN != buf[0] && turn < 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 (1 == ret) {
+ if (MSG_FRAME_BEGIN != buf[message_length]) {
+ 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 (MSG_FRAME_END != buf[message_length - 1] && message_length < length && turn < 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 (1 == ret) {
+ if (MSG_FRAME_BEGIN == buf[message_length]) {
+ 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 < TURNS) {
+ if (MSG_FRAME_END == buf[message_length - 1]) {
+ message_complete = TRUE;
+ sr_dbg("Message end received");
+ } else {
+ sr_warn("Frame end not received");
+ }
+ } else {
+ sr_warn("Invalid data and timeout");