Arduino云上的Linux openWRT外壳:将输入行从串行端口保存到文件

Arduino云上的Linux openWRT外壳:将输入行从串行端口保存到文件,linux,bash,shell,serial-port,arduino-yun,Linux,Bash,Shell,Serial Port,Arduino Yun,我正试图将来自Arduino Yun(运行openWRT)上USB端口的输入保存到一个文件中,这样就可以从Yun上托管的PHP页面准备好,并通过浏览器访问 其想法是,Yun通过RS485充当锅炉的web接口,记录所有数据,生成锅炉提供的各种温度的图形,并保存到文件中 数据来自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

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

其想法是,Yun通过RS485充当锅炉的web接口,记录所有数据,生成锅炉提供的各种温度的图形,并保存到文件中

数据来自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
我有一些运气使用以下提示。。。

而且。。。

最后一篇文章提供了以下代码:

#!/bin/bash
while read line; do
     if [ "$line" != "EOF" ]; then
          echo "$line" >> file.txt
     else
          break
     fi
done < /dev/ttyUSB0
迄今采取的行动:

  • 安装FTDI驱动程序
    opkg安装kmod usb串行FTDI

  • 基于上述简化版本,在文件夹/bin/ihiu中创建了一个名为boiler2text.sh的脚本

  • 已授予运行
    chmod u+x boiler2text.sh的文件权限

  • 从Putty SSH窗口中执行脚本<代码>sh/bin/ihiu/boiler2text.sh

  • 到目前为止,效果不错,但我遇到了一些问题:

  • 我需要让脚本全天候运行,而不必通过SSH连接到系统中。我可以在PHP页面中执行系统命令,但当它运行脚本时,它只是挂起,并且似乎没有输出到文件中
  • 当文件开始变得相当大时,理想情况下,每次添加一行时,我都需要从文件的开头删除一行—一旦文件达到最大文件大小。或者根据一天中的日期和时间将其保存为文件名,以便文件名每小时更改一次 我是Linux新手,任何指点都将不胜感激

  • 为了避免在系统中使用SSH,启动命令时,请运行
    /bin/ihiu/boiler2.txt&
    。符号将在后台启动该过程;您必须在某个时候使用
    kill
    killall
    命令手动终止进程(或者您可以让它永远运行)。如果不希望每次重新启动时都启动脚本,可以在
    /etc/init.d/
  • 例如,为了防止文件超过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
    
    #/bin/bash
    保存文件=hsffile.txt
    读行时;做
    回显“$line”>>$SAVE_文件
    #通过以下方式确定文件中当前的行数:
    #做一个单词计数,然后得到第一个单词
    #产量。
    行=`wc-l$SAVE_FILE | awk'{print$1;}'`
    #检查行计数是否大于1000。
    如果[[$lines-gt 1000]];然后
    #使用sed删除文件的第一行。
    sed-i'1d'$SAVE_文件
    fi
    完成

  • 谢谢你的帮助。我确实是通过。。。我必须使用以下命令以正确的速度获得串行端口mgetty-s 19200/dev/ttyS0,然后运行现有脚本,这两个脚本都是在系统重新启动并联机30秒后从PHP页面以系统命令的形式发布的。虽然它似乎挂起系统30秒,但一切都开始顺利进行,进程继续运行(现在已经连续运行了24个多小时)。我已经让Php每天重命名数据文件,这样文件大小就不会太大(并且有sd卡写入失败的风险),但现在我可以玩得更多了。考虑在执行bash脚本之前使用php编辑它,这样我就可以让它设置文件名,并让它运行一定数量的行,如您所示。下一个任务是研究如何将命令发送回同一端口,并在传入消息之间计时。当前的想法是使用php杀死脚本,重写它,包括一个send命令,以立即跟踪数据的接收,然后重新激活。干杯。我意识到了为什么会出现语法错误。这是因为我在记事本中编辑文件,它插入了行尾字符。
    #!/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