From fea9eefde499e94fccd248cb40b347c44a8fd5e8 Mon Sep 17 00:00:00 2001
From: Guo Wenxue <guowenxue@gmail.com>
Date: Mon, 29 Jun 2020 13:40:47 +0800
Subject: [PATCH] update comport program

---
 apue/5.Comport/comport.h      |  102 +++++++++-------
 apue/5.Comport/comport_main.c |   14 +-
 apue/5.Comport/comport.c      |  191 +++++++++++++++----------------
 3 files changed, 154 insertions(+), 153 deletions(-)

diff --git a/apue/5.Comport/comport.c b/apue/5.Comport/comport.c
index b541f04..237b9cd 100644
--- a/apue/5.Comport/comport.c
+++ b/apue/5.Comport/comport.c
@@ -1,39 +1,40 @@
 /*  ********************************************************************************
- *      Copyright:  (C) 2018 LingYun IoT System Studio
+ *      Copyright:  (C) 2020 LingYun IoT System Studio
  *                  All rights reserved.
  *
  *       Filename:  cp_comport.c
  *    Description:  It's the comport operate library.
  *                  
- *        Version:  2.0.0(10/17/2018~)
+ *        Version:  1.0.0(6/29/2018~)
  *         Author:  Guo Wenxue <guowenxue@gmail.com>
- *      ChangeLog:  1, Release initial version on "10/17/2018 03:33:25 PM"
+ *      ChangeLog:  1, Release initial version on "6/29/2018 03:33:25 PM"
  *                  
  ********************************************************************************/
 
 #include    "comport.h"
 
-#ifdef  COM_DEBUG
-void disp_settings(comport_t *comport);
-#endif
-
 void set_settings(comport_t * comport, const char *settings);
 
 /**************************************************************************************
- *  Description: Set the comport structure
- *   Input Args: dev_name:  The comport device name path, such as '/dev/ttyS3'
+ *  Description: initialise the comport structure
+ *
+ *   Input Args: 
+ *                comport:  The comport work context pointer 
+ *               dev_name:  The comport device name path, such as '/dev/ttyS3'
  *               baudrate:  The baudrate, such as 115200
  *               settings:  The databit,parity,stopbit,flowctrl settings, such as '8N1N'
- *  Output Args: NONE
- * Return Value: The comport_t structure pointer.
+ *
+ * Return Value: 0: Successfully      <0: Failure
+ *
  *************************************************************************************/
-comport_t *comport_init(const char *dev_name, int baudrate, const char *settings)
+int comport_init(comport_t *comport, const char *dev_name, int baudrate, const char *settings)
 {
-    comport_t *comport = NULL;
-    if (NULL == (comport = (comport_t *) malloc(sizeof(comport_t))))
+    if( !comport )
     {
-        return NULL;
+        COM_PRINT("Invalid input arugments in %s().\n", __FUNCTION__);
+        return -1;
     }
+        
     memset(comport, 0, sizeof(comport_t));
     comport->frag_size = 128;
 
@@ -41,16 +42,27 @@
     comport->baudrate = baudrate;
 
     set_settings(comport, settings);
+
 #ifdef  COM_DEBUG
     disp_settings(comport);
 #endif
 
-    return comport;
+    return 0;
 }
 
