可以写,但不能在Linux下C程序串口ttyS0来读(Can write to, but can&#

2019-10-16 15:33发布

我想学习如何使用C.我有另一台机器连接到我的串行端口发送大约每两秒钟的5F和6F交替十六进制值在Linux中ttyS0形式串口编程。 我已经与这些值是出现在港口等端口监控应用验证。 在我的代码我使用的阻挡的read()成10炭化长度缓冲器中。 虽然我的另一台机器仍在发送数据, 读取()阻塞,直到永远。 如果我包括行的fcntl(FD,F_SETFL,FNDELAY); 它设置读()到非阻塞读()总是与值-1返回,这意味着没有数据是在UART缓冲器,以及我的for循环代码仅仅打印出的是在缓冲器中的随机值。 因此,在短期我的假设是,我的代码不读书ttyS0来,我不知道为什么。 下面是我的代码,希望有人会看到什么导致我的问题,把我直。 顺便说一句,我使用的是Linux的科学,我相信ttyS0来为COM端口1,因为它是在红帽和Fedora。 下面ASLO是当我运行的代码输出。 这似乎是写,没有任何问题的COM端口,但读它说,它无法使用。 也很明显,我打印出缓冲区是在被阅读只是随机值而不是数据。谢谢

控制台输出

hello world
hi again
write error: : Success
 wrote 4 bytes
number of bytes read is -1
read error:: Resource temporarily unavailable
4  8  120  -99  -73  -65  41  -120  4  8  
should of put something out

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

int main()
{
    printf("hello world\n");
    int n;
    int fd;
    char c;
    int bytes;

    char buffer[10];
    char *bufptr;
    int nbytes;
    int tries;
    int x;
    struct termios options;


    fd = open("/dev/ttyS0", O_RDWR | O_NOCTTY | O_NDELAY);
    if(fd == -1)
    {
        perror("open_port: Unable to open:");
    }
    else
    {
        fcntl(fd, F_SETFL, 0);
        printf("hi again\n");
    }

    tcgetattr(fd, &options);

    cfsetispeed(&options, B115200);
    cfsetospeed(&options, B115200);
    options.c_cflag |= (CLOCAL | CREAD);
    options.c_cflag &= ~PARENB;
    options.c_cflag &= ~CSTOPB;
    options.c_cflag &= ~CSIZE;
    options.c_cflag |= CS8;
    options.c_cflag &= ~( ICANON | ECHO | ECHOE |ISIG );
    options.c_iflag &= ~(IXON | IXOFF | IXANY );
    options.c_oflag &= ~OPOST;

    tcsetattr(fd, TCSANOW, &options);


    write(fd, "ATZ\r",4);
    printf(" wrote\n");
    bufptr = buffer;


    fcntl(fd, F_SETFL, FNDELAY);
     bytes = read(fd, bufptr, sizeof(buffer));
    printf("number of bytes read is %d\n", bytes);
    perror ("read error:");

    for (x = 0; x < 10 ; x++)
    {
        c = buffer[x];
        printf("%d  ",c);
    }
    close(fd);

    //puts(buffer[0]);
    printf("\nshould of put something out \n");

    return (0);
}

Answer 1:

尝试设置MIN和/或TIME值:

/*...*/
options.c_cc[VMIN] = 1; //read() will return after receiving 1 character
options.c_cc[VTIME] = 0; // == 0 - infinite timeout, != 0 - sets timeout in deciseconds
/*...*/
tcsetattr(fd, TCSANOW, &options);

给出的示例将设置你的阅读()得到任何符号后返回,并无限期地等待输入。 当然,你可以用这些参数你认为合适的播放(例如,如果你想设置MIN至10)。

您可能需要删除fcntl(fd, F_SETFL, FNDELAY); 呼吁这个工作,虽然。

这也是明智保存以前的termios设置并留下您的程序之前恢复它们。



文章来源: Can write to, but can't read from serial port ttyS0 in linux C program