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

📄 uart_socket.c~

📁 一个已经通过调试的uart转网络的程序 包含了linux下的串口和socket编程
💻 C~
字号:
//目录:\uClibc\libc\sysdeps\linux\common\bits\termios.h定义了一些参数/*       tcflush函数刷清输入缓存或输出缓存。       queue参数应当是下列三个参数之一:       TCIFLUSH     刷清输入队列       TCOFLUSH    刷清输出队列       TCIOFLUSH  刷清输入、输出队列*/#include<stdio.h>     //标准IO#include<fcntl.h>     #include<termios.h>   //串口终端头文件//以下3个头文件是socket头文件#include<sys/socket.h>#include<netdb.h>#include<netinet/in.h>//以下部分根据需要填写#include<stdlib.h>#include<unistd.h>    //系统调用必须包含的头文件#include<string.h>    //字符串处理函数#include<sys/types.h>#include<sys/stat.h>#include<errno.h>/*************************************************** 函 数 名:set_speed 功    能:设置波特率 入口参数:fd:文件描述符,speed:波特率 出口参数:无****************************************************/void set_speed(int fd,int speed){	int status;	struct termios opt;	tcgetattr(fd,&opt);   //获取当前串口属性,保存在opt中	tcflush(fd,TCIOFLUSH);  //清空缓冲区 	//下面是设置波特率,输入输出一般是一样的	cfsetispeed(&opt,speed);  //设置输入波特率	cfsetospeed(&opt,speed);  //设置输出波特率		status=tcsetattr(fd,TCSANOW,&opt);//设置新的串口属性	if(status!=0)	{		printf("tcsetattr fail!\n");		exit(0);		}	tcflush(fd,TCIOFLUSH);  //清空缓冲区 		}/*************************************************** 函    数:set_data_format 功    能:设置数据格式 入口参数:文件描述符,数据位,奇偶检验位,停止位 出口参数:无****************************************************/int set_data_format(int fd,int databits,char parity,int stopbits)//8 N 1{	struct termios opt;	if(tcgetattr(fd,&opt)!=0)	{		printf("setup serial1 failed!\n");		return (0);		}	opt.c_cflag&=~CSIZE;	/*设置数据位*/	switch(databits)	{		case 5:			    opt.c_cflag|=CS5;			    break;		case 6:			    opt.c_cflag|=CS6;			    break;	    		case 7:			    opt.c_cflag|=CS7;			    break;		case 8:			    opt.c_cflag|=CS8;			    break;			default:			   printf("unsupported databits\n");			   return (0);	       	      		}		/*设置校验位*/	switch(parity)	{		case 'n':		case 'N':                   //无校验			      opt.c_cflag&=~PARENB;			      opt.c_iflag&=~INPCK;   /* Enable parity checking */			      break;	  case 'o': 	  case 'O':                    //奇校验	          opt.c_cflag |=(PARODD | PARENB); /* parity checking */             opt.c_iflag |=INPCK; /* Disenable parity checking */	  	      break;	  case 'e': 	  case 'E':                     //偶校验	  	      opt.c_cflag |= PARENB;	  	      opt.c_cflag&=~PARODD;	  	      opt.c_iflag |=INPCK;	  	      break;	  default:	  	    printf("unsupported databits\n");   	 	  	    return (0);	        	      		      			}			//停止位  switch (stopbits)  {		case 1:		opt.c_cflag &= ~CSTOPB;      //1位停止位		break;		case 2:		opt.c_cflag |= CSTOPB;       //2位停止位		break;		default:		printf("unsupported stopbits\n");		return (0);  }  /**************有疑问*********************/  opt.c_cc[VTIME]=50;  opt.c_cc[VMIN]=0;  /****************************************/  opt.c_lflag &= ~(ICANON|ECHO|ECHOE|ISIG);//输入模式原始数据处理  opt.c_oflag&= ~OPOST;   //输出模式, 原始数据输出  /**********************************************/  tcflush(fd,TCIFLUSH);   //清空输入缓冲区  if(tcsetattr(fd,TCSANOW,&opt)!=0)  {  	 printf("tcsetattr faild!\n");     	 return 0;  	}  return 1;	  	}/*************************************************** 函    数:nread 功    能:从串口读出n个字节才返回 入口参数:文件描述符,指针,个数len 出口参数:无****************************************************/void nread(int fd,char *buf,char len){    char  count=0;     int   now=len;         do{    	  count=read(fd,buf,now);    	  if(count==len)    	    break;    	  now=now-count;     	  buf=buf+count;      	}    	while(now!=0);}/******************************************** 函    数:nwrite_sock 功    能:从往网口写入n个字节才返回 入口参数:socket文件描述符,指针,个数len 出口参数:无*********************************************/int nwrite_sock(int socket_fd,char *buf,char len){    signed char count;    int now=len;    do{	count=write(socket_fd,buf,now);	if(count<0)          return 0;        else if(count==len)          break;        else           {	    now=now-count;            buf=buf+count;	  }       }while(now!=0);    return 1; }/*****************************************************************                        主程序******************************************************************/int main(){	int client_socket;             //客户端socket  struct sockaddr_in sever_addr; //服务器端sockaddr结构	char read_buf[29];	int length;  int nbytes;   //用于测试缓冲区的大小  volatile int tmp;  int uart1_fd;  uart1_fd=open("/dev/ttyS1",O_RDWR);//以读写的方式打开串口1  if(uart1_fd==-1)  {  	printf("uart1 open failed!\n");  	exit(0);  }    set_speed(uart1_fd,B9600);//设置串口波特率  tmp=set_data_format(uart1_fd,8,'n',1);    if(tmp==0)   //设置串口数据格式   有问题   {       printf("set_data_format failed!\n");       exit(0);   }  printf("uart1 init is successful!\n");     //串口1初始化成功      bzero(&sever_addr,sizeof(struct sockaddr_in));  sever_addr.sin_family=AF_INET;  sever_addr.sin_addr.s_addr=inet_addr("192.168.0.168");  sever_addr.sin_port=htons(7000);    if((client_socket=socket(AF_INET,SOCK_STREAM,0))==-1)   {     printf("socket is error!\n");     exit(1);   }     if(connect(client_socket,(struct sockaddr*)(&sever_addr),sizeof(struct sockaddr))==-1)   {     printf("client connect is error!\n");     exit(1);   }  printf("socket init is successful!\n");   //客户端socket创建成功      while(1)  {  nread(uart1_fd,read_buf,27);   //读出串口  read_buf[27]='\r';  read_buf[28]='\n';  printf("client receive data from COM1 is successful!\n");  if(nwrite_sock(client_socket,read_buf,29)==0)     break;  printf("send data to server is successful!\n");  }   close(uart1_fd);  close(client_socket);  return 0;	}

⌨️ 快捷键说明

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