#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <unistd.h>
#include <errno.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <termios.h>
int set_opt(int fd, int nSpeed, int nBits, char nEvent, int nStop)
{
struct termios newtio,oldtio;
if(tcgetattr(fd,&oldtio) != 0 )
{
perror("setup serial 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 'O':
newtio.c_cflag |= PARENB;
newtio.c_cflag |= PARODD;
newtio.c_iflag |= (INPCK|ISTRIP);
break;
case 'E':
newtio.c_iflag |= (INPCK|ISTRIP);
newtio.c_cflag |= PARENB;
newtio.c_cflag &= ~PARODD;
break;
case 'N':
newtio.c_cflag &= ~PARENB;
break;
}
switch (nSpeed)
{
case 9600:
cfsetispeed(&newtio, B9600);
cfsetospeed(&newtio, B9600);
break;
case 115200:
cfsetispeed(&newtio, B115200);
cfsetospeed(&newtio, B115200);
break;
default:
cfsetispeed(&newtio, B115200);
cfsetospeed(&newtio, B115200);
break;
}
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)
{
// char *dev[] = {"/dev/tq240_serial0","/dev/tq2440_serial1","/dev/tq2440_serial2"};
// long vdisable;
if(comport == 1)
{
fd = open ("/dev/tq2440_serial0",O_RDWR|O_NOCTTY|O_NDELAY);
if(-1 == fd )
{
perror("Can't Open Serial Port");
return -1;
}
}
else if(comport == 2)
{
//fd = open("/dev/tq2440_serial1",O_RDWR|O_NOCTTY|O_NDELAY);
fd = open("/dev/tq2440_serial1",O_RDWR|O_NDELAY);
if(-1 == fd)
{
perror("Can't Open Serial Port");
return (-1);
}
}
else if(comport == 3)
{
fd = open("/dev/tq2440_serial2",O_RDWR|O_NOCTTY|O_NDELAY);
if (-1 == fd)
{
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 termina device /n");
else
printf("isatty success! /n" );
printf("fd-open=%d/n", fd );
return fd;
}
/*
* Constructs a first which is a child of 'parent', with the
* name 'name' and widget flags set to 'f'
*/
int main()
{
fd_set fds;
int fd ;
int retval;
int nread,nwrite, i;
char buff[]="hello/n";
char revff[10];
if((fd=open_port(fd,2)) < 0 )
{
perror("open_port error ");
return ;
}
printf("fd=%d/n",fd);
if((i = set_opt(fd, 115200, 8, 'N', 1)) < 0)
{
perror("set_opt error");
return;
}
printf("fd=%d/n",fd);
//fd = 3;
nwrite=write(fd,buff,8);
printf("nwrite=%d,%s/n",nwrite,buff);
FD_ZERO(&fds);
FD_SET(fd,&fds);
retval=select(fd+1,&fds,NULL,NULL,NULL);
if(FD_ISSET(fd, &fds))
{
nread=read(fd,revff,8);
printf("nread=%d,%c/n",nread,revff[0]);
}
fflush(NULL);
close(fd);
}