0

我正在尝试在 Mac OS 上读取 C 中的串行端口数据。串行端口的配置在单独的 Arduino IDE 中完成。

我能够读取部分数据,但随后打印的数据会自行重复并开始读取零,如下所示。如果我删除 O_NONBLOCK,程序就会挂起。我能做些什么来解决这个问题?其次,鉴于我在 for 循环中读取数据,如何确保读取速率与波特率一致?

看到的数据:296 310 0

320 295 311

320 295 311

9 296 311

320 295 311

320 295 311

9 296 311

...

0 0 0

0 0 0

0 0 0 等

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

int buffer[300];

int main(int argc, const char* argv[])
{

    // open serial port
    int port;
    port = open("/dev/tty.usbmodem1411", O_RDONLY | O_NONBLOCK);
    if (port == -1)
    {
        printf("Unable to open serial port.\n");
        return 1;
    }

    // instantiate file
    FILE* file = fdopen(port, "r");
    if (file == NULL)
    {
        printf("Unable to instantiate file.\n");
        close(port);
        return 2;
    }

    for (int j = 0; j < 200; j++)
    {

        fscanf(file, "%d %d %d", &buffer[3*i], &buffer[3*i+1], &buffer[3*i+2]);
        printf("%d %d %d\n", buffer[3*i], buffer[3*i+1], buffer[3*i+2]);

        i = (i + 1) % 100;

        usleep(10000);

    }

    fclose(file);
    close(port);

    return 0;

}
4

1 回答 1

0

对于克里斯·斯特拉顿:

if (fgets(temp, sizeof(temp), file) != NULL) 
{ 
     sscanf(temp, "%d %d %d\n", &buffer[3*i], &buffer[3*i+1], &buffer[3*i+2]); 
     printf("%d %d %d\n", buffer[3*i], buffer[3*i+1], buffer[3*i+2]); 
}

但是,回到我原来的问题,即使我使用 fscanf 和 printf,我也会获取数据,然后我只能无限期地读取零。我在想这可能更像是一个串口通信问题?

于 2013-12-05T03:25:44.327 回答