我编写的代码打开了一个串口,并打开了一个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
答案 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
变量。但是,您不需要那些i
和ptr
变量。
此外,如果发生这种情况,您可能需要测试文件结束/错误并突破循环:
if(rdlen <= 0) break;
此外,您不一定需要fflush
来电。