⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 com-terminal.c

📁 linux下编写的一个串口调试程序
💻 C
字号:
#include <termios.h>#include <stdio.h>#include <unistd.h>#include <fcntl.h>#include <sys/signal.h>#include <sys/types.h>#include <sys/ioctl.h>int transfer_byte(int from, int to, int is_control);typedef struct {char *name; int flag; } speed_spec;void print_status(int fd) {	int status;	unsigned int arg;	status = ioctl(fd, TIOCMGET, &arg);	fprintf(stderr, "[STATUS]: ");	if(arg & TIOCM_RTS) fprintf(stderr, "RTS ");	if(arg & TIOCM_CTS) fprintf(stderr, "CTS ");	if(arg & TIOCM_DSR) fprintf(stderr, "DSR ");	if(arg & TIOCM_CAR) fprintf(stderr, "DCD ");	if(arg & TIOCM_DTR) fprintf(stderr, "DTR ");	if(arg & TIOCM_RNG) fprintf(stderr, "RI ");	fprintf(stderr, "\r\n");}main(int argc, char *argv[]){	int comfd;	struct termios oldtio, newtio;       //place for old and new port settings for serial port	struct termios oldkey, newkey;       //place tor old and new port settings for keyboard teletype	char *devicename = argv[1];	int need_exit = 0;	speed_spec speeds[] =	{		{"1200", B1200},		{"2400", B2400},		{"4800", B4800},		{"9600", B9600},		{"19200", B19200},		{"38400", B38400},		{"57600", B57600},		{"115200", B115200},		{NULL, 0}	};	int speed = B9600;	if(argc < 2) {		fprintf(stderr, "example: %s /dev/ttyS0 [115200]\n", argv[0]);		exit(1);	}	comfd = open(devicename, O_RDWR | O_NOCTTY | O_NONBLOCK);	if (comfd < 0)	{		perror(devicename);		exit(-1);	}	if(argc > 2) {			speed_spec *s;		for(s = speeds; s->name; s++) {			if(strcmp(s->name, argv[2]) == 0) {				speed = s->flag;				fprintf(stderr, "setting speed %s\n", s->name);				break;			}		}	}	fprintf(stderr, "C-a exit, C-x modem lines status\n");	tcgetattr(STDIN_FILENO,&oldkey);	newkey.c_cflag = speed | CRTSCTS | CS8 | CLOCAL | CREAD;	newkey.c_iflag = IGNPAR;	newkey.c_oflag = 0;	newkey.c_lflag = 0;	newkey.c_cc[VMIN]=1;	newkey.c_cc[VTIME]=0;	tcflush(STDIN_FILENO, TCIFLUSH);	tcsetattr(STDIN_FILENO,TCSANOW,&newkey);	tcgetattr(comfd,&oldtio); // save current port settings 	newtio.c_cflag = B9600 | CS8 | CREAD;	newtio.c_iflag = IGNPAR;	newtio.c_oflag = 0;	newtio.c_lflag = 0;	newtio.c_cc[VMIN]=1;	newtio.c_cc[VTIME]=0;	tcflush(comfd, TCIFLUSH);	tcsetattr(comfd,TCSANOW,&newtio);	print_status(comfd);	while(!need_exit) {		fd_set fds;		int ret;				FD_ZERO(&fds);		FD_SET(STDIN_FILENO, &fds);		FD_SET(comfd, &fds);		ret = select(comfd+1, &fds, NULL, NULL, NULL);		if(ret == -1) {			perror("select");		} else if (ret > 0) {			if(FD_ISSET(STDIN_FILENO, &fds)) {				need_exit = transfer_byte(STDIN_FILENO, comfd, 1);			} else if(FD_ISSET(comfd, &fds)) {				need_exit = transfer_byte(comfd, STDIN_FILENO, 0);			}		}	}	tcsetattr(comfd,TCSANOW,&oldtio);	tcsetattr(STDIN_FILENO,TCSANOW,&oldkey);	close(comfd);}int transfer_byte(int from, int to, int is_control) {	char c;	int ret;	ret = read(from, &c, 1);	if(ret == 1) {		if(is_control) {			if(c == '\x01') { // C-a				return -1;			} else if(c == '\x18') { // C-x				print_status(to);				return 0;			}		}		if(write(to, &c, 1) != 1) {			perror("write failed");		}	}	return 0;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -