serial programming using termios

Hi guys
Im 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 heres my 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);
}
 Edit & Run


The problem is that I have to add sleep(2) (at least 2s) after line number 17
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 :
1
2
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 ?
 Mar 22, 2013 at 2:54am
tcs (519)
Hmmm...

Everything seems to be ok. I cannot find a bug by code review only. As my computer doesnt has a serial communication line, I cannot try it in practice.

May be your router doesnt echo a character received as soon as possible? F.e. it may use its own VTIME > 0 or CR/LF as read termination condition?

(The only optimization may be to omit the NUL termination in line 10. You may use &tmp instead of ch as parameter to write(2). But this surely has nothing to do with your question).
 Mar 22, 2013 at 4:31am
kooth (743)
Try setting c_cc[ VTIME] = 1 instead of zero and see what that does.
 Apr 6, 2013 at 2:26pm
xubin (9)
I still have the problem. Ive tested many ways, but the problem still remains. Im gonna give up :(
Do you guys have any ideas?

 

serial programming using termios

上一篇:微信小程序开发(一)-----工具的安装


下一篇:微信页面开发 第三次总结