如何从串口读取数据并写入文件

How to read data from a serial port and write it to a file

我编写了打开串口和 txt 日志文件的代码。我想将串行端口上的传入数据写入日志文件。我的问题是如何从串行端口读取数据并将其写入文件的最佳方法是什么。如果需要,我可以 post 打开串行端口和日志文件的代码,但我不想弄乱我的问题。

我目前有一个 while 循环,它从串行端口读取数据到一个 32 元素的 char 数组,然后将它写入文件。但是,该文件包含垃圾,因为它不断地将缓冲区写入文件。

对于如何正确执行此操作的任何建议,我将不胜感激。我真的应该只在缓冲区已满时才写入,但我怎么知道缓冲区的大小应该是多少,如果缓冲区溢出会发生什么,例如如果我没有按时读取。

int i,rdlen, ptr;
char buf[32];

while( 1 ) {

    rdlen = read(fd_serial_port, &buf[ptr], 1); //read data from serial line into buffer

    fwrite(buf , 1 , sizeof(buf) , log_file);

    fflush(log_file);

}

来自串行线路的数据如下所示,每 2 秒到达一次(如果重要的话)

Starting Contiki-1cb08a4
With DriverLib v0.44336
TI SmartRF06EB + CC26xx EM
 Net: sicslowpan
 MAC: TSCH2
 RDC: nordc
 RF: Channel 25
[node] id=0, role=6ln

标准成语是:

rdlen = read(fd_serial_port, buf, sizeof(buf));
fwrite(buf, 1, rdlen, log_file);

当你阅读的时候,你想告诉read它最多允许读入sizeof(buf)(即32)个字符到buf。然后,当你调用 fwrite 时,你想告诉它只写你刚读到的字符(即 rdlen)。

通过这种方式,您可以反复使用 buf,一次读取和写入一个数据块(最多 32 字节)。您不需要跟踪指向 buf 或任何东西的指针;您只需要跟踪每次通过循环获得的字符数——这是您的 rdlen 变量。但是你不需要那些 iptr 变量。

此外,您可能想要测试文件结尾/错误并在发生这种情况时跳出循环:

if(rdlen <= 0) break;

此外,您不一定需要 fflush 调用。