原文转自:http://blog.csdn.net/yeqishi/article/details/5532002
/* ************************************************************************* *** 程序说明:示例程序演示了2440平台下linux串口应用开发,可实现2440串口2与串口3的通讯 *** 硬件设置:将2440板子上的串口2、3TXD、RXD交叉短接 *** 编译运行:在宿主机上编译程序源码,打开超级终端(可与2440进行命令交互), *** 在2440平台上打开串口终端,设置端口为ttySAC1,B15200,8bit DATA *** 结果验证:Com communicate start please send data to meThe data you send back
have reveived data
succeed!and com was closed ************************************************************************* */ #include<stdio.h>
#include<string.h>
#include<sys/types.h>
#include<errno.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<unistd.h>
#include<termio.h>
#include<stdlib.h> int set_opt(int fd,int nSpeed,int nBits,char nEvent,int nStop); int open_port(int fd,int comport); int main(void)
{ int fd;
int nread,i;
char vcCom_start[]="Com communicate start/n";
char vcCom_wait[]="please send data to me/n";
char vcCom_rece[20];
char vcCom_OKmsg[]="have reveived data/n";
char vcCom_over[]="succeed!and com was closed/n";
if((fd = open_port(fd,3))<0) { perror("open_port error");
return;
}
if((i = set_opt(fd,115200,8,'N',1))<0)
{ perror("set_opt error");
return;
}
printf("fd = %d/n",fd);
write(fd,vcCom_start,sizeof(vcCom_start)); //start com communication (comA send to comB)
write(fd,vcCom_wait,sizeof(vcCom_wait)); //messsge:wait for the comB send data back to comA do //wait for the comB send data back to comA
{ nread = read(fd,vcCom_rece,20);
}while(nread==0);
vcCom_rece[nread++] = '/n'; write(fd,vcCom_OKmsg,sizeof(vcCom_OKmsg)); //message:comA had received comB's data
write(fd,vcCom_rece,nread); //show the received data
write(fd,vcCom_over,sizeof(vcCom_over)); //com comumunication over
close(fd);
return;
} int set_opt(int fd,int nSpeed,int nBits,char nEvent,int nStop)
{ struct termios newtio,oldtio;
if(tcgetattr(fd,&oldtio)!=0)
{ perror("SetupSerial 1");
return -1;
}
bzero(&newtio,sizeof(newtio)); newtio.c_cflag |= CLOCAL | CREAD;
newtio.c_cflag &= ~CSIZE; switch(nBits)
{ case 7 :
newtio.c_cflag |= CS7;
break;
case 8 :
newtio.c_cflag |= CS8;
break;
} switch(nEvent)
{ case 'N' :
newtio.c_cflag &= ~PARENB;
break;
case 'O' :
break;
} /*set baud rate*/
switch(nSpeed)
{ case 2400 :
cfsetispeed(&newtio,B2400);
cfsetospeed(&newtio,B2400);
break;
case 115200 :
cfsetispeed(&newtio,B115200);
cfsetospeed(&newtio,B115200);
break;
default :
cfsetispeed(&newtio,B9600);
cfsetospeed(&newtio,B9600);
break;
} /*set stopbit*/
if(nStop == 1)
{ newtio.c_cflag &= ~CSTOPB;
}
else if(nStop == 2)
{ newtio.c_cflag |= CSTOPB;
} newtio.c_cc[VTIME] = 0;
newtio.c_cc[VMIN] = 0; tcflush(fd,TCIFLUSH); if((tcsetattr(fd,TCSANOW,&newtio))!=0)
{ perror("com set error");
return -1;
} printf("set done!/n"); return 0; }
int open_port(int fd,int comport)
{ long vdisable;
if(comport == 1)
{ fd = open("/dev/ttySAC0",O_RDWR|O_NOCTTY|O_NDELAY);
if(fd == -1)
{ perror("Can't Open Serial Port");
return -1;
}
}
else if(comport == 2)
{ fd = open("/dev/ttySAC1",O_RDWR|O_NOCTTY|O_NDELAY);
if(fd == -1)
{ perror("Can't Open Serial Port");
return -1;
}
}
else if(comport == 3)
{ fd = open("/dev/ttySAC2",O_RDWR|O_NOCTTY|O_NDELAY);
if(fd == -1)
{ perror("Can't Open Serial Port");
return -1;
}
} if(fcntl(fd,F_SETFL,0)<0)
{ printf("fcntl failed!/n");
}
else
{ printf("fcntl = %d/n",fcntl(fd,F_SETFL,0));
}
if(isatty(STDIN_FILENO)==0)
{ printf("standard input is not a terminal device/n");
}
else
{ printf("isatty success!/n");
}
printf("fd-open = %d/n",fd);
return fd;
}