From 88f97efda31375035df12a17d2b261b90df1594c Mon Sep 17 00:00:00 2001 From: Anders Blomdell <anders.blomdell@control.lth.se> Date: Wed, 31 Mar 2021 16:32:36 +0200 Subject: [PATCH] Ignore `get bit 31`, used as event_char for FTDI USB/serial adaptors --- plugins/serial2002/serial2002_lib.c | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/plugins/serial2002/serial2002_lib.c b/plugins/serial2002/serial2002_lib.c index 72db13f..41359e8 100644 --- a/plugins/serial2002/serial2002_lib.c +++ b/plugins/serial2002/serial2002_lib.c @@ -91,7 +91,7 @@ struct moberg_status serial2002_read(int f, long timeout, value->index = 0; value->value = 0; length = 0; - while (1) { + while (value->kind == is_invalid) { unsigned char data; struct moberg_status result = tty_read(f, timeout, &data); if (! OK(result)) { @@ -106,6 +106,7 @@ struct moberg_status serial2002_read(int f, long timeout, return MOBERG_ERRNO(EFBIG); break; } else { + value->index = data & 0x1f; if (length == 1) { switch ((data >> 5) & 0x03) { case 0:{ @@ -116,13 +117,25 @@ struct moberg_status serial2002_read(int f, long timeout, value->value = 1; value->kind = is_digital; } break; + case 2:{ + if (data == 0x5f) { + /* Ignore FTDI USB/serial event character (get bit 31) */ + value->kind = is_invalid; + value->index = 0; + value->value = 0; + length = 0; + } else { + return MOBERG_ERRNO(EINVAL); + } + } break; + case 3:{ + return MOBERG_ERRNO(EINVAL); + } break; } } else { value->value = (value->value << 2) | ((data & 0x60) >> 5); value->kind = is_channel; } - value->index = data & 0x1f; - break; } } return MOBERG_OK; -- GitLab