Linux C串口程序

来源:本站
导读:目前正在解读《Linux C串口程序》的相关信息,《Linux C串口程序》是由用户自行发布的知识型内容!下面请观看由(电工技术网 - www.9ddd.net)用户发布《Linux C串口程序》的详细说明。
简介:Linux C串口程序

#include<stdio.h>

#include<stdlib.h>#include<unistd.h>#include<sys/types.h>#include<sys/stat.h>#include<fcntl.h>#include<termios.h>#include<errno.h>#include<string.h>#defineFALSE-1#defineTRUE0intUART_Open(intfd,char*port);voidUART_Close(intfd);intUART_Set(intfd,intspeed,intflow_ctrl,intdatabits,intstopbits,intparity);intUART_Init(intfd,intspeed,intflow_ctrlint,intdatabits,intstopbits,charparity);intUART_Recv(intfd,char*rcv_buf,intdata_len);intUART_Send(intfd,char*send_buf,intdata_len);/*****************************************************************

* 名称: UART0_Open* 功能: 打开串口并返回串口设备文件描述* 入口参数: fd :文件描述符 port :串口号(ttyS0,ttyS1,ttyS2)* 出口参数: 正确返回为1,错误返回为0*****************************************************************/intUART_Open(intfd,char*port){fd=open(port,O_RDWR|O_NOCTTY|O_NDELAY);if(FALSE==fd){perror("Can't Open Serial Port");return(FALSE);}//判断串口的状态是否为阻塞状态if(fcntl(fd,F_SETFL,0)<0){printf("fcntl failed!n");return(FALSE);}else{//printf("fcntl=%dn",fcntl(fd, F_SETFL,0));}//测试是否为终端设备if(0==isatty(STDIN_FILENO)){printf("standard input is not a terminal devicen");return(FALSE);}returnfd;}voidUART_Close(intfd){close(fd);}/*******************************************************************

* 名称: UART0_Set* 功能: 设置串口数据位,停止位和效验位* 入口参数: fd 串口文件描述符* speed 串口速度* flow_ctrl 数据流控制* databits 数据位 取值为 7 或者8* stopbits 停止位 取值为 1 或者2* parity 效验类型 取值为N,E,O,,S*出口参数: 正确返回为1,错误返回为0*******************************************************************/intUART_Set(intfd,intspeed,intflow_ctrl,intdatabits,intstopbits,intparity){inti;//int status;intspeed_arr[]={B38400,B19200,B9600,B4800,B2400,B1200,B300, B38400,B19200,B9600,B4800,B2400,B1200,B300};intname_arr[]={ 38400,19200,9600,4800,2400,1200,300,38400, 19200,9600,4800,2400,1200,300};structtermios options;/*tcgetattr(fd,&options)得到与fd指向对象的相关参数,并将它们保存于options,该函数,还可以测试配置是否正确,该串口是否可用等。若调用成功,函数返回值为0,若调用失败,函数返回值为1.

*/if(tcgetattr(fd,&options)!=0){ perror("SetupSerial 1");return(FALSE);}//设置串口输入波特率和输出波特率for(i=0;i<sizeof(speed_arr)/sizeof(int);i++){if(speed==name_arr[i]){cfsetispeed(&options,speed_arr[i]);cfsetospeed(&options,speed_arr[i]);}}//修改控制模式,保证程序不会占用串口options.c_cflag|=CLOCAL;//修改控制模式,使得能够从串口中读取输入数据options.c_cflag|=CREAD;//设置数据流控制switch(flow_ctrl){case0://不使用流控制options.c_cflag&=~CRTSCTS;break;case1://使用硬件流控制options.c_cflag|=CRTSCTS;break;case2://使用软件流控制options.c_cflag|=IXON|IXOFF|IXANY;break;}//设置数据位options.c_cflag&=~CSIZE;//屏蔽其他标志位switch(databits){case5:options.c_cflag|=CS5;break;case6:options.c_cflag|=CS6;break;case7:options.c_cflag|=CS7;break;case8:options.c_cflag|=CS8;break;default:fprintf(stderr,"Unsupported data sizen");return(FALSE);}//设置校验位switch(parity){case'n':case'N'://无奇偶校验位。options.c_cflag&=~PARENB;options.c_iflag&=~INPCK;break;case'o':case'O'://设置为奇校验options.c_cflag|=(PARODD|PARENB);options.c_iflag|=INPCK;break;case'e':case'E'://设置为偶校验options.c_cflag|=PARENB;options.c_cflag&=~PARODD;options.c_iflag|=INPCK;break;case's':case'S'://设置为空格options.c_cflag&=~PARENB;options.c_cflag&=~CSTOPB;break;default:fprintf(stderr,"Unsupported parityn");return(FALSE);}// 设置停止位switch(stopbits){case1:options.c_cflag&=~CSTOPB;break;case2:options.c_cflag|=CSTOPB;break;default:fprintf(stderr,"Unsupported stop bitsn");return(FALSE);}//修改输出模式,原始数据输出options.c_oflag&=~OPOST;//设置等待时间和最小接收字符options.c_cc[VTIME]=1;/* 读取一个字符等待1*(1/10)s */options.c_cc[VMIN]=1;/* 读取字符的最少个数为1 *///如果发生数据溢出,接收数据,但是不再读取tcflush(fd,TCIFLUSH);//激活配置 (将修改后的termios数据设置到串口中)if(tcsetattr(fd,TCSANOW,&options)!=0){perror("com set error!/n");return(FALSE);}return(TRUE);}intUART_Init(intfd,intspeed,intflow_ctrlint,intdatabits,intstopbits,charparity){//设置串口数据帧格式if(FALSE==UART_Set(fd,speed,flow_ctrlint,databits,stopbits,parity)){returnFALSE;}else{returnTRUE;}}/*******************************************************************

* 名称: UART0_Recv* 功能: 接收串口数据* 入口参数: fd :文件描述符* rcv_buf :接收串口中数据存入rcv_buf缓冲区中* data_len :一帧数据的长度* 出口参数: 正确返回为1,错误返回为0*******************************************************************/intUART_Recv(intfd,char*rcv_buf,intdata_len){intlen,fs_sel;fd_set fs_read;structtimeval 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,rcv_buf,data_len);returnlen;}else{returnFALSE;}}/*******************************************************************

* 名称: UART0_Send* 功能: 发送数据* 入口参数: fd :文件描述符* send_buf :存放串口发送数据* data_len :一帧数据的个数* 出口参数: 正确返回为1,错误返回为0*******************************************************************/intUART_Send(intfd,char*send_buf,intdata_len){intret;ret=write(fd,send_buf,data_len);if(data_len==ret){returnret;}else{ tcflush(fd,TCOFLUSH);returnFALSE;}}intmain(intargc,char**argv){intfd=FALSE;intret; charrcv_buf[512];inti;if(argc!=2){ printf("Usage: %s /dev/ttySn n",argv[0]);returnFALSE;}fd=UART_Open(fd,argv[1]);if(FALSE==fd){ printf("open errorn"); exit(1);}ret=UART_Init(fd,9600,0,8,1,'N');if(FALSE==fd){ printf("Set Port Errorn"); exit(1);}ret=UART_Send(fd,"*IDN?n",6);if(FALSE==ret){ printf("write error!n"); exit(1);}printf("command: %sn","*IDN?");memset(rcv_buf,0,sizeof(rcv_buf));for(i=0;;i++){ ret=UART_Recv(fd,rcv_buf,512);if(ret>0){ rcv_buf[ret]=''; printf("%s",rcv_buf);}else{ printf("cannot receive data1n");break;}if('n'==rcv_buf[ret-1])break;}UART_Close(fd);return0;}

提醒:《Linux C串口程序》最后刷新时间 2024-03-14 01:02:45,本站为公益型个人网站,仅供个人学习和记录信息,不进行任何商业性质的盈利。如果内容、图片资源失效或内容涉及侵权,请反馈至,我们会及时处理。本站只保证内容的可读性,无法保证真实性,《Linux C串口程序》该内容的真实性请自行鉴别。