#include #include #include #include #include #include #include #include //#include #include #include #include static volatile sig_atomic_t doneflag = 0; static void setdoneflag(int signo) { doneflag = 1; } static int initSig(void) { struct sigaction act; act.sa_handler = setdoneflag; act.sa_flags = 0; if((sigemptyset(&act.sa_mask) == -1)|| (sigaction(SIGINT,&act,NULL) == -1)) { perror("Failed to set SIGINT handler"); return 1; } return 0; } int setSerial(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)); //1:Setting char size newtio.c_cflag |= CLOCAL | CREAD; newtio.c_cflag &= ~CSIZE; //2:Setting bits switch(nBits) { case 7: newtio.c_cflag |= CS7; break; case 8: newtio.c_cflag |= CS8; break; } //3:Setting parity switch(nEvent) { case 'O': newtio.c_cflag |= PARENB; newtio.c_cflag |= PARODD; newtio.c_cflag |= (INPCK | ISTRIP); break; case 'E': newtio.c_cflag |= (INPCK | ISTRIP); newtio.c_cflag |= PARENB; newtio.c_cflag &= ~PARODD; break; case 'N': newtio.c_cflag &= ~PARENB; break; } //4:Setting speed switch(nSpeed) { case 2400: cfsetispeed(&newtio,B2400); cfsetospeed(&newtio,B2400); break; case 4800: cfsetispeed(&newtio,B4800); cfsetospeed(&newtio,B4800); break; case 9600: cfsetispeed(&newtio,B9600); cfsetospeed(&newtio,B9600); break; case 115200: cfsetispeed(&newtio,B115200); cfsetospeed(&newtio,B115200); break; case 460800: cfsetispeed(&newtio,B460800); cfsetospeed(&newtio,B460800); break; default: cfsetispeed(&newtio,B115200); cfsetospeed(&newtio,B115200); break; } //5:Setting stop bits switch(nStop) { case 1: newtio.c_cflag &= ~CSTOPB; break; case 2: newtio.c_cflag |= CSTOPB; break; } //6:Setting recvice timeout and mini bytes size of recvice newtio.c_cc[VTIME] = 0; newtio.c_cc[VMIN] = 0; //7:flush input and output buffer tcflush(fd,TCIOFLUSH); if(tcsetattr(fd,TCSANOW,&newtio) != 0) { perror("serial set error"); return 2; } printf("serial setting done\n"); return 0; } int openSerial(int fd,unsigned char *SerialName) { fd = open(SerialName,O_RDWR|O_NOCTTY|O_NDELAY); if(fd <0) { perror("open"); return fd; } #if 1 if(fcntl(fd,F_SETFL,0) < 0) printf("fcntl failed!\n"); else printf("fcntl=%d\n",fcntl(fd,F_SETFL,0)); #endif return fd; } int rwTest(int fd) { int rLen=0,wLen=0,ret=0; unsigned char buf[3000]; unsigned int i=0,j=0; unsigned int r_count=0; #if 1 fd_set rd; FD_ZERO(&rd); FD_SET(fd,&rd); #endif while(doneflag ==0) { #if 1 while(!FD_ISSET(fd,&rd)); if(select(fd+1,&rd,NULL,NULL,NULL) <0) continue; #endif rLen= read(fd,buf,sizeof(buf)); if(rLen < 0) { perror("read"); return 1; } if(rLen == 0) { //sleep(1); // printf("sleep\n"); continue; } //r_count++; //if(r_count%100 == 0) // printf("rLen:%d\n",rLen); wLen = 0; for(j=0;j<5;j++) { ret = write(fd, buf + wLen, rLen - wLen); if(ret < 0) { perror("write"); return 2; } wLen += ret; if(wLen == rLen) break; } if(wLen == rLen) { //if(r_count%100 ==0) // printf("wLen:%d\n",wLen); } else { printf("write err 1\n"); return 3; } } return 0; } int main(int argc, char *argv[]) { int fd; int flags; int ret; unsigned char SerialName[30]={0}; printf("Version:%s\n","2010.12.30_00"); if(argc == 1) { strcpy(SerialName,"/dev/ttyPos0"); } else if(argc == 2) { strcpy(SerialName,argv[1]); } else { printf("ARG ERROR\n"); return 1; } printf("SerialName:%s\n",SerialName); ret = initSig(); if(ret) return ret; fd = openSerial(fd,SerialName);//open(SerialName,O_RDWR); if(fd <0) { exit(1); } ret = setSerial(fd,115200,8,'N',1); if(ret != 0) { printf("setSerial:%d\n"); goto byebye; } if(ioctl(fd,TIOCMGET,&flags)<0) { perror("ioctl failed"); goto byebye; } printf("flags:%X\n",flags); ret = rwTest(fd); printf("rwTest:%d\n",ret); byebye: printf("doneflag:%d\n",doneflag); ret = close(fd); if(ret <0) { perror("close"); } else { printf("close success!\n"); } exit(0); }