利用LiveSerial代替Arduino中串口图形显示

Arduino LiveSerial

参考:在vscode 中用PlatformIO开发Arduino
我经常需要在项目中获取一系列通过串行端口发送的数据,例如从 Arduino、ESP8266 或 ESP32 等微处理器中获取的数据。 这就是 LiveSerial 的由来,它是一个可以对通过串口获取的数据进行实时绘图和统计,并将获取的数据导出为各种格式的程序。 LiveSerial 的另一个优点是它可以存储接收到数值的瞬间。 LiveSerial 使用 C# + WPF 编程,适用于 Windows 7-10。 众所周知,Windows 并非实时系统,因此会产生一些后果。 首先,我们在接收某些数值时可能会出现延迟。 因此,LiveSerial 有两种工作模式:正常模式和同步模式,在同步模式下,微处理器通过发送时间(millis())来标记每个点的时间。 另一个后果是,LiveSerial 的最大采样率相对有限。 例如,LiveSerial 并不是为示波器而设计的。 您可以获得的刷新率取决于您的计算机,但预计最高为每秒 20-50 个采样点。

Using LiveSerial

LiveSerial 的主要理念是尽量减少对微处理器代码的干扰。 不需要库或复杂的代码。 我们有两种运行模式:

Normal mode

要与 LiveSerial 通信,我们只需通过串行端口发送格式如下的命令

ID:value

其中:

  • ID 是系列名称
  • Value 是要存储的数值

For example,

Temp1:257.8

当 LiveSerial 收到一个新的 ID 时,它会创建一个新的系列,将其添加到现有系列中,然后开始录制。

Synchronous mode

在 "正常 "模式下,点的日期和时间是计算机收到点的瞬间。 然而,正如我们所说,Windows 并非实时系统,因此根据操作系统负载的不同,发送时间可能会有毫秒级的变化。 例如,在接收数据时,尝试最大化或更改 LiveSerial 的大小,或运行其他程序。 你会发现,由于操作系统在处理通过串行端口接收到的数据时会造成延迟,图形会发生变形。 在许多情况下,"正常 "模式就足够了,但在某些需要更高精度的情况下,可以通过命令从微处理器发送时间戳。

ID:value@millis

其中:

  • ID 是数据序列的名称

  • Value 是要存储的数值

  • Millis 是处理器发送的毫秒数

LiveSerial 收集数据并进行调整,同时考虑到微处理器发送的时间戳,从而精确调整时间刻度。

Messages

通过串行端口接收到的数据如果不包含系列标识符(默认为":"),则被解释为 “信息”。 也可以向微处理器发送信息。 这些信息将被记录并显示在各自的窗口中。

Macros

虽然在处理器中使用 LiveSerial 不需要使用任何库,但为了方便使用,我们提供了以下宏。

// normal mode

#define LIVESERIAL(id, value) { Serial.print(id);  Serial.print(':');  Serial.println(value); }

// synchronous mode

#define LIVESERIAL_MILLIS(id, value) { unsigned long ms = millis(); Serial.print(id);  Serial.print(':');  Serial.print(value);  Serial.print('@');  Serial.println(ms); }

在 LiveSerial 中按下"?

User Interface

arduino-liveserial-mainscreen

Connect

要连接 LiveSerial,请使用窗口顶部的滑动按钮。 如果没有选择端口,请打开选项标签重新加载串行端口。

Graph area

在这里,N 个最后接收到的值显示在图表中(显示的元素数量由选项控制,以避免程序饱和)。

Messages area

在这里,我们可以通过串行端口发送信息,也可以查看收发的信息。

Statistics area

在收到系列数据时,会实时计算其统计数据。 这些统计数据包括

  • Name,系列名称
  • Count,接收到的元素总数
  • Value,最后接收到的值
  • ΔValue,与前一个值相比的增加值
  • Δt,与前一个值相比的时间增加值
  • Sum,总和 Slope,最后一个元素的斜率
  • Min,接收到的最小值
  • Max,接收到的最大值
  • Range、 Peak,记录的最后一个峰值的值
  • PeakT,记录的最后一个峰值的时间
  • Interval,最后两个峰值之间的时间差
  • Frequency,基于最后两个峰值的频率

View data and export data

arduino-liveserial-viewserie

我们可以通过点击系列图标来查看所有收到的数据。 在此窗口中,我们可以选择将数据导出为 CSV、JSON 和 Excel 等多种格式。 在 Excel 中,导出的工作表包含数据和数值图表。

arduino-liveserial-excel-export

Options

按下 "选项 "按钮后,我们就可以进入修改选项的窗口。 在程序运行过程中,每个用户的选项都会被保存下来。

arduino-liveserial-options

首先,我们要确定要使用的串行端口和传输速度。

另一方面,我们要确定要绘制的元素数(每个序列)。 随着图形点数的增加,处理负荷也会随之增加,尤其是当我们有很多序列时。 因此,只对最后收到的 N 个元素绘制图表。

例如,在单个序列的情况下,1000-1000 的值经常出现,但如果我们有多个序列,则可能必须将其降低到 100-500,否则会导致程序超载。

最后,我们可以将默认分隔符": “和”@"更改为任何其他字符。

Example of use

将 LiveSerial 与 Arduino 结合使用的示例如下:

#define LIVESERIAL(id, value) { Serial.print(id);  Serial.print(':');  Serial.println(value); }

#define LIVESERIAL_MILLIS(id, value) { unsigned long ms = millis(); Serial.print(id);  Serial.print(':');  Serial.print(value);  Serial.print('@');  Serial.println(ms); }

void setup() {
  Serial.begin(115200);
}

void loop() {
    while(Serial.available())
    {
      Serial.print((char)Serial.read());
    }

    LIVESERIAL("NORMAL", 2.0*cos(millis()/500.0));
    LIVESERIAL_MILLIS("WITH_MILLIS", 2.0*cos(ms/500.0));
    delay(100);
}

该示例绘制了两个正弦函数图,其中一个采用 "正常 "模式,另一个采用 "同步 "模式。 此外,该程序还会发送它接收到的所有信息。 这样,您就可以尝试发送信息、接收信息,甚至尝试实时发送新序列(发送 ID)

TO-DOs

Triggers(触发器):当序列值满足条件时执行的操作

Scripts(脚本): 由 LiveSerial 按顺序执行的命令文件

Code

所有代码可在 Github 上获取:https://github.com/luisllamasbinaburo/Arduino-LiveSerial,二进制文件可在 https://github.com/luisllamasbinaburo/Arduino-LiveSerial/releases 上获取。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

蔚蓝慕

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值