使用 shell 脚本快速读取 Arduino 数据
Read Arduino data with shell script fast
我的 Arduino 正在记录温度数据(数据类型为浮点数),我正在尝试将其登录到我的 Linux 机器上。最大的问题是这种记录的速度。 Arduino 使用 DS1822 读取温度,之后我使用
Serial.print(temp);
命令,其中 temp 是保存温度数据的浮点数。在 Linux 机器上,我使用以下 shell 脚本来收集数据:
#!/bin/sh
while [ 1 ]; do
val=$(cat /dev/ttyUSB0);
echo "$val,$(date "+%Y-%m-%d %H:%M:%S")" >> ~test.txt;
sleep 10;
done
这样做的主要问题是睡眠(延迟)必须非常大;如果我使用sleep 1;
,电脑收不到任何数据。
当我使用 screen /dev/ttyUSB0
时,我可以看到数据接收速度相当快。
使用我当前的脚本,Arduino 似乎在发送数据时以某种方式冻结。我还尝试通过电阻测量构建一个更简单的脚本(因为 DS1822 数据转换也需要一些时间),但是当我如上所述使用 shell 脚本时,这也花费了很多时间。
因此我的问题是:如何优化我的 Arduino/shell 脚本以便记录数据的速度与 Arduino 发送数据的速度一样快?
也许 tail -f
会起作用:
tail -f /dev/ttyUSB0 | bash -c 'cat; date "+%Y-%m-%d %H:%M:%S"'
我通过禁用 Arduino 在建立新串行连接时执行的自动重置找到了解决方案。为此,我在 RST 和 GND 之间放置了一个 10 uF 电容器。请注意,在将代码上传到您的 Arduino 之前,必须移除此电容器!
进行此修改后,我能够从我的 Arduino 读取 10 Hz 的电阻数据。为此,我唯一修改的是 bash 脚本上的睡眠命令,现在是
sleep 0.1;
我的 Arduino 正在记录温度数据(数据类型为浮点数),我正在尝试将其登录到我的 Linux 机器上。最大的问题是这种记录的速度。 Arduino 使用 DS1822 读取温度,之后我使用
Serial.print(temp);
命令,其中 temp 是保存温度数据的浮点数。在 Linux 机器上,我使用以下 shell 脚本来收集数据:
#!/bin/sh
while [ 1 ]; do
val=$(cat /dev/ttyUSB0);
echo "$val,$(date "+%Y-%m-%d %H:%M:%S")" >> ~test.txt;
sleep 10;
done
这样做的主要问题是睡眠(延迟)必须非常大;如果我使用sleep 1;
,电脑收不到任何数据。
当我使用 screen /dev/ttyUSB0
时,我可以看到数据接收速度相当快。
使用我当前的脚本,Arduino 似乎在发送数据时以某种方式冻结。我还尝试通过电阻测量构建一个更简单的脚本(因为 DS1822 数据转换也需要一些时间),但是当我如上所述使用 shell 脚本时,这也花费了很多时间。
因此我的问题是:如何优化我的 Arduino/shell 脚本以便记录数据的速度与 Arduino 发送数据的速度一样快?
也许 tail -f
会起作用:
tail -f /dev/ttyUSB0 | bash -c 'cat; date "+%Y-%m-%d %H:%M:%S"'
我通过禁用 Arduino 在建立新串行连接时执行的自动重置找到了解决方案。为此,我在 RST 和 GND 之间放置了一个 10 uF 电容器。请注意,在将代码上传到您的 Arduino 之前,必须移除此电容器!
进行此修改后,我能够从我的 Arduino 读取 10 Hz 的电阻数据。为此,我唯一修改的是 bash 脚本上的睡眠命令,现在是
sleep 0.1;