From 4c2677100744cfa66d55d5f551523231799a781b Mon Sep 17 00:00:00 2001 From: guowenxue <guowenxue@gmail.com> Date: Thu, 14 Apr 2022 10:08:52 +0800 Subject: [PATCH] Merge branch 'master' of ssh://master.iot-yun.club:2280/framwork --- booster/comport.c | 101 ++++++++++++++++++++++++++++++-------------------- 1 files changed, 61 insertions(+), 40 deletions(-) diff --git a/booster/comport.c b/booster/comport.c index 30e814d..8f45e45 100644 --- a/booster/comport.c +++ b/booster/comport.c @@ -1,5 +1,5 @@ /********************************************************************************* - * Copyright: (C) 2018 LingYun IoT System Studio + * Copyright: (C) 2018 Guo Wenxue <guowenxue@gmail.com> * All rights reserved. * * Filename: cp_comport.c @@ -171,12 +171,53 @@ /* Set baudrate */ switch (comport->baudrate) { + /* Upper is not POSIX(bits/termios-baud.h) */ + case 4000000: + tmp = B4000000; + break; + case 3500000: + tmp = B3500000; + break; + case 3000000: + tmp = B3000000; + break; + case 2500000: + tmp = B2500000; + break; + case 2000000: + tmp = B2000000; + break; + case 1500000: + tmp = B1500000; + break; + case 1152000: + tmp = B1152000; + break; + case 1000000: + tmp = B1000000; + break; + case 921600: + tmp = B921600; + break; + case 576000: + tmp = B576000; + break; + case 500000: + tmp = B500000; + break; + case 460800: + tmp = B460800; + break; + case 230400: + tmp = B230400; + break; case 115200: tmp = B115200; break; case 57600: tmp = B57600; break; + /* Below is POSIX(bits/termios.h) */ case 38400: tmp = B38400; break; @@ -281,7 +322,7 @@ int comport_send(comport_t *comport, char *buf, int send_bytes) { int rv = 0; - char *ptr, *end; + char *ptr, left_bytes; int send = 0; if ( !comport || !buf || send_bytes<=0 ) @@ -300,48 +341,28 @@ //printf("Send %s with %d bytes.\n", buf, send_bytes); - // Large data, then slice them and send - if (comport->frag_size < send_bytes) - { - ptr = buf; - end = buf + send_bytes; - do - { - // Large than frag_size - if (comport->frag_size < (end - ptr)) - { - send = write(comport->fd, ptr, comport->frag_size); - if (0 >= send || comport->frag_size != send) - { - rv = -4; - goto CleanUp; - } - ptr += comport->frag_size; - } - else // Less than frag_size, maybe last fragmention. - { - send = write(comport->fd, ptr, (end - ptr)); - if (0 >= send || (end - ptr) != send) - { - rv = -4; - goto CleanUp; - } - ptr += (end - ptr); - } - } - while (ptr < end); - } - else // The send data is not large than a fragmention. + left_bytes = send_bytes; + ptr = buf; + + while( left_bytes > 0 ) { - send = write(comport->fd, buf, send_bytes); - if (0 >= send || send_bytes != send) - { - rv = -5; - goto CleanUp; - } + /* Large data, then slice them to frag and send */ + send = left_bytes>comport->frag_size ? comport->frag_size : left_bytes; + + rv = write(comport->fd, ptr, send); + if( rv<0 ) + { + rv = -4; + goto CleanUp; + } + + left_bytes -= rv; + ptr += rv; } + rv = 0; + CleanUp: return rv; } -- Gitblit v1.9.1