📄 uart_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 + -