2440平台下linux串口开发源码示例(2440双串口间通信)
/***************************************************************************** 程序说明:示例程序演示了2440平台下linux串口应用开发,可实现2440串口2与串口3的通讯*** 硬件设置:将2440板子上的串口2、3TXD、RXD交叉短接*** 编译运行:在宿主机上编译程序源码,打开超级终端(可与2...
/*
*************************************************************************
*** 程序说明:示例程序演示了2440平台下linux串口应用开发,可实现2440串口2与串口3的通讯
*** 硬件设置:将2440板子上的串口2、3TXD、RXD交叉短接
*** 编译运行:在宿主机上编译程序源码,打开超级终端(可与2440进行命令交互),
*** 在2440平台上打开串口终端,设置端口为ttySAC1,B15200,8bit DATA
*** 结果验证:Com communicate start
please send data to me
The 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;
}
更多推荐
所有评论(0)