+/*+-----------------------------------------------------------------------------------------+
+ *  description: display current comport settings such as databit,parity,stopbit,flowctrl
+ *   input args: $comport:  corresponding comport point 
+ *+-----------------------------------------------------------------------------------------+*/
 #ifdef  COM_DEBUG
 void disp_settings(comport_t *comport)
 {
+    if( !comport)
+    {
+        COM_PRINT("Invalid input arugments in %s().\n", __FUNCTION__);
+        return ;
+    }
+
     COM_PRINT("Device:\t\t\t\"%s\"\n", comport->dev_name);
     COM_PRINT("Baudrate:\t\t%ld\n", comport->baudrate);
     COM_PRINT("DataBit:\t\t\'%d\'\n", comport->databit);
@@ -100,8 +112,11 @@
  *************************************************************************************/
 void set_settings(comport_t * comport, const char *settings)
 {
-    if(NULL==settings || NULL==comport)
+    if( !settings || !comport)
+    {
+        COM_PRINT("Invalid input arugments in %s().\n", __FUNCTION__);
         return ;
+    }
 
     switch (settings[0])        /* data bit */
     {
@@ -179,31 +194,18 @@
     comport->fd = -1;
 }
 
-void comport_term(comport_t * comport)
-{
-    if(NULL == comport)
-        return;
-
-    if ( comport->fd > 0 )
-    {
-        comport_close(comport);
-    }
-
-    memset(comport, 0x00, sizeof(comport_t)); 
-    free(comport);
-
-    return;
-}
-
 int comport_open(comport_t * comport)
 {
-    int retval = -1;
+    int rv = -1;
     struct termios old_cfg, new_cfg;
     int old_flags;
     long tmp;
 
-    if(NULL==comport)
+    if( !comport )
+    {
+        COM_PRINT("Invalid input arugments in %s().\n", __FUNCTION__);
         return -1;
+    }
 
     comport_close(comport);
 
@@ -212,14 +214,14 @@
     {
         COM_PRINT("Open Not tty device \"%s\"\n", comport->dev_name);
         comport->fd = open(comport->dev_name, O_RDWR);
-        retval = comport->fd<0 ? -2 : comport->fd;
+        rv = comport->fd<0 ? -2 : comport->fd;
         goto CleanUp;
     }
 
     comport->fd = open(comport->dev_name, O_RDWR | O_NOCTTY | O_NONBLOCK);
     if (comport->fd < 0)
     {
-        retval = -3;
+        rv = -3;
         goto CleanUp;
     }
     COM_PRINT("Open device \"%s\"\n", comport->dev_name);
@@ -230,19 +232,19 @@
         // Flush input and output
         if (-1 == tcflush(comport->fd, TCIOFLUSH))
         {
-            retval = -4;
+            rv = -4;
             goto CleanUp;
         }
     }
     else                        // Failure
     {
-        retval = -5;
+        rv = -5;
         goto CleanUp;
     }
 
     if (0 != tcgetattr(comport->fd, &old_cfg))
     {
-        retval = -6;          // Failed to get Com settings  
+        rv = -6;          // Failed to get Com settings  
         goto CleanUp;
     }
 
@@ -389,38 +391,38 @@
     tcflush(comport->fd, TCIFLUSH);
     if (0 != tcsetattr(comport->fd, TCSANOW, &new_cfg))
     {
-        retval = -7;          // Failed to set device com port settings   
+        rv = -7;          // Failed to set device com port settings   
         goto CleanUp;
     }
 
     COM_PRINT("Connected device \"%s\".\n", comport->dev_name);
 
-    retval = comport->fd;
+    rv = comport->fd;
 
 CleanUp:
-    COM_PRINT("Open device \"%s\" %s.\n", comport->dev_name, retval>0 ? "successfully" : "failure");
-    return retval;
+    COM_PRINT("Open device \"%s\" %s.\n", comport->dev_name, rv>0 ? "successfully" : "failure");
+    return rv;
 }
 
 
 int comport_recv(comport_t * comport, char *buf, int buf_size, unsigned long timeout)
 {
-    int retval = 0;             // Function return value
+    int rv = 0;             // Function return value
     int iRet;
     fd_set stReadFds, stExcpFds;
     struct timeval stTime;
 
-    if (NULL == buf || 0 >= buf_size)
+    if ( !buf || buf_size<0 )
     {
-        COM_PRINT("%s() usage error.\n", __FUNCTION__);
-        retval = -1;
+        COM_PRINT("Invalid input arugments in %s().\n", __FUNCTION__);
+        rv = -1;
         goto CleanUp;
     }
 
     if ( comport->fd < 0 )
     {
         COM_PRINT("%s() comport not connected.\n", __FUNCTION__);
-        retval = -2;
+        rv = -2;
         goto CleanUp;
     }
 
@@ -439,21 +441,21 @@
         iRet = select(comport->fd + 1, &stReadFds, 0, &stExcpFds, &stTime);
         if (0 == iRet)
         {
-            retval = 0;         // No data in Com port buffer
+            rv = 0;         // No data in Com port buffer
             goto CleanUp;
         }
         else if (0 < iRet)
         {
             if (0 != FD_ISSET(comport->fd, &stExcpFds))
             {
-                retval = -6;  // Error during checking recv status    
+                rv = -6;  // Error during checking recv status    
                 COM_PRINT("Error checking recv status.\n");
                 goto CleanUp;
             }
 
             if (0 == FD_ISSET(comport->fd, &stReadFds))
             {
-                retval = 0;  // No incoming data 
+                rv = 0;  // No incoming data 
                 COM_PRINT("No incoming data.\n");
                 goto CleanUp;
             }
@@ -463,12 +465,12 @@
             if (EINTR == errno)
             {
                 COM_PRINT("catch interrupt signal.\n");
-                retval = 0;  // Interrupted signal catched
+                rv = 0;  // Interrupted signal catched
             }
             else
             {
                 COM_PRINT("Check recv status failure.\n");
-                retval = -7;  // Error during checking recv status
+                rv = -7;  // Error during checking recv status
             }
 
             goto CleanUp;
@@ -482,9 +484,9 @@
     if (0 > iRet)
     {
         if (EINTR == errno)
-            retval = 0;      // Interrupted signal catched
+            rv = 0;      // Interrupted signal catched
         else
-            retval = -3;      // Failed to read Com port
+            rv = -3;      // Failed to read Com port
 
         goto CleanUp;
     }
@@ -501,78 +503,69 @@
     }
 #endif
 
-    retval = iRet;
+    rv = iRet;
 
   CleanUp:
-    return retval;
-
+    return rv;
 }
 
-int comport_send(comport_t * comport, char *buf, int send_bytes)
+int comport_send(comport_t * comport, char *buf, int bytes)
 {
-    char *ptr, *end;
-    int retval = 0;
-    int send = 0;
+    int             i; 
+    int             left_bytes;
+    int             rv = 0;
 
-    if (NULL == buf || 0 >= send_bytes)
+    if( !buf || bytes<=0 )
     {
-        COM_PRINT("%s() Usage error.\n", __FUNCTION__);
-        retval = -1;
+        COM_PRINT("Invalid input arugments in %s().\n", __FUNCTION__);
+        rv = -1;
         goto CleanUp;
     }
 
-    if ( comport->fd < 0 )    // Comport not opened ?
+    if( comport->fd<0 )    // Comport not opened ?
     {
-        retval = -3;
-        COM_PRINT("Serail not connected.\n");
+        rv = -3;
+        COM_PRINT("Serail port not connected.\n");
         goto CleanUp;
     }
 
-    //printf("Send %s with %d bytes.\n", buf, send_bytes);
+    //printf("Send %s with %d bytes.\n", buf, bytes);
 
     // Large data, then slice them and send
-    if (comport->frag_size < send_bytes)
+    if (bytes > comport->frag_size )
     {
-        ptr = buf;
-        end = buf + send_bytes;
+        i = 0;
+        left_bytes = bytes;
 
-        do
+        while( left_bytes >= 0 )
         {
-            // Large than frag_size
-            if (comport->frag_size < (end - ptr))
+            if( left_bytes > comport->frag_size )
+                rv = write(comport->fd, &buf[i], comport->frag_size);
+            else
+                rv = write(comport->fd, &buf[i], left_bytes);
+
+            if( rv < 0 )
             {
-                send = write(comport->fd, ptr, comport->frag_size);
-                if (0 >= send || comport->frag_size != send)
-                {
-                    retval = -4;
-                    goto CleanUp;
-                }
-                ptr += comport->frag_size;
+                rv = -4;
+                goto CleanUp;
             }
-            else                // Less than frag_size, maybe last fragmention.
-            {
-                send = write(comport->fd, ptr, (end - ptr));
-                if (0 >= send || (end - ptr) != send)
-                {
-                    retval = -4;
-                    goto CleanUp;
-                }
-                ptr += (end - ptr);
-            }
+
+            i += rv;
+            left_bytes -= rv; 
         }
-        while (ptr < end);
     }
-    else                        // The send data is not large than a fragmention.
+    /* The send data is not large than a fragmention, send in one time. */
+    else    
     {
-        send = write(comport->fd, buf, send_bytes);
-        if (0 >= send || send_bytes != send)
+        rv = write(comport->fd, buf, bytes);
+        if ( rv<=0 || rv!=bytes )
         {
-            retval = -5;
+            rv = -5;
             goto CleanUp;
         }
     }
 
   CleanUp:
-    return retval;
+    return rv;
 }
 
diff --git a/apue/5.Comport/comport.h b/apue/5.Comport/comport.h
index 9339836..6088592 100644
--- a/apue/5.Comport/comport.h
+++ b/apue/5.Comport/comport.h
@@ -1,13 +1,13 @@
 /*********************************************************************************
- *      Copyright:  (C) 2018 LingYun IoT System Studio
+ *      Copyright:  (C) 2020 LingYun IoT System Studio
  *                  All rights reserved.
  *
  *       Filename:  comport.h
  *    Description:  This head file is for the common TTY/Serial port operator library 
  *                   
- *        Version:  1.0.0(10/17/2018~)
+ *        Version:  1.0.0(06/29/2020~)
  *         Author:  Guo Wenxue <guowenxue@gmail.com>
- *      ChangeLog:  1, Release initial version on "10/17/2018 03:33:25 PM"
+ *      ChangeLog:  1, Release initial version on "06/29/2020 03:33:25 PM"
  *                     
  ********************************************************************************/
 #ifndef  __COMPORT_H_
@@ -27,8 +27,6 @@
 #include  <sys/stat.h>
 #include  <sys/select.h>
 
-#define BUF_64  64
-
 #ifndef DEVNAME_LEN
 #define DEVNAME_LEN          64
 #endif
@@ -40,67 +38,77 @@
 #define COM_PRINT(format,args...) do{} while(0);
 #endif
 
-//#define msleep(m)               {struct timespec cSleep; cSleep.tv_sec = 0; cSleep.tv_nsec = m * 1000; nanosleep(&cSleep, 0);}
-
 typedef struct comport_s
 {
-    char           dev_name[DEVNAME_LEN];
-    unsigned char  databit, parity, stopbit, flowctrl;
-    long           baudrate;
-
     int            fd;
-    int            frag_size;
+    char           dev_name[DEVNAME_LEN];
+
+    long           baudrate;
+    unsigned char  databit;
+    unsigned char  parity; 
+    unsigned char  stopbit;
+    unsigned char  flowctrl;
+
+    int            frag_size;  
 } comport_t;
 
-/*
- *  description: initialise the comport structure
+
+/*+-----------------------------------------------------------------------------------------+
+ *  description: Initialise the comport structure
  *
- *   input args: $dev_name:  The comport device name path, such as '/dev/ttyS3'
+ *   input args: 
+ *                $comport:  The comport work context pointer
+ *               $dev_name:  The comport device name path, such as '/dev/ttyS3'
  *               $baudrate:  The baudrate, such as 115200
  *               $settings:  The databit,parity,stopbit,flowctrl settings, such as '8N1N'
  *
- * return value: The comport_t structure pointer, NULL means failure.
- */
-  
-comport_t *comport_init(const char *dev_name, int baudrate, const char *settings);
+ * return value: 0: Successfully      <0: Failure
+ *+-----------------------------------------------------------------------------------------+*/
+int comport_init(comport_t *comport, const char *dev_name, int baudrate, const char *settings);
 
 
-/* 
- *  description: Open the comport specified by $comport
- *   input args: $comport:  corresponding comport point 
- * return value: The comport opened file description, <0 means failure
- */
-extern int  comport_open(comport_t * comport);
 
-/*
- *  description: read data from $comport in $timeout <ms> to $buf no more than $buf_size bytes
- * return value: the actual read data bytes, <0: read failure
- */
-extern int  comport_recv(comport_t * comport, char *buf, int buf_size, unsigned long timeout);
-
-/*
- *  description: write $send_bytes bytes data from $buf to $comport
- * return value: 0: write ok  <0: write failure
- */
-extern int  comport_send(comport_t * comport, char *buf, int send_bytes);
-
-/*
+/*+-----------------------------------------------------------------------------------------+
  *  description: display current comport settings such as databit,parity,stopbit,flowctrl
  *   input args: $comport:  corresponding comport point 
- */
-//extern void disp_settings(comport_t * comport);
+ *+-----------------------------------------------------------------------------------------+*/
+#ifdef COM_DEBUG
+extern void disp_settings(comport_t * comport);
+#endif
 
-/*
+
+
+/*+-----------------------------------------------------------------------------------------+
+ *  description: Open the comport specified by $comport
+ *   input args: $comport: comport work context
+ * return value: >0: The comport opened file description, <0: Failure
+ *+-----------------------------------------------------------------------------------------+*/
+extern int comport_open(comport_t * comport);
+
+
+
+/*+-----------------------------------------------------------------------------------------+
  *  description: close comport 
  *   input args: $comport:  corresponding comport point 
- */
+ *+-----------------------------------------------------------------------------------------+*/
 extern void comport_close(comport_t * comport);
 
 
-/*
- *  description: terminat comport, close and free it
- *   input args: $comport:  corresponding comport point 
- */
-extern void comport_term(comport_t * comport);
+
+/*+-----------------------------------------------------------------------------------------+
+ *  description: write $send_bytes bytes data from $buf to $comport
+ * return value: 0: write ok  <0: write failure
+ *+-----------------------------------------------------------------------------------------+*/
+extern int  comport_send(comport_t * comport, char *buf, int send_bytes);
+
+
+
+/*+-----------------------------------------------------------------------------------------+
+ *  description: read data from $comport in $timeout <ms> to $buf, no more than $buf_size bytes
+ * return value: the actual read data bytes, <0: read failure
+ *+-----------------------------------------------------------------------------------------+*/
+extern int  comport_recv(comport_t * comport, char *buf, int buf_size, unsigned long timeout);
+
+
 
 #endif
diff --git a/apue/5.Comport/comport_main.c b/apue/5.Comport/comport_main.c
index cc127af..0ee8424 100644
--- a/apue/5.Comport/comport_main.c
+++ b/apue/5.Comport/comport_main.c
@@ -38,7 +38,7 @@
     char *settings = "8N1N";
     char buf[512];
     unsigned char disp_mode = 0x00;
-    comport_t *comport = NULL;
+    comport_t     comport;
 
     struct sigaction sigact;
 
@@ -96,13 +96,13 @@
         return 0;
     }
 
