+ return send_cmd(serial, stop, 10);
+}
+
+/**
+ * Receive a complete message.
+ *
+ * @param[in] serial Serial port from which to read the packet
+ * @param[in] length Buffer length
+ * @param[out] buf Buffer to write packet to
+ *
+ * @return packet length (0 = timeout, -1 = error)
+ */
+SR_PRIV int ebd_read_message(struct sr_serial_dev_inst *serial, size_t length,
+ uint8_t *buf)
+{
+ int ret;
+ gboolean message_complete;
+ size_t turn, max_turns;
+ size_t message_length;
+
+ /* Check parameters. */
+ if (serial == NULL) {
+ sr_err("Serial device to receive packet missing.");
+ return -1;
+ }
+ if (length < 3) {
+ sr_err("Packet buffer not large enough.");
+ return -1;
+ }
+ if (buf == NULL) {
+ sr_err("Packet buffer missing.");
+ return -1;
+ }
+
+ 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");
+ }