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

📄 p6.5.c

📁 linux编程源代码,其中是由大量的实例
💻 C
字号:
#include <stdio.h>#include <unistd.h>#include <sys/types.h>#include <sys/stat.h>#include <fcntl.h>#include <termios.h>#include <string.h>//打开指定的串口int open_port(char* port){	int fd;	if((fd=open(port,O_RDWR | O_NOCTTY | O_NONBLOCK))==-1){		perror("Cannot open the desired port");			return -1;	}	return fd;}//关闭指定串口void close_port(int fd){	close(fd);}//get the baud_rate defination according to the baud rateint get_baud_rate(unsigned long int baud_rate){	switch(baud_rate){		case 0:			return B0;		case 50:			return B50;		case 75:			return B75;		case 110:			return B110;		case 134:			return B134;		case 150:			return B150;		case 200:			return B200;		case 300:			return B300;		case 600:			return B600;		case 1200:			return B1200;		case 1800:			return B1800;		case 2400:			return B2400;		case 4800:			return B4800;		case 9600:			return B9600;		case 19200:			return B19200;		case 38400:		        return B38400;	        case 57600:		        return B57600;	 	case 115200:	   		return B115200;		case 230400:			return B230400;		default:			return -1;	}}typedef struct port_info{	int baud_rate;	int port_fd;	char parity;	char stop_bit;	char flow_ctrl;	char data_bits;}*pport_info;int set_port(pport_info p_info){	struct termios old_opt,new_opt;	int baud_rate,parity;	memset(&old_opt,0,sizeof(old_opt));	memset(&new_opt,0,sizeof(new_opt));	cfmakeraw(&new_opt);	tcgetattr(p_info->port_fd,&old_opt);	/*=========以下设置串口波特率=========*/        baud_rate=get_baud_rate(p_info->baud_rate);		//修改new_opt结构中的串口输入/输出波特率参数	cfsetispeed(&new_opt,baud_rate);	cfsetospeed(&new_opt,baud_rate);		//修改控制模式,保证程序不会占用串口	new_opt.c_cflag |=CLOCAL;	//修改控制模式,使得能够从串口中读取输入数据 	new_opt.c_cflag |=CREAD;	/*===========设置数据流控制==========*/	switch(p_info->flow_ctrl){		case '0':			//不使用流控制			new_opt.c_cflag &=~CRTSCTS;			break;		case '1':			//使用硬件进行流控制			new_opt.c_cflag |=CRTSCTS;			break;		case '2':			new_opt.c_cflag |= IXON | IXOFF | IXANY;			break;	}		/*===========设置数据位============*/	new_opt.c_cflag &=~CSIZE;	switch(p_info->data_bits){		case '5':			new_opt.c_cflag |=CS5;			break;		case '6':			new_opt.c_cflag |=CS6;			break;		case '7':			new_opt.c_cflag |=CS7;			break;		case '8':			new_opt.c_cflag |=CS8;			break;		default:			new_opt.c_cflag |=CS8;		}	/*===========设置奇偶效验位==========*/	switch(p_info->parity){		case '0':			//不使用奇偶效验			new_opt.c_cflag &=~PARENB;			break;		case '1':			//使用偶效验			new_opt.c_cflag |=PARENB;			new_opt.c_cflag &=~PARODD;			break;		case '2':			//使用奇效验			new_opt.c_cflag |=PARENB;			new_opt.c_cflag |=PARODD;			break;	}	/*============设置停止位===========*/	if(p_info->stop_bit=='2')		new_opt.c_cflag |=CSTOPB;	else		new_opt.c_cflag &=~CSTOPB;	//修改输出模式,原始数据输出	new_opt.c_oflag &=~OPOST;	//修改控制字符,读取字符的最少个数为1	new_opt.c_cc[VMIN]=1;	//修改控制字符,读取第一个字符等待1*(1/10)s	new_opt.c_cc[VTIME]=1;	//如果发生数据溢出,接收数据,但是不再读取	tcflush(p_info->port_fd,TCIFLUSH);		int result;	result=tcsetattr(p_info->port_fd,TCSANOW,&new_opt);	if(result==-1){		perror("Cannot set the serial port parameters");		return -1;	}	tcgetattr(p_info->port_fd,&old_opt);	return result;}int send_data(int fd,char *data,int data_len){	int len;	len=0;	len=write(fd,data,data_len);	if(len==data_len)		return len;	else{		//如果出现溢出的情况		tcflush(fd,TCOFLUSH);		return -1;	}}int recv_data(int fd,char *data,int data_len){	int len,fs_sel;	fd_set fs_read;	struct timeval time;	FD_ZERO(&fs_read);	FD_SET(fd,&fs_read);	time.tv_sec=10;	time.tv_usec=0;	//使用select实现串口的多路通信	fs_sel=select(fd+1,&fs_read,NULL,NULL,&time);	if(fs_sel){		len=read(fd,data,data_len);		return len;	}else		return -1;}int main(int argc,char* argv[]){	int port_fd;	int len;	char recv_buf[9];	int i;	if(argc!=3){		printf("Usage: %s /dev/ttySn 0(send data)/1(receive data)\n",argv[0]);		return -1;	}	port_fd=open_port(argv[1]);	if(port_fd==-1){		printf("Program Exit\n");		return -1;	}	//设置串口通信参数	struct port_info info;	info.baud_rate=9600;	info.data_bits=8; 	info.flow_ctrl=2;	info.port_fd=port_fd;	info.stop_bit=1;	info.parity=0;	if(set_port(&info)==-1){		printf("Program Exit\n");		return -1;	}		if(strcmp(argv[2],"0")==0){		for(i=0;i<10;i++){			len=send_data(port_fd,"Test Data",9);			if(len>0)				printf("%d send data successfully\n",i);			else 				printf("send data failed\n");						sleep(2);		}		close_port(port_fd);	}else{		while(1){			len=recv_data(port_fd,recv_buf,9);			if(len>0){				for(i=0;i<len;i++)					printf("receive data is %s\n",recv_buf);			}else				printf("cannot receive data\n");			sleep(2);		}      }	return 0;}

⌨️ 快捷键说明

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