-    if (NULL == (comport = comport_init(dev_name, baudrate, settings)))
+    if ( comport_init(&comport, dev_name, baudrate, settings) < 0 ) 
     {
         printf("Comport initialize failure.\n");
         return -1;
     }
 
-    if ( (retval=comport_open(comport)) < 0)
+    if ( (retval=comport_open(&comport)) < 0)
     {
         printf("Failed to open %s with baudrate %d, %s. RetCode [%d]\n", dev_name, baudrate,
                settings, retval);
@@ -124,7 +124,7 @@
 
     while (0x01 == g_ucProcToken)
     {
-        recv_size = comport_recv(comport, buf, sizeof(buf) - 1, 10);
+        recv_size = comport_recv(&comport, buf, sizeof(buf) - 1, 10);
         if (recv_size > 0)
         {
             for (i = 0; i < recv_size; i++)
@@ -149,17 +149,17 @@
                 buf[0] = retval;
             }
 
-            comport_send(comport, buf, 1);
+            comport_send(&comport, buf, 1);
         }
         else if (0x00 != g_ucCtrlZ)
         {
             g_ucCtrlZ = 0x00;
             buf[0] = 0x1A;
-            comport_send(comport, buf, 1);
+            comport_send(&comport, buf, 1);
         }
     }
 
-    comport_term(comport);
+    comport_close(&comport);
     return 0;
 }                               /* ----- End of main() ----- */
 

--
Gitblit v1.9.1