在主循环中使用 serial.readline() 清空文件

Posted

技术标签:

【中文标题】在主循环中使用 serial.readline() 清空文件【英文标题】:Empty file by using serial.readline() in the main loop 【发布时间】:2018-12-12 09:33:54 【问题描述】:

我一直在尝试发送从串行端口接收的数据。我正在使用serial.readline() 从我的设备中读取 ASCII 数据。当我在主循环中使用这个函数时,我可以打印字符串但我不能将它发送到我的输出文件。当我将readline() 放在循环中时,我的f.write() 函数不起作用。知道如何解决这个问题吗?

import serial
import csv
ser=serial.Serial('COM6', 9600, 8, parity='N', timeout=2)
with open('output.csv','a') as f:
    while True:
        line = ser.readline()
        if line:
            print(line)
            f.write(line)

这是我得到的数据,但输出文件中没有。

0R5,Th=24.3C,Vs=24.2V
0R2,Ta=23.3C,Ua=21.3P,Pa=1026.9H
0R1,Dm=000#,Sm=99.9#
0R5,Th=24.3C,Vs=24.2V

【问题讨论】:

请修复缩进 - 我想整个 while loop 需要缩进一级。即,如果您的代码看起来像这样,您将得到 IndentationError 是的,我把代码放在这里时出错了。谢谢。 【参考方案1】:

当你退出with 块时,如果缓冲区已满,文件将被刷新并关闭。 如果您永远处于循环中,则在填充缓冲区之前不会看到文件的任何更改。

您可以更改输出文件的缓冲。见How often does python flush to a file?

在您的示例中,您可以使用

with open('output.csv', 'a', buffering=0) as f:

【讨论】:

太棒了!它解决了我的问题。我能够将数据发送到我的输出文件。谢谢!

以上是关于在主循环中使用 serial.readline() 清空文件的主要内容,如果未能解决你的问题,请参考以下文章

Py serial readline在Python3中不起作用

Tkinter:在主循环中调用事件

如何在主异步循环内的同步子进程内运行多个异步循环?

用于使用循环(环形)缓冲区实现的嵌入式系统的 C 记录器库在主文件中不起作用

AVR ATmega在主循环之前使用printf时保持重置

串行提升线程在循环中加入与在主中并行