serial redirection
2018-06-18 04:21:08来源:未知 阅读 ()
1 int setOption(int fd,int nSpeed, int nBits, char mode,char nEvent, int nStop) 2 { 3 struct termios newtio; 4 bzero( &newtio, sizeof( newtio ) ); 5 newtio.c_cflag |= CLOCAL | CREAD; 6 newtio.c_cflag &= ~CSIZE; 7 8 switch( nBits ) 9 { 10 case 7: 11 newtio.c_cflag |= CS7; 12 break; 13 case 8: 14 newtio.c_cflag |= CS8; 15 break; 16 } 17 switch( mode ) 18 { 19 case 'S': 20 newtio.c_lflag |= ICANON; 21 newtio.c_lflag |= ECHO; 22 newtio.c_cc[VMIN] = 0; 23 newtio.c_cc[VTIME] = 0; 24 break; 25 case 'N': 26 newtio.c_lflag &= ~ICANON; 27 newtio.c_lflag &= ~ECHO; 28 newtio.c_lflag |= ECHOE; 29 newtio.c_oflag |= ONLCR; 30 newtio.c_oflag |= OPOST; 31 newtio.c_cc[VMIN] = 1; 32 newtio.c_cc[VTIME] = 0; 33 break; 34 case 'M': 35 newtio.c_lflag &= ~ICANON; 36 newtio.c_lflag &= ~ECHO; 37 newtio.c_lflag |= ECHOE; 38 newtio.c_oflag |= ONLCR; 39 newtio.c_oflag |= OPOST; 40 newtio.c_cc[VMIN] = 1; 41 newtio.c_cc[VTIME] = 0; 42 break; 43 44 default: 45 break; 46 } 47 switch( nEvent ) 48 { 49 case 'O': 50 newtio.c_cflag |= PARENB; 51 newtio.c_cflag |= PARODD; 52 newtio.c_iflag |= (INPCK | ISTRIP); 53 break; 54 case 'E': 55 newtio.c_iflag |= (INPCK | ISTRIP); 56 newtio.c_cflag |= PARENB; 57 newtio.c_cflag &= ~PARODD; 58 break; 59 case 'N': 60 newtio.c_cflag &= ~PARENB; 61 break; 62 } 63 64 switch( nSpeed ) 65 { 66 case 2400: 67 cfsetispeed(&newtio, B2400); 68 cfsetospeed(&newtio, B2400); 69 break; 70 case 4800: 71 cfsetispeed(&newtio, B4800); 72 cfsetospeed(&newtio, B4800); 73 break; 74 case 9600: 75 cfsetispeed(&newtio, B9600); 76 cfsetospeed(&newtio, B9600); 77 break; 78 case 115200: 79 cfsetispeed(&newtio, B115200); 80 cfsetospeed(&newtio, B115200); 81 break; 82 default: 83 cfsetispeed(&newtio, B9600); 84 cfsetospeed(&newtio, B9600); 85 break; 86 } 87 if ( nStop == 1 ) 88 { 89 newtio.c_cflag &= ~CSTOPB; 90 } 91 else if ( nStop == 2 ) 92 { 93 newtio.c_cflag |= CSTOPB; 94 } 95 tcflush(fd,TCIFLUSH); 96 if ((tcsetattr(fd,TCSANOW,&newtio))!=0) 97 { 98 perror("com set error"); 99 return -1; 100 } 101 return 0; 102 } 103 104 void exitBmconsole(int signum) 105 { 106 char muxName[5]={0x00}; 107 tcflush(console_fd,TCIFLUSH); 108 tcflush(uart3_fd,TCIFLUSH); 109 resetConsoleConfig(); 110 111 dup2(oldstdin,0); 112 dup2(oldstdout,1); 113 close(uart3_fd); 114 close(console_fd); 115 muxClearAll(i2cfd_mux, MUX_SLAVE_ADDR); 116 close(i2cfd_mux); 117 118 sprintf(muxName,"MUX%d",gMuxId); 119 setInUseFlag(muxName,0); 120 exit(0); 121 } 122 123 void *MuxOutputToCom5(void) 124 { 125 int nread; 126 char buff[MAX_BUFF_LEN+1]; 127 if ((setOption(uart3_fd,115200,8,'N','N',1))<0) 128 { 129 perror("setOption error"); 130 pthread_exit(NULL); 131 } 132 while(1) 133 { 134 memset(buff,0,sizeof(char)*( MAX_BUFF_LEN + 1 )); 135 nread = 0; 136 nread = read(uart3_fd,buff,MAX_BUFF_LEN); 137 if (nread >0) 138 { 139 if(buff[0] == 10 && buff[1] == 10) 140 { 141 write(console_fd,&buff[1],nread); 142 } 143 else 144 { 145 write(console_fd,buff,nread); 146 } 147 } 148 } 149 150 pthread_exit(NULL); 151 } 152 153 void *Com5InputToMux(void) 154 { 155 int nread,result; 156 char buff[MAX_BUFF_LEN+1]; 157 char inputBuff[TEMP_ST_LEN+1]; 158 int inputNumber = 0; 159 FILE *stream; 160 int recievExitFlag = 0; 161 162 if ((stream= freopen("/usr/std.in","w+",stdin)) == NULL) 163 { 164 printf("freopen stdin fail\n"); 165 kill(getpid(),SIGINT); 166 } 167 if ((stream = freopen("/usr/std.out","w+",stdout))== NULL) 168 { 169 printf("freopen stdout fail\n"); 170 kill(getpid(),SIGINT); 171 } 172 if ((result = setOption(console_fd,115200,8,'M','N',1))<0) 173 { 174 perror("set console_fd opt error"); 175 kill(getpid(),SIGINT); 176 } 177 memset(inputBuff,0,sizeof(char)*( TEMP_ST_LEN+1 )); 178 179 while(1) 180 { 181 memset(buff,0,sizeof(char)*( MAX_BUFF_LEN +1 )); 182 183 nread = read(console_fd,buff,MAX_BUFF_LEN); 184 if (nread > 0) 185 { 186 if( recievExitFlag == 1) 187 { 188 if( (nread != 1) || (inputNumber == 1 && nread == 1 && buff[0] != LOWER_Q_ASCII) || ( inputNumber == 2 && nread == 1 && buff[0] != CR_ASCII) ) 189 { 190 inputNumber = 0; 191 recievExitFlag = 0; 192 memset(inputBuff,0,sizeof(char)*TEMP_ST_LEN); 193 } 194 } 195 if (nread == 1) 196 { 197 if (buff[0] == CR_ASCII) 198 { 199 if (inputNumber == 0x02 && inputBuff[0] == QUIT_IDENTIFY_ASCII && inputBuff[1] == LOWER_Q_ASCII)/*quit bmconsole*/ 200 { 201 exitBmconsole(0); 202 } 203 memset(inputBuff,0,sizeof(char)*TEMP_ST_LEN); 204 inputNumber = 0; 205 recievExitFlag = 0; 206 } 207 if (inputNumber > MAX_BUFF_LEN) 208 { 209 memset(inputBuff,0,sizeof(char)*TEMP_ST_LEN); 210 inputNumber = 0; 211 } 212 if ( buff[0] == QUIT_IDENTIFY_ASCII ) 213 { 214 recievExitFlag = 1; 215 } 216 if ( recievExitFlag == 1) 217 { 218 inputBuff[inputNumber++] = buff[0]; 219 } 220 } 221 if (recievExitFlag != 1) 222 { 223 write(uart3_fd,buff,nread); 224 } 225 } 226 } 227 pthread_exit(NULL); 228 }
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
- 模板大全 2020-04-30
- 从Point类继承的Circle类 代码参考 2020-04-21
- C++ 初始化 2020-03-26
- CodeForces 1313E Concatenation with intersection 2020-03-02
- C++读入优化 2020-01-28
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash