【问题标题】:Linux openWRT shell on Arduino Yun: save input line from Serial Port to fileArduino Yun 上的 Linux openWRT shell:将输入行从串口保存到文件
【发布时间】:2015-06-29 23:19:32
【问题描述】:

我正在尝试将来自 Arduino Yun(运行 openWRT)上的 USB 端口的输入保存到文件中,以便可以从 Yun 上托管的 PHP 页面准备好并通过浏览器访问。

这个想法是 Yun 充当锅炉的 Web 界面,通过 RS485 记录所有数据,并生成从锅炉馈送的各种温度图表并保存到文件中。

数据来自 RS485 馈电(来自锅炉),通过 FTDI 电缆。

数据每秒钟都以表格形式...

DAT,39665,8,0.00,-273.15,-273.15,-273.15,0,0.00,0.60,0.00,0.00,-6.25,0.00,0.00,60.00,60.00,225,-273.15,0.00
STAT,39666,0.00,0,19,924,2,0,0,0,0,2,2,2,0,0

我有一些运气使用以下提示... Linux shell: save input line from Serial Port each minute and send to remote server

并且... Bash script: save stream from Serial Port (/dev/ttyUSB0) to file until a specific input (e.g. eof) appears

最后这篇文章提供了代码:

#!/bin/bash
while read line; do
     if [ "$line" != "EOF" ]; then
          echo "$line" >> file.txt
     else
          break
     fi
done < /dev/ttyUSB0

但是它会引发错误line 8: syntax error: unexpected "done" (expecting then)

但我不知道为什么,所以简化为:

#!/bin/bash
while read line; do
    echo "$line" >> hsffile.txt
done < /dev/ttyUSB0

目前的行动:

  1. 安装FTDI驱动opkg install kmod-usb-serial-ftdi

  2. 根据上面的简化版本在文件夹 /bin/ihiu 中创建了一个名为 boiler2text.sh 的脚本。

  3. 赋予文件运行权限chmod u+x boiler2text.sh

  4. 从 Putty SSH 窗口中执行脚本。 sh /bin/ihiu/boiler2text.sh

到目前为止,它运行良好,但我遇到了一些问题:

  1. 我需要让脚本 24/7 全天候运行,而无需通过 SSH 连接到系统。我可以从 PHP 页面中执行系统命令,但它在运行脚本时只是挂起,似乎没有任何内容输出到文件。
  2. 随着文件开始变得非常大,理想情况下,每次添加一行时,我都需要从文件开头删除一行 - 一旦文件达到最大文件大小。或者让它根据一天中的日期和时间保存到一个文件名,这样文件名每小时都会改变。

我是 Linux 新手,非常感谢任何指点。

【问题讨论】:

    标签: linux bash shell serial-port arduino-yun


    【解决方案1】:
    1. 为了避免必须通过 SSH 进入系统,当您启动命令时,请运行 /bin/ihiu/boiler2.txt &amp;。 & 符号将在后台启动进程;您将不得不在某个时候使用killkillall 命令手动终止该进程(或者您可以让它永远运行)。如果您不想每次重新启动时都启动脚本,您可以在 /etc/init.d/ 中创建一个条目
    2. 例如,为了防止您的文件超过 1000 行,您可以这样做:

      #!/bin/bash
      SAVE_FILE=hsffile.txt
      while read line; do
          echo "$line" >> $SAVE_FILE
          # Determine the number of lines currently in the file by
          # doing a word count and then getting the first piece
          # of output.
          lines=`wc -l $SAVE_FILE | awk '{print $1;}'`
      
          # Check to see if the line count is greater than 1000.
          if [[ $lines -gt 1000 ]]; then
              # Delete the first line of the file using sed.
              sed -i '1d' $SAVE_FILE
          fi
      done < /dev/ttyUSB0
      

    【讨论】:

    • 感谢您的帮助。我确实让它工作了...我必须使用以下命令以正确的速度获取串行端口 mgetty -s 19200 /dev/ttyS0 然后运行现有脚本,这两个脚本都是在系统重新启动后 30 秒从 PHP 页面作为系统命令发出的,并且上线。虽然它似乎挂起系统 30 秒,但一切都开始滴答作响,并且进程正在运行(现在已经连续运行超过 24 小时)。
    • 我每天都用 PHP 来重命名数据文件,这样文件大小就不会变得太大(并且有 sd 卡写入失败的风险),但现在我可以多玩一点。考虑在执行之前使用 php 编辑 bash 脚本,所以我可以让它设置文件名并让它运行一定数量的行,如您所示。下一个任务是研究如何在传入消息之间定时将命令发送回同一端口。目前的想法是使用 php 杀死脚本,重写它,包括一个发送命令以立即跟随接收数据,然后重新激活。干杯。
    • 我意识到为什么会出现语法错误。这是因为我在记事本中编辑文件,它正在插入行尾字符。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多