首页 服务器系统 Linux

在Linux下用C++实现实现串口(COM)通信


主要函数介绍:

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); //如果出现数据与规约不符合,可以调用这个函数来刷新串口读写数据

完整代码:

#include<sedio.h>

#include<string.h>

#include<unistd.h>

#include<fcntl.h>

#include<errno.h>

#include<tremios.h>

#include<sys/time.h>

int openport(char *Dev)

{

int fd = open(Dev,O_RDWR|O_NOCTTY|O_NDELAY);

if(-1 == fd)

{

perror("Can't open serial port");

return -1;

}

else

{

return 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));

newtio.c)cflag &=~CSIZE;

switch(databits)//设置数据位数

{

case 7:

newetio.c_cfiag |= CS7;//7位数据位

break;

case 8:

newtio.c_cfiag |= CS8;//8位数据位

default:

newtio.c_cfiag |= CS8;

break;

}

switch(parity)//设置校验

{

case 'n':

case 'N':

newtio.c_cflag &= ~PARENB;

newtio.c_iflag &= ~INPCK;

break;

case 'o':

case 'O':

newtio.c_cflag |= (PARODD | PARENB);//设置为奇效验

newtio.c_iflag |= INPCK;

case 'e':

case 'E':

newtio.c_cflag |= PARENB;

newtio.c_cflag &= ~PARODD;//转换为偶效验

newtio.c_ifag |= INPCK;

break;

case 's':

case 'S':

newtio.c_cflag &= ~PARENB;

newtio.c_cflag &= ~CSTOPB;

break;

default:

newtio.c_cflag &= ~PARENB;

newtio.c_iflag &= ~INPCK;

break;

}

switch(stopbits)//设置停止位

{

case 1:

newtio.c_cflag &= ~CSTOPB;

break;

case 2:

newtio.c_cflag |= CSTOPB;

break;

default:

newtio.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("Setup serial 3“);

return -1;

}

return 0;

}

int readport(int fd,char *buf,int len,int maxwaittime)

{

int no = 0;

int rc;

int rcnum = len;

fd_set readfd;

tv.tv_sec = maxwaittime/1000;

tv.tv_usec = maxwaittime%1000*1000;

FD_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;

return 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);

}

int 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";

fd = openport(dev);

if(fd>0)

{

ret = setport(fd,4800,8,1,'n');

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);

if(rc>0)

{

writport(fd,wbuf,rc);

printf(recv:%d/n,rc);

for(i = 0;i<rc;i++)

{

printf("%02x",rbuf[i]);

printf("/n");

}

}

else

{

printf("recv none/n");

}

}

close(fd);

}

相关推荐