LINUX 串口通讯源码

主要函数

int openport(char *Dev) //打开串口

int setport(int fd, int baud,int databits,int stopbits,int parity)//设置串口,波特率,数据位,停止位,校验

int readport(int fd,char *buf,int len,int maxwaittime)//读数据,参数为串口,BUF,长度,超时时间

int writeport(int fd,char *buf,int len)//发送数据

void clearport(int fd)//如果出现数据与规约不符合,可以调用这个函数来刷新串口读写数据

如果有BUG,请大家及时回复给我,EMAIL:41063473@QQ.COM。

#include <stdio.h> #include <string.h> #include <unistd.h> #include <fcntl.h> #include <errno.h> #include <termios.h> #include <sys/time.h> int openport(char *Dev) {intfd = open( Dev, O_RDWR|O_NOCTTY|O_NDELAY ); if (-1 == fd){ perror("Can”t Open Serial Port");return -1;}elsereturn fd;

} int setport(int fd, int baud,int databits,int stopbits,int parity){int baudrate;struct termios newtio; switch(baud){case 300:baudrate=B300;break;case 600:baudrate=B600;break;case 1200:baudrate=B1200;break;case 2400:baudrate=B2400;break;case 4800:baudrate=B4800;break;case 9600:baudrate=B9600;break;case 19200:baudrate=B19200;break;case 38400:baudrate=B38400;break;default :baudrate=B9600;break;}tcgetattr(fd,&newtio); bzero(&newtio,sizeof(newtio)); //setting c_cflag newtio.c_cflag &=~CSIZE; switch (databits) /*设置数据位数*/{ case 7:newtio.c_cflag |= CS7; //7位数据位break;case 8: newtio.c_cflag |= CS8; //8位数据位break; default: newtio.c_cflag |= CS8;break; }switch (parity) //设置校验{ case ‘n’:case ‘N’: newtio.c_cflag &= ~PARENB; /* Clear parity enable */newtio.c_iflag &= ~INPCK; /* Enable parity checking */ break; case ‘o’: case ‘O’: newtio.c_cflag |= (PARODD | PARENB); /* 设置为奇效验*/ newtio.c_iflag |= INPCK; /* Disnable parity checking */ break; case ‘e’: case ‘E’: newtio.c_cflag |= PARENB; /* Enable parity */ newtio.c_cflag &= ~PARODD; /* 转换为偶效验*/ newtio.c_iflag |= INPCK; /* Disnable parity checking */break;case ‘S’: case ‘s’: /*as no parity*/ newtio.c_cflag &= ~PARENB;newtio.c_cflag &= ~CSTOPB;break; default: newtio.c_cflag &= ~PARENB; /* Clear parity enable */newtio.c_iflag &= ~INPCK; /* Enable parity checking */ break; } switch (stopbits)//设置停止位{ case 1: newtio.c_cflag &= ~CSTOPB; //1break; case 2: newtio.c_cflag |= CSTOPB; //2 break;default: newtio.c_cflag &= ~CSTOPB; break; } newtio.c_cc[VTIME] = 0; newtio.c_cc[VMIN] = 0; newtio.c_cflag |= (CLOCAL|CREAD);newtio.c_oflag|=OPOST; newtio.c_iflag &=~(IXON|IXOFF|IXANY); cfsetispeed(&newtio,baudrate); cfsetospeed(&newtio,baudrate); tcflush(fd, TCIFLUSH); if (tcsetattr(fd,TCSANOW,&newtio) != 0) { perror("SetupSerial 3"); return -1; } return 0;}int readport(int fd,char *buf,int len,int maxwaittime)//读数据,参数为串口,BUF,长度,超时时间{int no=0;int rc;int rcnum=len;struct timeval tv;fd_set readfd;tv.tv_sec=maxwaittime/1000;//SECONDtv.tv_usec=maxwaittime%1000*1000;//USECONDFD_ZERO(&readfd);FD_SET(fd,&readfd);rc=select(fd+1,&readfd,NULL,NULL,&tv);if(rc>0){while(len){rc=read(fd,&buf[no],1);if(rc>0)no=no+1;len=len-1;}if(no!=rcnum)return -1;//如果收到的长度与期望长度不一样,返回-1return rcnum;//收到长度与期望长度一样,返回长度}else{return -1;}return -1;}int writeport(int fd,char *buf,int len)//发送数据{write(fd,buf,len);}void clearport(int fd)//如果出现数据与规约不符合,可以调用这个函数来刷新串口读写数据{tcflush(fd,TCIOFLUSH);}main() { int fd,rc,i,ret; unsigned char rbuf[256]; unsigned char wbuf[256]="";for(i=0;i<256;i++)wbuf[i]=i;char *dev ="/dev/ttyS0";//串口号 /dev/ttyS0 对应于串口1 fd = openport(dev);//打开串口if(fd>0){ret=setport(fd,4800,8,1,’o’);//设置串口,波特率,数据位,停止位,校验if(ret<0){printf("Can’t Set Serial Port!/n");exit(0);}}else{printf("Can’t Open Serial Port!/n");exit(0);}while(1){ rc=readport(fd,rbuf,5,500);//读取5个字节,超时时间为500毫秒if(rc>0){writeport(fd,wbuf,rc);printf("recv:%d/n",rc);for(i=0;i<rc;i++)printf("%02x ",rbuf[i]);printf("/n");}elseprintf("recv none/n"); } close(fd); }

当眼泪流尽的时候,留下的应该是坚强。

LINUX 串口通讯源码

相关文章:

你感兴趣的文章:

标签云: