From 153fcf3e10e67bb12d95fb0d0feaad738688c1b3 Mon Sep 17 00:00:00 2001 From: guowenxue <guowenxue@gmail.com> Date: Sun, 02 May 2021 21:52:15 +0800 Subject: [PATCH] Add comport test program in booster --- booster/test/makefile | 26 +++++ booster/test/comport.c | 239 +++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 265 insertions(+), 0 deletions(-) diff --git a/booster/test/comport.c b/booster/test/comport.c new file mode 100644 index 0000000..80be4e4 --- /dev/null +++ b/booster/test/comport.c @@ -0,0 +1,239 @@ +/********************************************************************************* + * Copyright: (C) 2021 Guo Wenxue <guowenxue@gmail.com> + * All rights reserved. + * + * Filename: comport.c + * Description: This file used to do ioctl() on common device or communicate + * with serial port/TTY device. + * + * Version: 1.0.0(5/1/2021~) + * Author: Guo Wenxue <guowenxue@gmail.com> + * ChangeLog: 1, Release initial version on "5/1/2021 10:08:05 AM" + * + ********************************************************************************/ +#include <getopt.h> +#include <libgen.h> +#include <sys/ioctl.h> + +#include "comport.h" + +unsigned char g_stop = 0; +unsigned char g_CtrlZ; + +void print_version(char *name); +void usage(char *name); +void signal_handler(int i_sig); +void stdin_nonblock(void); +int kbhit(void); + + +int main(int argc, char **argv) +{ + int opt = 0; + int rv = 0; + int i; + + comport_t comport; + int baudrate = 115200; + char *settings = "8N1N"; + char *dev_name = NULL; + + char buf[512]; + unsigned char disp_mode = 0x00; + + struct sigaction sigact; + + struct option long_options[] = { + {"device", required_argument, NULL, 'd'}, + {"baudrate", required_argument, NULL, 'b'}, + {"settings", required_argument, NULL, 's'}, + {"hex", no_argument, NULL, 'x'}, + {"version", no_argument, NULL, 'v'}, + {"help", no_argument, NULL, 'h'}, + {NULL, 0, NULL, 0} + }; + + while ((opt = getopt_long(argc, argv, "d:b:s:vh", long_options, NULL)) != -1) + { + switch (opt) + { + case 'd': + dev_name = optarg; + break; + + case 'b': + baudrate = atoi(optarg); + break; + + case 's': /* Default settings as 8N1N */ + settings = optarg; + break; + + case 'x': /* Display receive data as Hex mode */ + disp_mode = 0x01; + break; + + case 'v': /* version */ + print_version(argv[0]); + return 0; + + case 'h': /* help */ + usage(argv[0]); + return 0; + + default: + break; + } /* end of "switch(opt)" */ + } + + if (argc < 2) + { + usage(argv[0]); + return 0; + } + + if ( (rv=comport_open(&comport, dev_name, baudrate, settings)) < 0) + { + printf("Failed to open %s wth baudrate %d, %s. rv=%d\n", dev_name, baudrate, settings, rv); + return -1; + } + + stdin_nonblock(); + + /* Process level signal handler */ + sigemptyset(&sigact.sa_mask); + sigact.sa_flags = 0; + sigact.sa_handler = signal_handler; + + sigaction(SIGTERM, &sigact, NULL); /* catch terminate signal */ + sigaction(SIGINT, &sigact, NULL); /* catch interrupt signal */ + sigaction(SIGSEGV, &sigact, NULL); /* catch segmentation faults */ + sigaction(SIGTSTP, &sigact, NULL); /* catch ctrl+Z */ + sigaction(SIGSTOP, &sigact, NULL); /* catch ctrl+Z */ + + while ( !g_stop ) + { + rv = comport_recv(&comport, buf, sizeof(buf) - 1, 10); + if ( rv > 0) + { + for (i=0; i<rv ; i++) + { + if (0 == disp_mode) + printf("%c", buf[i]); + else + printf("%02X ", buf[i]); + } + fflush(stdout); + } + if (0 != kbhit()) + { + rv = fgetc(stdin); + + if (0x0A == rv) + { + buf[0] = 0x0D; /* 13 == 0x0D */ + } + else + { + buf[0] = rv; + } + + comport_send(&comport, buf, 1); + } + else if (0x00 != g_CtrlZ) + { + g_CtrlZ = 0x00; + buf[0] = 0x1A; + comport_send(&comport, buf, 1); + } + } + + comport_close(&comport); + return 0; +} /* ----- End of main() ----- */ + + +void print_version(char *name) +{ + char *progname = NULL; + char *ptr = NULL; + + ptr = strdup(name); + progname = basename(ptr); + + printf("%s v1.0.0 Build on %s\n", progname, __DATE__); + printf("Copyright (C) 2021 guowenxue <guowenxue@gmail.com>\n"); + + free(ptr); + return; +} + +void usage(char *name) +{ + char *progname = NULL; + char *ptr = NULL; + + ptr = strdup(name); + progname = basename(ptr); + printf("Usage1: comport -d <device> [-b <baudrate>][-s <settings>] [-x]\n"); + printf(" -d[device ] device name\n"); + printf(" -b[baudrate] device baudrate (115200, 57600, 19200, 9600), default is 115200\n"); + printf(" -s[settings] device settings as like 8N1N(default setting)\n"); + printf(" - data bits: 8, 7\n"); + printf(" - parity: N=None, O=Odd, E=Even, S=Space\n"); + printf(" - stop bits: 1, 0\n"); + printf(" - flow control: N=None, H=Hardware, S=Software, B=Both\n"); + printf(" -x[hex ] display received data in hex format\n"); + + printf(" -v[version ] Display the program version\n"); + printf(" -h[help ] Display this help information\n"); + print_version(progname); + + free(ptr); + + return; +} + + +void signal_handler(int signum) +{ + if (SIGTERM == signum || SIGINT == signum) + { + g_stop = 1; + } + else if (SIGTSTP == signum) + { + g_CtrlZ = 1; + } +} + + +void stdin_nonblock(void) +{ + struct termios ttystate; + + //get the terminal state + tcgetattr(STDIN_FILENO, &ttystate); + + //turn off canonical mode + ttystate.c_lflag &= ~ICANON; + //minimum of number input read. + ttystate.c_cc[VMIN] = 1; + + //set the terminal attributes. + tcsetattr(STDIN_FILENO, TCSANOW, &ttystate); +} + +int kbhit(void) +{ + struct timeval tv; + fd_set fds; + tv.tv_sec = 0; + tv.tv_usec = 0; + FD_ZERO(&fds); + FD_SET(STDIN_FILENO, &fds); //STDIN_FILENO is 0 + select(STDIN_FILENO + 1, &fds, NULL, NULL, &tv); + return FD_ISSET(STDIN_FILENO, &fds); +} + + diff --git a/booster/test/makefile b/booster/test/makefile new file mode 100644 index 0000000..05bcfa7 --- /dev/null +++ b/booster/test/makefile @@ -0,0 +1,26 @@ + +PWD=$(shell pwd) + +LIB_PATH=$(shell dirname ${PWD} ) +LIB_NAME=$(shell basename ${LIB_PATH} ) + +CFLAGS+=-I${LIB_PATH} +LDFLAGS+=-L${LIB_PATH} -l${LIB_NAME} + +SRCFILES = $(wildcard *.c) +BINARIES=$(SRCFILES:%.c=%) + +all: libs binaries + +libs: + make -C ${LIB_PATH} + +binaries: ${BINARIES} + @echo " Compile over" + +%: %.c + $(CC) $(CFLAGS) -o $@ $< $(LDFLAGS) + +clean: + @rm -f ${BINARIES} + -- Gitblit v1.9.1