代码之家  ›  专栏  ›  技术社区  ›  Paun Alin

将快速串行数据写入文件(csv或txt)

  •  1
  • Paun Alin  · 技术社区  · 7 年前

    是否有一种方法可以捕获非常快速的串行数据并将其写入文件?

    我使用的是32kSPS外部ADC,波特率为2000000,同时以以下格式打印:ADC\u值(32bits)\t millis()

    这导致每1ms打印约15次。不幸的是,我尝试的每个解决方案都无法捕获实时数据并将其存储到文件中。这包括:处理草图、TeraTerm、串行端口监视器、puTTY和一些Python脚本。他们都无法实时记录数据。 另一方面,Arduino串行监视器能够显示实时串行数据,但无法将其记录到文件中,因为它缺少此功能。

    这是Arduino串行监视器的打印屏幕,显示输入数据:

    enter image description here

    2 回复  |  直到 7 年前
        1
  •  3
  •   Some programmer dude    7 年前

    有一个问题可能是,您每次收到新记录时都会尝试写入。这将浪费大量的时间来写入数据。

    相反,尝试将数据收集到缓冲区中,由于缓冲区即将溢出,请在一个尽可能低级别的写调用中写入整个缓冲区。

    为了不太停止数据的接收,可以使用线程和双缓冲:在一个线程中接收数据,写入缓冲区。当缓冲区即将溢出时,向第二个线程发出信号,并切换到第二个缓冲区。另一个线程获取已满的缓冲区并将其写入磁盘,然后等待下一个缓冲区变满。

        2
  •  0
  •   Paun Alin    7 年前

    在尝试了10多种可能的解决方案(包括专用串行捕获软件、python脚本、Matlab脚本和一些C项目替代方案)之后,唯一一种对我有效的解决方案被证明是 MegunoLink Pro .

    它并没有实现ADC的全部32kSPS潜能,而是大约12-15kSPS,但它仍然比我尝试过的任何方法都要好。

    未达到完整的32kSPS可能也会受到序列号的限制。print()方法,用于将值打印到串行控制台。顺便说一下,我使用的平台是ESP32。

    后期编辑:不要忘记编辑 MegunoLinkPro。exe。配置 文件,以便添加更多波特率,如1000000或2000000。默认情况下,限制为500000。