丢失串行读取数据

时间:2017-11-08 12:20:58

标签: c embedded

我试图在C中写一个小应用程序,它从串口读取数据并将其存储在二进制文件中。我使用这条指令从串口读取但是我丢失了数据。

n = read(fd, &buf, sizeof(buf));

所以我在前一个代码之后添加了这段代码,以便了解会发生什么。

    if(n!= strlen(buf)&&n!=-1){
        printf("N= %d strlen = %d\n",n,strlen(buf));
        printf("%s",buf);
    }

我看到n的值是正确的,但strlen(buf)不是(应该与n相同),我不知道为什么...... 缓冲区变量buf的定义与char[1000] buf;类似,n是整数。

端口在两侧都处于原始模式,这就是我在应用程序侧面设置的方式。

tcgetattr(fd, &options);

    /*
     * Set the baud rates to 38400...
     */

    cfsetispeed(&options, B38400);
    cfsetospeed(&options, B38400);

    /*
     * Enable the receiver and set local mode...
     */

    options.c_cflag |= (CLOCAL | CREAD);

    /*
     * No parity (8N1):
     */
    options.c_cflag &= ~PARENB;
    options.c_cflag &= ~CSTOPB;
    options.c_cflag &= ~CSIZE;
    options.c_cflag |= CS8;

    /* To disable software flow control simply mask those bits: */
    options.c_iflag &= ~(IXON | IXOFF | IXANY);
    options.c_lflag &= ~(ICANON|ECHO|ECHOE|ISIG);

    /* Disable hardware flow control: */
    /* unavailable to the gcc -> options.c_cflag &= ~CNEW_RTSCTS;*/

    /*
     * Set the new options for the port...
     */

    tcsetattr(fd, TCSANOW, &options);

知道我能做错什么吗?

由于

1 个答案:

答案 0 :(得分:1)

有几点。正如unwind指出的那样,如果您使用带有strlen的二进制数据,那么您的新代码将无法正常工作。

但是,您需要检查读取的返回值是否正确。它可能不会返回您期望的数据量(只是在阅读时切换任务会给您带来问题)。

所以我怀疑你是在正确的轨道上,检查你是否已经阅读了你所期望的内容,并且如果它是一个简短的阅读,那就回去了。你不能通过在二进制数据上使用strlen来做到这一点。

人们写一个" read_all"这是相当普遍的。功能,一直持续阅读,直到它获得所需的所有数据或在出现错误时退出,单独阅读不会表现得像这样。

我可能会像这样修改你的支票:

if((n = read(fd, &buf, sizeof(buf)) != sizeof(buf)) {
// Check for errors or short reads and handle appropriately.