From 9ada9cdc52c22fabb658680d3869d3ab6ab87f61 Mon Sep 17 00:00:00 2001
From: guowenxue <guowenxue@gmail.com>
Date: Mon, 19 Aug 2024 10:26:57 +0800
Subject: [PATCH] update booster from booster project
---
booster/comport.c | 402 ++++++++++++++++++++++++---------------------------------
1 files changed, 169 insertions(+), 233 deletions(-)
diff --git a/booster/comport.c b/booster/comport.c
index 30e814d..4a31278 100644
--- a/booster/comport.c
+++ b/booster/comport.c
@@ -1,30 +1,39 @@
/*********************************************************************************
- * Copyright: (C) 2018 LingYun IoT System Studio
+ * Copyright: (C) 2023 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~)
+ * Filename: comport.c
+ * Description: This file is linux comport common API functions
+ *
+ * Version: 1.0.0(11/08/23)
* 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 "11/08/23 16:18:43"
+ *
********************************************************************************/
-#include "comport.h"
+#include "comport.h"
-static void set_settings(comport_t *comport, const char *settings);
+#define CONFIG_PRINT_LOGGER
+//#define CONFIG_PRINT_STDOUT
-#ifdef COM_DEBUG
-void disp_settings(comport_t *comport);
+#if ( defined CONFIG_PRINT_LOGGER )
+#include "logger.h"
+#define dbg_print(format,args...) log_error(format, ##args)
+
+#elif ( defined CONFIG_PRINT_STDOUT )
+#define dbg_print(format,args...) printf(format, ##args)
+
+#else
+#define dbg_print(format,args...) do{} while(0);
#endif
+static inline void set_settings(comport_t * comport, const char *settings);
-/*
+/*
* description: Open the serial port
*
- * input args: $comport: corresponding comport point
+ * input args: $comport: corresponding comport point
* $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'
@@ -40,64 +49,58 @@
if( !comport || !devname )
{
- COM_PRINT("%s() get invalid input arguments.\n", __FUNCTION__);
+ dbg_print("invalid input arugments\n");
return -1;
}
+ /*+-----------------------+
+ *| open the serial port |
+ *+-----------------------+*/
+
memset(comport, 0, sizeof(*comport));
- strncpy(comport->devname, devname, DEVNAME_LEN);
+ strncpy(comport->devname, devname, sizeof(comport->devname));
comport->baudrate = baudrate;
comport->fd = -1;
- comport->frag_size = 128;
-
+ comport->fragsize = CONFIG_DEF_FRAGSIZE;
set_settings(comport, settings);
-#ifdef COM_DEBUG
- disp_settings(comport);
-#endif
- /* Not a TTY device */
- if( !strstr(comport->devname, "tty"))
+ if( !strstr(comport->devname, "tty") )
{
- COM_PRINT("Open Not tty device \"%s\"\n", comport->devname);
+ dbg_print("comport device \"%s\" is not tty device\n", comport->devname);
return -2;
}
comport->fd = open(comport->devname, O_RDWR | O_NOCTTY | O_NONBLOCK);
- if (comport->fd < 0)
+ if( comport->fd<0 )
{
- rv = -3;
- goto CleanUp;
+ dbg_print("comport open \"%s\" failed:%s\n", comport->devname, strerror(errno));
+ return -3;
}
- COM_PRINT("Open device \"%s\"\n", comport->devname);
- if ((-1 != (old_flags = fcntl(comport->fd, F_GETFL, 0)))
- && (-1 != fcntl(comport->fd, F_SETFL, old_flags & ~O_NONBLOCK)))
+ if( (-1 != (old_flags = fcntl(comport->fd, F_GETFL, 0)))
+ && (-1 != fcntl(comport->fd, F_SETFL, old_flags & ~O_NONBLOCK)) )
{
/* Flush input and output */
- if (-1 == tcflush(comport->fd, TCIOFLUSH))
- {
- rv = -4;
- goto CleanUp;
- }
+ tcflush(comport->fd, TCIOFLUSH);
}
- else
+ else
{
- rv = -5;
+ rv = -4;
goto CleanUp;
}
if (0 != tcgetattr(comport->fd, &old_cfg))
{
- rv = -6; // Failed to get Com settings
+ rv = -5;
goto CleanUp;
}
+
+ /*+-----------------------+
+ *| configure serial port |
+ *+-----------------------+*/
+
memset(&new_cfg, 0, sizeof(new_cfg));
-
- /*=====================================*/
- /* Configure comport */
- /*=====================================*/
-
new_cfg.c_cflag &= ~CSIZE;
new_cfg.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG);
new_cfg.c_iflag &= ~(BRKINT | ICRNL | INPCK | ISTRIP | IXON);
@@ -123,11 +126,11 @@
/* Set the parity */
switch (comport->parity)
{
- case 0x01: // Odd
+ case 0x01: /* Odd */
new_cfg.c_cflag |= (PARENB | PARODD);
new_cfg.c_cflag |= (INPCK | ISTRIP);
break;
- case 0x02: // Even
+ case 0x02: /* Even */
new_cfg.c_cflag |= PARENB;
new_cfg.c_cflag &= ~PARODD;;
new_cfg.c_cflag |= (INPCK | ISTRIP);
@@ -153,16 +156,16 @@
/* Set flow control */
switch (comport->flowctrl)
{
- case 1: // Software control
+ case 1: /* Software control */
case 3:
new_cfg.c_cflag &= ~(CRTSCTS);
new_cfg.c_iflag |= (IXON | IXOFF);
break;
- case 2: // Hardware control
- new_cfg.c_cflag |= CRTSCTS; // Also called CRTSCTS
+ case 2: /* Hardware control */
+ new_cfg.c_cflag |= CRTSCTS;
new_cfg.c_iflag &= ~(IXON | IXOFF);
break;
- default: // NONE
+ default: /* NONE */
new_cfg.c_cflag &= ~(CRTSCTS);
new_cfg.c_iflag &= ~(IXON | IXOFF);
break;
@@ -171,12 +174,54 @@
/* 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;
@@ -235,37 +280,32 @@
tcflush(comport->fd, TCIFLUSH);
if (0 != tcsetattr(comport->fd, TCSANOW, &new_cfg))
{
- rv = -7; // Failed to set device com port settings
+ rv = -6; // Failed to set device com port settings
goto CleanUp;
}
-
- COM_PRINT("Connected device \"%s\".\n", comport->devname);
rv = comport->fd;
CleanUp:
- COM_PRINT("Open device \"%s\" %s.\n", comport->devname, rv>0 ? "successfully" : "failure");
return rv;
}
-
/*
- * description: close comport
- * input args: $comport: corresponding comport point
+ * description: close comport
+ * input args: $comport: corresponding comport point
*/
void comport_close(comport_t *comport)
{
if( !comport )
{
- COM_PRINT("%s() get invalid input arguments.\n", __FUNCTION__);
+ dbg_print("invalid input arugments\n");
return ;
}
if ( comport->fd >= 0 )
{
- COM_PRINT("Close device \"%s\"\n", comport->devname);
close(comport->fd);
}
@@ -274,200 +314,142 @@
}
/*
- * description: write $send_bytes bytes data from $buf to $comport
+ * description: write $data_bytes $data to $comport
* return value: 0: write ok <0: write failure
*/
-int comport_send(comport_t *comport, char *buf, int send_bytes)
+int comport_send(comport_t *comport, char *data, int data_bytes)
{
+ char *ptr;
+ int left, bytes = 0;
int rv = 0;
- char *ptr, *end;
- int send = 0;
- if ( !comport || !buf || send_bytes<=0 )
+ if( !comport || !data || data_bytes<=0 )
{
- COM_PRINT("%s() get invalid input arguments.\n", __FUNCTION__);
- rv = -1;
- goto CleanUp;
+ dbg_print("invalid input arugments\n");
+ return -1;
}
- if ( comport->fd < 0 ) // Comport not opened ?
+ if( comport->fd < 0 )
{
- rv = -3;
- COM_PRINT("Serail not connected.\n");
- goto CleanUp;
+ dbg_print("Serail port not opened\n");
+ return -2;
}
- //printf("Send %s with %d bytes.\n", buf, send_bytes);
+ ptr = data;
+ left = data_bytes;
- // Large data, then slice them and send
- if (comport->frag_size < send_bytes)
+ while( left > 0 )
{
- ptr = buf;
- end = buf + send_bytes;
+ /* Large data, then slice them to frag and send */
+ bytes = left>comport->fragsize ? comport->fragsize : left;
- do
+ rv = write(comport->fd, ptr, bytes);
+ if( rv<0 )
{
- // 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);
- }
+ rv = -3;
+ break;
}
- while (ptr < end);
- }
- else // The send data is not large than a fragmention.
- {
- send = write(comport->fd, buf, send_bytes);
- if (0 >= send || send_bytes != send)
- {
- rv = -5;
- goto CleanUp;
- }
+
+ left -= rv;
+ ptr += rv;
}
-CleanUp:
return rv;
}
/*
- * description: read data from $comport in $timeout <ms> to $buf no more than $bufsize 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
*/
-int comport_recv(comport_t *comport, char *buf, int bufsize, unsigned long timeout)
+int comport_recv(comport_t *comport, char *buf, int buf_size, unsigned long timeout)
{
- int rv = 0;
- int iRet;
fd_set rdfds, exfds;
- struct timeval stTime;
+ struct timeval to, *to_ptr = NULL;
+ int ret, rv = 0;
+ int bytes = 0;
- if ( !comport || !buf || bufsize<=0 )
+ if ( !comport || !buf || buf_size<=0 )
{
- COM_PRINT("%s() get invalid input arguments.\n", __FUNCTION__);
- rv = -1;
- goto CleanUp;
+ dbg_print("invalid input arugments\n");
+ return -1;
}
if ( comport->fd < 0 )
{
- COM_PRINT("%s() comport not connected.\n", __FUNCTION__);
- rv = -2;
- goto CleanUp;
+ dbg_print("Serail port not opened\n");
+ return -2;
}
+
+ memset(buf, 0, buf_size);
FD_ZERO(&rdfds);
FD_ZERO(&exfds);
FD_SET(comport->fd, &rdfds);
FD_SET(comport->fd, &exfds);
- if (0xFFFFFFFF != timeout)
+ if( TIMEOUT_NONE != timeout )
{
- stTime.tv_sec = (time_t) (timeout / 1000);
- stTime.tv_usec = (long)(1000 * (timeout % 1000));
-
- iRet = select(comport->fd + 1, &rdfds, 0, &exfds, &stTime);
- if (0 == iRet)
- {
- rv = 0;
- goto CleanUp;
- }
- else if (0 < iRet)
- {
- if (0 != FD_ISSET(comport->fd, &exfds))
- {
- rv = -6;
- COM_PRINT("Error checking recv status.\n");
- goto CleanUp;
- }
-
- if (0 == FD_ISSET(comport->fd, &rdfds))
- {
- rv = 0;
- COM_PRINT("No incoming data.\n");
- goto CleanUp;
- }
- }
- else
- {
- if (EINTR == errno)
- {
- COM_PRINT("catch interrupt signal.\n");
- rv = 0;
- }
- else
- {
- COM_PRINT("Check recv status failure.\n");
- rv = -7;
- }
-
- goto CleanUp;
- }
+ to.tv_sec = (time_t) (timeout / 1000);
+ to.tv_usec = (long)(1000 * (timeout % 1000));
+ to_ptr = &to;
}
- usleep(10000); /* sleep for 10ms for data incoming */
-
- // Get data from Com port
- iRet = read(comport->fd, buf, bufsize);
- if (0 > iRet)
+ while( 1 )
{
- if (EINTR == errno)
- rv = 0; // Interrupted signal catched
- else
- rv = -3; // Failed to read Com port
-
- goto CleanUp;
- }
-
-#if 0
- {
- int i=0;
- printf("Receive %d bytes data: \n", iRet);
- for(i=0; i<iRet; i++)
+ /* check got data arrive or not */
+ ret = select(comport->fd+1, &rdfds, 0, &exfds, to_ptr);
+ if( ret<0 )
{
- printf("0x%02x ", buf[i]);
+ /* EINTR means catch interrupt signal */
+ dbg_print("comport select() failed: %s\n", strerror(errno));
+ rv = EINTR==errno ? 0 : -3;
+ break;
}
- printf("\n");
+ else if( 0 == ret ) /* timeout */
+ {
+ break;
+ }
+
+ /* read data from comport */
+ ret = read(comport->fd, buf+bytes, buf_size-bytes);
+ if(ret <= 0)
+ {
+ dbg_print("comport read() failed: %s\n", strerror(errno));
+ break;
+ }
+
+ bytes += ret;
+ if( bytes >= buf_size )
+ break;
+
+ /* try to read data in 1ms again, if no data arrive it will break */
+ to.tv_sec = 0;
+ to.tv_usec = 10000;
+ to_ptr = &to;
}
-#endif
- rv = iRet;
+ if( !rv )
+ rv = bytes;
-CleanUp:
return rv;
-
}
/**************************************************************************************
* Description: Set the comport databit,parity,stopbit,flowctrl into the comport structure
* Input Args: comport: the comport_t pointer
- * settings: The databit/parity/stopbit/flowctrl settings as like "8N1N"
+ * settings: The databit/parity/stopbit/flowctrl settings as like "8N1N"
* Output Args: NONE
* Return Value: NONE
*************************************************************************************/
-void set_settings(comport_t * comport, const char *settings)
+static inline void set_settings(comport_t * comport, const char *settings)
{
if( !settings || !comport )
{
- COM_PRINT("%s() get invalid input arguments.\n", __FUNCTION__);
+ dbg_print("invalid input arugments\n");
return ;
}
@@ -535,50 +517,4 @@
break;
}
}
-
-
-
-#ifdef COM_DEBUG
-void disp_settings(comport_t *comport)
-{
- COM_PRINT("Device:\t\t\t\"%s\"\n", comport->devname);
- COM_PRINT("Baudrate:\t\t%ld\n", comport->baudrate);
- COM_PRINT("DataBit:\t\t\'%d\'\n", comport->databit);
-
- switch (comport->parity)
- {
- case 0:
- COM_PRINT("Parity:\t\t\t\'N\'\n");
- break;
- case 1:
- COM_PRINT("Parity:\t\t\t\'O\'\n");
- break;
- case 2:
- COM_PRINT("Parity:\t\t\t\'E\'\n");
- break;
- case 3:
- COM_PRINT("Parity:\t\t\t\'S\'\n");
- break;
- }
- COM_PRINT("StopBit:\t\t\'%ld\'\n", (long int)comport->stopbit);
- switch (comport->flowctrl)
- {
- case 0:
- COM_PRINT("FlowCtrl:\t\t\'N\'\n");
- break;
- case 1:
- COM_PRINT("FlowCtrl:\t\t\'S\'\n");
- break;
- case 2:
- COM_PRINT("FlowCtrl:\t\t\'H\'\n");
- break;
- case 3:
- COM_PRINT("FlowCtrl:\t\t\'B\'\n");
- break;
- }
- COM_PRINT("\n");
- return;
-}
-#endif
-
--
Gitblit v1.9.1