Thread: serial programming using termios

  1. #1
    Registered User
    Join Date
    Mar 2013
    Posts
    1

    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?
    Last edited by xubin; 03-17-2013 at 01:06 AM.

Popular pages Recent additions subscribe to a feed

Similar Threads

  1. Termios question
    By thesourcehim in forum Linux Programming
    Replies: 1
    Last Post: 07-09-2008, 03:27 AM
  2. Problem with Termios and a tty
    By acpi in forum C Programming
    Replies: 1
    Last Post: 08-27-2007, 11:41 PM
  3. Termios Flags Rs232 Serial Ttys0 Modbus Rtu
    By Mighty-D in forum Linux Programming
    Replies: 2
    Last Post: 10-31-2006, 11:53 AM
  4. Serial Programming
    By gvector1 in forum Networking/Device Communication
    Replies: 3
    Last Post: 07-16-2003, 06:32 PM
  5. Serial programming
    By stovellp in forum C++ Programming
    Replies: 6
    Last Post: 01-20-2003, 12:29 PM