串口重定向
2015-10-30 10:38
204 查看
#include <stdio.h> #include <string.h> #include <sys/types.h> #include <errno.h> #include <sys/stat.h> #include <fcntl.h> #include <unistd.h> #include <termios.h> #include <stdlib.h> #include <signal.h> extern int fd; extern int fd5; char g_buff[512]; int g_nread = 0; int set_option(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 '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 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; default: cfsetispeed(&newtio, B9600); cfsetospeed(&newtio, B9600); 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; } return 0; } void *MuxOutputToCom5(void) { int nread,i; char buff[512]; char *write_buff; if((i = set_option(fd,115200,8,'N',1))<0) { perror("set_opt error"); return; } while(1) { memset(buff,0,sizeof(char)*512); nread = 0; nread = read(fd,buff,256); if(nread >0) { if(1 == g_nread && buff[0] == 13 && buff[1] == 10) { write_buff = &buff[g_nread+1]; nread = strlen(write_buff); nread = write(fd5,write_buff,nread); } else if( g_nread > 1 && 0 == strncmp(g_buff,buff,g_nread-1)) { write_buff = &buff[g_nread+1]; nread = write(fd5,write_buff,nread-g_nread-1); } else { write_buff = buff; nread = strlen(write_buff); nread = write(fd5,write_buff,nread); } } } close(fd); return; } void *Com5InputToMux(void) { int oldstdin,oldstdout; int nread,i; char buff[512]; int uartid ; oldstdin = dup(0); oldstdout = dup(1); FILE *stream; if((stream= freopen("/usr/std.in","w+",stdin)) == NULL) { printf("freopen stdin fail\n"); kill(getpid(),SIGINT); } if((stream = freopen("/usr/std.out","w+",stdout))== NULL) { printf("freopen stdout fail\n"); kill(getpid(),SIGINT); } if((i = set_option(fd,115200,8,'N',1))<0) { perror("set_opt error"); kill(getpid(),SIGINT); } while(1) { memset(buff,0,sizeof(char)*512); nread = read(fd5,buff,256); if(nread > 0) { g_nread = 0; memset(g_buff,0,sizeof(char)*512); g_nread = strlen(buff); strncpy(g_buff,buff,g_nread); if(nread == 0x03 &&buff[0] == 0x1b && buff[1] == 0x71) { dup2(oldstdin,0); dup2(oldstdout,1); close(fd); close(fd5); kill(getpid(),SIGINT); } else { nread = write(fd,buff,nread); } } } return; }
相关文章推荐
- 串口重定向
- 交换相邻法(2)
- spark on hive
- JAVA中常用数据类型转换
- USB Type-C 接口优点
- Vector:可以往里添加任何类型的字段
- Android UI之EditText注意点收集
- Log4Net Layout使用以及扩展
- iOS拨打电话的三种方法
- Hadoop Map/Reduce教程
- 如何查看本机路由表并进行分析?
- spring mvc 文件上传 form表单
- jquery API
- GCT总结回顾战略
- 【LeetCode从零单刷】Kth Smallest Element in a BST
- UIImage加载图片的几种方式
- android项目开发之单元测试
- 超实用PHP函数总结整理
- pulltorefresh的使用