向debian/armbian发出关闭系统的串行命令

2024-09-29 23:23:18 发布

您现在位置:Python中文网/ 问答频道 /正文

因为我的另一个观点没有产生任何结果,所以我做了以下几点: 我有一台橙色的Pi电脑,一旦通过USB连接的arduinolenoardo通过一个按钮在pin2上得到一个输入,我想关闭它。在

整个通信应该通过串行通信来完成,因为键盘输入工作不好。在

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

当按下这个按钮(连接到Arduino上的pin2)时,它会向Orange Pi发送一个串行命令(byebyepi),Orange Pi运行一个python守护进程,该守护进程监听这个确切的行来发送shutdown命令。在

几乎一切都很好。 当针脚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守护进程使用这个:

^{pr2}$

而/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

Tags: 模块py命令脚本进程initpi按钮
1条回答
网友
1楼 · 发布于 2024-09-29 23:23:18

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

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

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

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

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

^{pr2}$

你得找出你的系统里有什么。也许您应该删除init.d脚本的sudo。在

相关问题 更多 >

    热门问题