From: Alan Carvalho de Assis acassis@gmail.com
We cannot send a big chunk of bytes to sercomm_puts because .txready on NuttX doesn't detect when "UART" finished sending data, then data are lost. An work-around to fix it is sending less bytes and putting a delay after each transfer.
Signed-off-by: Alan Carvalho de Assis acassis@gmail.com --- nuttx/drivers/sercomm/console.c | 23 ++++++++++++++++++----- 1 files changed, 18 insertions(+), 5 deletions(-)
diff --git a/nuttx/drivers/sercomm/console.c b/nuttx/drivers/sercomm/console.c index 09ce469..1b96acf 100644 --- a/nuttx/drivers/sercomm/console.c +++ b/nuttx/drivers/sercomm/console.c @@ -106,14 +106,27 @@ static ssize_t sc_console_read(file_t *filep, FAR char *buffer, size_t buflen) }
/* XXX: redirect to old Osmocom-BB comm/sercomm_cons.c -> 2 buffers */ -extern int sercomm_write(void *file, const char *s, const int len); +extern int sercomm_puts(const char *s); static ssize_t sc_console_write(file_t *filep, FAR const char *buffer, size_t buflen) { - int ret = sercomm_write(filep, buffer, buflen); - if(ret < 0) - return ret; + int i, cnt; + char dstbuf[32]; + + if (buflen >= 31) + cnt = 31; else - return buflen; + cnt = buflen; + + memcpy(dstbuf, buffer, cnt); + dstbuf[cnt] = '\0'; + + /* print part of our buffer */ + sercomm_puts(dstbuf); + + /* wait a little bit to get data transfered */ + up_mdelay(1); + + return cnt; }
/* Forward ioctl to uart driver */