1

使用 Arduino 将数据发布到 Pachube 时出现问题。Arduino 配置为在您发送“t”时返回温度的 JSON 数据,并在发送“l”时返回光照级别的 JSON 数据。这可以通过 Arduino 串行监视器完美运行。然后我创建了两个 bash 脚本。定期向 Arduino 发送“t”和“l”命令,并在每个请求之间等待 10 秒。

while true; do
    echo -n t > /dev/ttyACM0
    echo "$(date): Queried Arduino for temperature."
    sleep 10
    echo -n l > /dev/ttyACM0
    echo "$(date): Queried Arduino for light."
    sleep 10
done

这工作正常。我每 10 秒收到一条回显消息。另一个脚本从串口读取生成的 JSON(我基本上是从某个网页复制的)。

ARDUINO_PORT=/dev/ttyACM0
ARDUINO_SPEED=9600
API_KEY='MY_PACHUBE_KEY'
FEED_ID='MY_FEED_ID'

# Set speed for usb
stty -F $ARDUINO_PORT ispeed $ARDUINO_SPEED ospeed $ARDUINO_SPEED raw
exec 6<$ARDUINO_PORT

# Read data from Arduino
while read -u 6 f ;do
    # Remove trailing carriage return character added
    # by println to satisfy stupid MS-DOS Computers
    f=${f:0:${#f} - 1}

    curl --request PUT --header "X-PachubeApiKey: $API_KEY" --data-binary "{ \"version\":\"1.0.0\", \"datastreams\":[ $f ] }" "http://api.pachube.com/v2/feeds/MY_FEED_ID"
    echo "$(date) $f was read."
done

不幸的是,这个脚本发疯了,回显消息每 10 秒告诉我几次它向 Pachube 发布数据,尽管它应该每 10 秒执行一次(当第一个脚本告诉 Arduino 创建 JSON 消息时)。我认为这可能是 Arduino 上缓冲消息的问题,但即使将其关闭再打开,问题仍然存在。有什么想法吗?提前致谢。

4

1 回答 1

1

我完全不熟悉 Arduino 和你在这里做的其他一些事情,但这里有一些我看到的一般事情:

  • Bash 几乎完全无法可靠地处理二进制数据。无法在 Bash 字符串中存储 NUL 字节。看起来您正在尝试使用一些技巧来使任意数据可读-希望您只将字符数据发送到read,否则这不太可能起作用。

  • read-d读取换行符分隔的输入(或者如果您的 bash 足够新,则为给定值)。我不知道 while 循环正在读取的格式,但它必须是换行符分隔的字符串。

  • read -r除非您想要解释转义序列,否则请使用。(你几乎总是想要-r. read

  • 无条件地从每个字符串的末尾剥离一个字符并不是最好的。我会使用: ,它从 f 的末尾f=${f%+($'\r')}删除 1 个或多个相邻的 's。如果这不是默认设置,\r请记住在脚本的顶部。shopt -s extglob

  • 这实际上不应该引起问题,但exec除非确实需要,否则我不喜欢使用 - 它不在这里。只需 putdone <$ARDUINO_PORT终止while循环并从中删除-u 6参数read(除非循环内的某些内容专门从标准输入读取并且不能冲突,但情况似乎并非如此)。打开的FD在退出循环时会自动关闭。

  • 不要在脚本中创建自己的全大写变量名,因为它们是保留的并且可能与环境中的变量冲突。至少使用一个小写字母。如果这些变量是由系统中的某些东西设置的并且您只是使用或修改它们,这当然不适用。

于 2012-04-16T12:47:27.080 回答