如何从串行端口读取数据并将其写入文件

时间:2017-07-30 15:25:15

标签: c serial-port fwrite

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

我目前有一个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

1 个答案:

答案 0 :(得分:0)

标准习语是:

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来电。