#1
  1. No Profile Picture
    Registered User
    Devshed Newbie (0 - 499 posts)

    Join Date
    Mar 2013
    Posts
    1
    Rep Power
    0

    Serial programming using termios


    Hi guys
    I'm trying to connect to CISCO router using termios. So I decided to have two threads one for reading data and the other one for writing data.
    And here's my code :

    Code:
    int mainfd=0;
    char ch[2] = {NULL};
    
    void *write(void *)
    {
        char temp;
        while(1)
        {
            temp = getchar();
            ch[0] = temp;   ch[1] = '\0';
            if(temp == '~')
            {
                printf("connection closed.\r\n");
                close(mainfd);
                pthread_exit(NULL);
            }
            check=write(mainfd, ch, 1);
            ch[0]='\0';
        }
    }
    
    void *read(void *)
    {
        char outputbuffer[10000]= {0};
        while(1)
        {
                    outputbuffer[0]='\0';
                    int charnumber=read(mainfd, &outputbuffer, sizeof(outputbuffer));
                    outputbuffer[charnumber] = '\0';
                    printf("%s",outputbuffer);
                    outputbuffer[0] = '\0';
        }
    }
    
    int main(int argc,char *argv[])
    {
        //////////////////
        struct termios old = {0};
        if (tcgetattr(0, &old) < 0)
            perror("tcsetattr()");
        old.c_lflag &= ~ICANON;
        old.c_lflag &= ~ECHO;
        old.c_cc[VMIN] = 1;
        old.c_cc[VTIME] = 0;
        if (tcsetattr(0, TCSANOW, &old) < 0)
             perror("tcsetattr ICANON");
        //////////////////
        struct termios options;
        static int portnum=atoi(argv[1]);
    
        mainfd = open_port(portnum);
    
        fcntl(mainfd, F_SETFL, FNDELAY);  
        tcgetattr(mainfd, &options);
        cfsetspeed(&options, speed);
        options.c_cflag |= (CLOCAL | CREAD);
        options.c_cflag &= ~PARENB;
        options.c_cflag |= CSTOPB;
    
        options.c_cflag &= ~CSIZE;
        options.c_cflag |=  CS8;
        options.c_cflag &= ~CRTSCTS;
        options.c_iflag &= ~(ISTRIP|ICRNL);
        options.c_oflag &= ~OPOST;
        options.c_lflag &= ~(ICANON|ISIG|IEXTEN|ECHO);
        options.c_cc[VMIN] = 1;
        options.c_cc[VTIME] = 0;
        //
        tcsetattr(mainfd, TCSAFLUSH, &options);
        pthread_t threads[2];
        pthread_create(&threads[0], NULL, write, NULL);
        pthread_create(&threads[1], NULL, read, NULL);
        pthread_exit(NULL);
    }
    The problem is that I have to add sleep(2) (at least 2s) after write user input to the port (line 17 I think) otherwise the output would not be what I expect. Without this sleep command, every character I type, the output is shown with next character not at time :
    Code:
    Router>
    Router>abc // While I typed "abcd". If I continue with typing "e", then the output will be "abcd" and so on ...
    How can I fix this?
  2. #2
  3. Contributed User
    Devshed Specialist (4000 - 4499 posts)

    Join Date
    Jun 2005
    Posts
    4,379
    Rep Power
    1871
    http://cboard.cprogramming.com/linux...g-termios.html
    How many other places should we check for duplicate answers?
    If you dance barefoot on the broken glass of undefined behaviour, you've got to expect the occasional cut.
    If at first you don't succeed, try writing your phone number on the exam paper

IMN logo majestic logo threadwatch logo seochat tools logo