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

📄 term.c

📁 MOXA 串口驱动编程
💻 C
字号:
/*****************************************************************************//* TERM.C								     *//*									     *//* Copyright (c) Moxa Technologies Inc. 1999. All Rights Reserved.	     *//*									     *//* Revision history:							     *//*	10/95	JOSE							     *//*	12/96	Hsu		Modify for Linux 2.0.0 (C168/C104 ADM)	     *//*     8/5/99   Casper                                                       *//*****************************************************************************//*****************************************************************************//* include file 							     *//*****************************************************************************/#include	<sys/time.h>#include	<sys/types.h>#include	<unistd.h>#include	<errno.h>#include	<termios.h>#include	"term.h"#define NO	0#define YES	1#define K_LF	0x0a#define K_CR	0x0d#define M_CRLF	0#define M_CR	1#define M_LF	2#define M_LFCR	3#define COMMSETUP	0#define DUMBTERM	1#define TRANMODE	2/*****************************************************************************//* local define 							     *//*****************************************************************************//*****************************************************************************//* GLOBAL VARIABLES							     *//*****************************************************************************/extern	int	errno;/*****************************************************************************//* STATIC VARIABLES							     *//*****************************************************************************/static	struct	termios	tty_old;static	struct	WItem	mnMenuitem[] = {	{ F_Active, "Communication Setup" },	{ F_Active, "Dumb Terminal      " },	{ F_Active, "Advanced Transfer Modes" }};static char	InstrMsg[]="Enter:Select  Esc:Exit";static	struct	WSelect mnMenu = {	-1, 6, "Dumb Terminal Emulation Menu", 3, 0, 0, 0, 3, mnMenuitem,	{InstrMsg, 0}, 0};static	int	init_flag = 0;static	char	*title_msg=	"     Dumb Terminal Emulation         Ctrl-N: menu";/*****************************************************************************//* GLOBAL FUNCTIONS							     *//*****************************************************************************/void	terminal_end();void	term_menu();int	pattern_file_term();void	term_clr_screen();/*****************************************************************************//* STATIC FUNCTIONS							     *//*****************************************************************************/static	void	set_dterm();static	void	sio_init();static	void	con_init();static	void	term_mode();/*****************************************************************************//*	MAIN FUNCTIONS							     *//*****************************************************************************/void	term_setup(){	int	key;	term_menu();	tcgetattr(tty_fd, &tty_old);	if ( init_flag == 0 ) {	    set_dterm();	    init_flag = 1;	}	mw_selectinit(&mnMenu);	do {	    key = mw_select();	    switch ( key ) {	    case COMMSETUP:		term_s_setup();		break;	    case TRANMODE:		mw_selectend();		mode_setup();		term_menu();		mw_selectinit(&mnMenu);		break;	    case DUMBTERM:		mw_selectend();		term_mode();		mw_selectinit(&mnMenu);		break;	    }	} while ( key != K_ESC );	mw_selectend();	terminal_end();	if ( SioFd > 0 ) {	    tcflush(SioFd, 2);	    	    	    close(SioFd);	    SioFd = -1;	}	system("clear");}void	term_menu(){	WINDOW	*wid;	mw_clearscreen();	wid = mw_wopen(0, 0, 79, 0);	mw_wcolor(wid, D_A_INV);	mw_wfill(wid, ' ');	mw_wcputs(wid, 0, (uchar *)title_msg);	mw_wclose(wid);	mw_attr(D_A_Normal);}int	pattern_file_term(){	char	buf[81];	sio_init();	if ( SioFd < 0 ) {	    sprintf(buf, "%s open error(errno = %d) !", DTerm.dname, errno);	    confirm(buf);	    return(-1);	}	con_init();	return(0);}void	terminal_end(){	tcsetattr(tty_fd, TCSANOW, &tty_old);}static void term_mode(){	int	fd, i, len, exitflag = 0;	uchar	key, buf[101];	fd_set	rfdset, bakset;	struct	timeval tm;	if ( pattern_file_term() < 0 )	    return;	term_menu();        	mw_cursor(0, 1);	if ( tty_fd > SioFd )	    fd = tty_fd;	else	    fd = SioFd;	tm.tv_sec = 0;	tm.tv_usec = 100000;        FD_ZERO(&rfdset);	FD_SET(tty_fd, &rfdset);	FD_SET(SioFd, &rfdset);        bakset = rfdset;	while ( exitflag == 0 ) {            rfdset = bakset;	    if ( select(fd+1, &rfdset, NULL, NULL, NULL) > 0 ) {		if ( FD_ISSET(tty_fd, &rfdset) ) {		    key = getchar();		    switch ( key ) {		    case K_CTRL_N:			exitflag = 1;			break;		    default:			i = 0;			if ( key == K_CR ) {			    switch ( DTerm.senter ) {			    case M_CRLF:				buf[i++] = K_CR;				buf[i++] = K_LF;				break;			    case M_CR:				buf[i++] = K_CR;				break;			    case M_LF:				buf[i++] = K_LF;				break;			    case M_LFCR:				buf[i++] = K_LF;				buf[i++] = K_CR;				break;			    }			} else			    buf[i++] = key;			write(SioFd, buf, i);			break;		    }		}		if ( FD_ISSET(SioFd, &rfdset) ) {		    if ( (len = read(SioFd, buf, 100)) > 0 )			write(tty_fd, buf, len);		}	    }	}	terminal_end();}static void set_dterm(){        strcpy(DTerm.dname, "/dev/ttyS0");	DTerm.rate = 12; /*B9600*/	DTerm.parity = 0;	DTerm.databit = 3;	DTerm.stopbit = 0;	DTerm.xflow = 0;	DTerm.lecho = 0;	DTerm.senter = 1;}static void con_init(){	struct termios tty;	tcflush(tty_fd, 2);	tcgetattr(tty_fd, &tty);	switch ( DTerm.lecho ) {	case 0:	    tty.c_lflag &= ~ECHO;	    break;	case 1:	    tty.c_lflag |= ECHO;	    break;	}	tty.c_iflag &= ~ICRNL;	tty.c_oflag = 0;	tty.c_cc[VMIN] = 1;	tty.c_cc[VTIME] = 0;	tty.c_lflag &= ~(ICANON);	tcsetattr(tty_fd, TCSANOW, &tty);}static void sio_init(){	int		cflag = CREAD | CLOCAL | HUPCL;	struct termios	tty;	if ( SioFd > 0 ) {	    tcflush(SioFd, 2);	    return;	}	if ( (SioFd = open(DTerm.dname, O_RDWR | O_NDELAY)) == -1 )	    return;	tcflush(tty_fd, 2);	tcgetattr(tty_fd, &tty);        cflag |= BaudMapTab[DTerm.rate];        #ifdef CMSPAR	cflag &= ~(PARENB | PARODD | CMSPAR);#else	cflag &= ~(PARENB | PARODD);#endif	switch ( DTerm.parity ) {	case 1:	    cflag |= PARENB | PARODD;	    break;	case 2:	    cflag |= PARENB;	    break;#ifdef CMSPAR	case 3: /* mark */	    cflag |= PARENB | CMSPAR | PARODD;	    break;	case 4: /* space */	    cflag |= PARENB | CMSPAR;	    break;#endif	}	cflag |= (DTerm.databit * CS6);	if ( DTerm.stopbit )	    cflag |= CSTOPB;	tty.c_cflag = cflag;	switch ( DTerm.xflow ) {	case 0:		tty.c_cflag |= CRTSCTS;		tty.c_iflag &= ~(IXON | IXOFF);		break;	case 1:		tty.c_iflag |= IXON | IXOFF;		tty.c_cflag &= (~CRTSCTS);		break;	case 2:		tty.c_iflag |= IXON | IXOFF;		tty.c_cflag |= CRTSCTS;		break;	case 3:		tty.c_iflag &= ~(IXON | IXOFF);		tty.c_cflag &= ~(CRTSCTS);		break;	}	tty.c_lflag &= ~(ICANON | ECHO);	tty.c_iflag &= ~(ICRNL | ISTRIP);	tty.c_oflag = 0;	tty.c_cc[VMIN] = 1;	tty.c_cc[VTIME] = 0;	tcsetattr(SioFd, TCSANOW, &tty);        tcgetattr(SioFd, &tty);}void main_end(){	mw_wend();}int main(){	int	fd, ret;        int     i;        int     boards;	space_init();		mw_winit();                term_setup();		mw_wend();        return 0;}

⌨️ 快捷键说明

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