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

📄 serialfunc.c

📁 本程序是在LINUX下编写的串口程序设计
💻 C
字号:
#include "serialfunc.h"#include <gtk/gtk.h>#include <signal.h>#include <stdio.h>#include <termios.h>#include <fcntl.h>#include <sys/types.h>#include <unistd.h>#include <string.h>static speed_t baud_rate = B115200;static gint bit_size = 8;static gint checkmod = 0;			// 0:none ; 1:odd ; 2:evenstatic struct termios term,termsave;static FILE* fp = NULL;				//file pointer for serial portstatic gchar* port = NULL;void tty_set_port(const gchar* portname){	if (portname == NULL)	{		g_warning("portname can not be NULL");		return;	}	if (port != NULL)		free(port);	port = strdup(portname);}void tty_set_baud_rate(speed_t speed){	baud_rate = speed;}void tty_set_bit_size(gint size){	bit_size = size;}void tty_set_checkmod(gint mod){	checkmod = mod;}FILE* tty_get_fp(){	return fp;}gint tty_serial_open(){			gint fd;	gint accessmod;			if ((fp = fopen(port,"rb+")) == NULL)	{		g_warning("error open %s\n",port);		return -1;	}	setbuf(fp,NULL);	fd = fileno(fp);		accessmod = fcntl(fd,F_GETFL,0);		if ( tcgetattr(fd,&termsave)<0 )	{		g_print("error in tcgetattr %s\n",port);		fclose(fp);		return -1;	}		if ( fcntl(fd,F_SETFL,accessmod|O_NONBLOCK) == -1)	{		g_warning("change access mod to nonblock failed\n");		fclose(fp);		return -1;	}		term = termsave;	//g_print("inlcr = %d\n",term.c_iflag & INLCR);	//g_print("icrnl = %d\n",term.c_iflag & ICRNL);	//g_print("Echonl = %d\n",term.c_lflag & ECHONL);	//g_print("echo = %d\n",term.c_iflag & ECHO);	// disable nl=>cr translate	// disable cr=>nl translate	// no SIGINT on BREAK, output flow control off	term.c_iflag &= ~(INLCR|ICRNL|BRKINT|IXON);		// disable nl echo	// disable echo	// extended ipnut processing off, signal chars off	// canonical mode off i.e. terminal not in line buffer mode	term.c_lflag &= ~(ECHONL|ECHO|IEXTEN|ISIG|ICANON);	// output processing off	term.c_oflag &= ~(OPOST);		term.c_cc[VMIN] = TTY_MIN_READ_SIZE;	term.c_cc[VTIME] = TTY_RETURN_TIME;		//-------------- set serial port's baud_rate ----------------	if ( cfsetospeed(&term,baud_rate)<0 )	{		g_warning("set serial output baud rate error\n");		fclose(fp);		return -1;	}    if ( cfsetispeed(&term,baud_rate)<0 )    {        g_warning("set serial input baud rate error\n");		fclose(fp);        return -1;    }	//------------- set serial port's bits per byte ---------------	switch(bit_size)	{		case 5:			term.c_cflag &= ~(CSIZE);			term.c_cflag |= CS5;			break;		case 6:			term.c_cflag &= ~(CSIZE);			term.c_cflag |= CS6;			break;		case 7:			term.c_cflag &= ~(CSIZE);			term.c_cflag |= CS7;			break;		case 8:			term.c_cflag &= ~(CSIZE);			term.c_cflag |= CS8;			break;		default:			g_warning("set bit_size failed\n");			fclose(fp);			return -1;	}	//-------- set serial port's odd\even check mode -------------	switch(checkmod)	{		case 0:			term.c_cflag &= ~(PARENB);			break;		case 1:			term.c_cflag |= PARENB;			term.c_cflag |= PARODD;			break;		case 2:			term.c_cflag |= PARENB;			term.c_cflag |= ~(PARODD);			break;		default:			g_warning("set checkmod failed\n");			fclose(fp);			return -1;	}	//------- only now really set the serial port's parameters ------------	if ( tcsetattr(fd,TCSANOW,&term)<0 )	{			g_warning("error tcsetattr %s\n",port);		fclose(fp);		return -1;	}	return 0;}void tty_serial_close(){	if (fp == NULL)		return;		// restore the terminal's mode	if ( tcsetattr(fileno(fp),TCSANOW,&termsave)<0 )	{			g_warning("error tcsetattr");	}		if (tcflush(fileno(fp),TCIOFLUSH) == -1)		g_warning("tcflush error\n");	fclose(fp);	fp = NULL;}gint tty_read_data(gint event_fd,gchar* buffer,gint size){	gint readsize;	if( event_fd == fileno(fp) )	{		readsize = read(fileno(fp),buffer,size-1);		if (readsize == -1)		{			g_warning("read data from serial error");			buffer[0] = '\0';		}		else		{			buffer[readsize] = '\0';		}	}	else	{		g_warning("should not come here\n");		buffer[0] = '\0';	}	return readsize;}int tty_write_data(const gchar* text){	int count;	int i;	size_t length;		if ( fp == NULL )		return EOF;	count = 0;	length = strlen(text);	for (i=0;i<length;i++)	{		if( fputc(text[i],fp) != EOF)		{			count++;		}	}	return count;//	fputs("\r\n",fp);}

⌨️ 快捷键说明

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