【问题标题】:serial command to debian/armbian to shutdown system串行命令到 debian/armbian 以关闭系统
【发布时间】:2017-04-22 20:14:57
【问题描述】:

由于我对此的其他看法没有产生任何结果,因此我执行了以下操作: 我有一台 Orange Pi PC,一旦通过 USB 连接到它的 Arduino Lenoardo 通过按钮在 Pin 2 上获得输入,我想关闭它。

整个通信应该通过串行进行,因为键盘输入效果不佳。

我的 Pi 正在运行 RetrOrangePi,它是用于 Orange Pi 硬件的 RetroPie 的克隆。 现在,如果我想关闭它,我不想使用菜单,而是使用安装在硬件箱上的按钮。

当这个按钮(连接到 Arduino 上的引脚 2)被按下时,它会向 Orange Pi 发送一个串行命令 (byebyepi),Orange Pi 会运行一个 Python 守护程序,该守护程序会侦听此确切行以发送关机命令。

几乎一切正常。 当引脚 2 接地时,Arduino 发送串行信号, 使用串行监视器检查 Windows。 init.d 服务正在运行。 只有python脚本有问题,当我手动运行它时, 因为缺少一个模块(串行)。 我安装了 pip,然后用 pip 安装了“pyserial”模块。 这消除了这个模块丢失的错误。

现在,当我手动运行 python 脚本时,arduino 正在监听, 但是当我将引脚 2 接地时,什么也没有发生。 Arduino 点亮 LED, 所以信号它发送了关闭命令,但 Pi 没有关闭 我不知道为什么。我还在我的 init.d/byebyepi 上做了 chmod 755。

这里有人可以帮我吗?谢谢!

我的 arduino 的草图是这样的:

#define abutton 2
//Pin 2 is now called abutton

void setup() {
  pinMode(abutton,INPUT_PULLUP);
  Serial.begin(9600);
}

void loop() {
  if (!digitalRead(abutton)){Serial.println("byebyepi");
//send byebyepi via serial when abutton is used
  delay(5000);
//wait for 5 seconds
  }
}

我的 python 守护进程使用这个:

import serial
import os

ser = serial.Serial('/dev/ttyACM0', 9600)

while 1 :
   line = ser.readline()
   if line == 'byebyepi':
      os.system("sudo shutdown -h now")

而 /etc/init.d/ 脚本是这样的:

#! /bin/sh
# /etc/init.d/byebyepi
#

case "$1" in
  start)
    echo "Starting byebyepi.py"
    # run application you want to start
    python /home/pi/shutdown/byebyepi.py &
    ;;
  stop)
    # kill application you want to stop
    ;;
  *)
    echo "Usage: /home/pi/shutdown/byebyepi.py {start|stop}"
    exit 1
    ;;
esac

exit 0

【问题讨论】:

  • 您可以为您的问题添加更多相关标签(例如arduinoorange-pi 等)并引起更多关注
  • @downshift 完成,谢谢。

标签: python arduino debian shutdown orange-pi


【解决方案1】:

在发送命令之前发送一个空行可能是个好主意:

if (!digitalRead(abutton)){
    Serial.println("");
    Serial.println("byebyepi");
}

否则电噪声产生的字符可能会出现在字符串的开头。换行符应该让 python 脚本在阅读循环中运行一次,然后准备好接收一个清晰的字符串。

否则,您可以在 Python 脚本中添加一些打印输出,这只是表示它即将重新启动。这样您就可以确认 Python 脚本接收到命令 ok。

还有一点是,在 init.d 脚本中运行时,您的环境变量将与您登录时不同。例如 PATH 和 PYTHONPATH 可以不同。因此,在 python 脚本中使用shutdown 的完整路径可能是个好主意。就是这一行:

os.system("sudo FULLPATHHERE/shutdown -h now")

您必须找出系统上的内容。也许您也应该为 init.d 脚本删除 sudo。

【讨论】:

    猜你喜欢
    • 2014-05-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-24
    • 2019-08-28
    • 1970-01-01
    相关资源
    最近更新 更多