zoukankan      html  css  js  c++  java
  • serial redirection

      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
    ");
    165         kill(getpid(),SIGINT);
    166     }
    167     if ((stream = freopen("/usr/std.out","w+",stdout))== NULL)
    168     {
    169         printf("freopen stdout fail
    ");
    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 }
    View Code
  • 相关阅读:
    Hadoop源代码分析(五)
    使用Solr Data Import的deltaimport功能
    hbasewriter
    Hadoop源代码分析(四)
    lucene .NET 搜索图片 功能实现
    char类型与string类型的区别
    Windows程序设计:'SM_ MOUSEWHEELPRESENT' : undeclared identifier解决办法
    汇编里的栈空间
    在汇编源程序中,数据不能以字母开头
    中值
  • 原文地址:https://www.cnblogs.com/chaozhu/p/5586898.html
Copyright © 2011-2022 走看看