无法通过linux串口读取

时间:2014-03-26 04:01:35

标签: c linux

您好我已经在c中编写了一个程序来与/ dev / ttyS0进行通信。当我写的时候我能够做到这一点但是我得到了错误:资源暂时不可用,-1从read()返回。你能检查一下我做错了吗?该端口应该是半双工,9600bps,8N1,以及4ms的字节间延迟。任何人都可以告诉我如何设置字节间延迟(以毫秒为单位)。以下是我的代码。

  #include<stdio.h>
    #include<termios.h>
    #include<fcntl.h>
    #include<unistd.h>
    #include<errno.h>


    #define BAUDRATE B9600
    #define PORT "/dev/ttyS0"

    int main()
    {
        struct termios new_tio,old_new_tio;
        int fd;
        unsigned char msgS[5]="",msgR[10]="";

        fd = open(PORT,O_RDWR|O_NOCTTY|O_NDELAY);
        if(fd == -1)
            printf("Failed to open PORT: %s  \n\n",PORT);
        perror("Error:");
        tcgetattr(fd,&old_new_tio);
        memset(&new_tio,0,sizeof(new_tio));

        new_tio.c_cflag = BAUDRATE|CS8|CLOCAL|CREAD|CSIZE|PARENB;
        new_tio.c_oflag = 0;
        new_tio.c_iflag = 0;
        new_tio.c_cc[VMIN] = 10;
        new_tio.c_cc[VTIME] = 0.004;
        cfsetispeed(&new_tio,BAUDRATE);
        cfsetospeed(&new_tio,BAUDRATE);
        new_tio.c_cc[VINTR]    = 0;    
            new_tio.c_cc[VQUIT]    = 0;  
            new_tio.c_cc[VERASE]   = 0;  
            new_tio.c_cc[VKILL]    = 0;  
            new_tio.c_cc[VEOF]     = 4;  
        new_tio.c_cc[VSWTC]    = 0;     /* '\0' */
            new_tio.c_cc[VSTART]   = 0;     /* Ctrl-q */ 
            new_tio.c_cc[VSTOP]    = 0;     /* Ctrl-s */
            new_tio.c_cc[VSUSP]    = 0;     /* Ctrl-z */
            new_tio.c_cc[VEOL]     = 0;     /* '\0' */
            new_tio.c_cc[VREPRINT] = 0;     /* Ctrl-r */
            new_tio.c_cc[VDISCARD] = 0;     /* Ctrl-u */
            new_tio.c_cc[VWERASE]  = 0;     /* Ctrl-w */
            new_tio.c_cc[VLNEXT]   = 0;     /* Ctrl-v */
            new_tio.c_cc[VEOL2]    = 0;  

        tcflush(fd,TCIFLUSH);
        tcsetattr(fd,TCSANOW,&new_tio);
        msgS[0] = '*';
        msgS[1] = 'G';
        msgS[2] = 'U';
        msgS[3] = 'S';
        msgS[4] = '\r';

        printf("Message to be sent : %s \n\n",msgS);
        int i = write(fd,&msgS,5);
        if(i != 5)
            printf("error while writing to the port\n\n");

        int j = read(fd,&msgR,10);
        if(j != 10)
            printf("error while reading from port\n\n");

        printf("Message Recieved : %s\n\n",msgR);

        return 0;
    }

1 个答案:

答案 0 :(得分:1)

您以非阻止模式打开端口(使用O_NDELAY)。因此,read永远不会阻止,只会读取已经到达的内容。您应该使用select先等待数据,或使用阻止模式。

我怀疑你可以微调字节间延迟。要增加它,您可以启用两个停止位而不是一个(CSTOPB)。