在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);
}
相关推荐
-
「PHP」MVC框架是什么?为什么要用它2025-02-25 00:25:41
-
如何用PHP写一个比较安全的API系统(实现)2025-02-25 00:19:49
-
php 解析url获取相关信息2025-02-25 00:15:37
-
mysql命令总结和PyMysql2025-02-25 00:11:35
-
MySQL特性:深入理解ICP2025-02-25 00:11:07