背景
为了从逻辑控制器捕获数据,我使用screen作为终端仿真器并通过KeySpan USA-19HS USB Serial Adapter连接我的 MacBook 。我创建了以下 bash 脚本,以便我可以键入talk2controller <filename>
其中文件名是数据文件的名称。
#!/bin/bash
if [ -z "$1" ]; then
echo Please provide the filename to save the logfile
exit
fi
LOGFILE=$1
echo "logfile $1" > screenrc # Set the logfile filename
echo "logfile flush 1" >> screenrc # Wait 1 sec before flushing buffer to filesystem
screen -L -c screenrc /dev/tty.KeySerial1 19200
我更改了日志文件的文件名,并将日志文件缓冲区刷新到文件系统之前的等待时间从默认的 10 秒更改为 1 秒。我将这些命令保存到screenrc
. 然后我用以下方法调用屏幕:
-L
— 启用日志记录-c screenrc
— 覆盖默认配置文件/dev/tty.KeySerial1 19200
— 使用 19200 的波特率与串行端口通信
我记录的每个测试大约需要 3-6 分钟,并且包含速度、加速度和位置信息。我会根据加速度知道测试是有效的。目前,我正在等到测试结束后再运行 Python matplotlib脚本来绘制速度、加速度和位置,以查看测试是否有效,然后再进行下一个测试。
为了节省时间,我宁愿在测试进行到一半时绘制数据,而数据仍在捕获中。
问题
在我看来,在捕获更多数据的同时绘制数据有两种选择:
- 选项 1:使用屏幕记录数据并让 Python matplotlib 脚本读取部分日志文件。
- 问题 1:如果 Python 脚本读取日志文件,而 screen 仍在向其中写入数据,会有什么顾虑?
- 选项 2:从使用 screen 切换到使用pySerial。但是,在测试期间绘制数据的优先级低于在测试期间简单地捕获数据。我无法承受代码绘图部分中的异常导致数据记录失败。这就是 screen 的优点——它只是转储数据而不尝试做任何其他事情。
- 问题 2:如果我要切换到 pySerial,我是否可以运行两个线程来减少代码的绘图部分不影响数据捕获代码的机会?这能给我带来什么吗?
问题3:有没有更好的选择,我没有想到?