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