繁体   English   中英

尝试使用 systemd 启动 python 脚本,但它在 Raspberry Pi 上不起作用

[英]Trying to launch a python script with systemd but it doesnt work on Raspberry Pi

它在 Mu 中正常运行,但是当我尝试使用 systemd 运行它时(在打开 RPI 时运行)它不起作用。

这是来自终端的错误


● skateboard.service - skateboard
   Loaded: loaded (/etc/systemd/system/skateboard.service; enabled; vendor preset: enabled)
   Active: failed (Result: exit-code) since Tue 2021-03-30 21:38:19 EDT; 14s ago
  Process: 467 ExecStart=/usr/bin/python3 /home/pi/Desktop/PythonScripts/skateboard.py (code=exited, status=1/FAILURE)
 Main PID: 467 (code=exited, status=1/FAILURE)

Mar 30 21:38:19 raspberrypi python3[467]: serial.serialutil.SerialException: device reports readiness to read but returned no data (device disconnected or multiple access on port?)
Mar 30 21:38:19 raspberrypi python3[467]: During handling of the above exception, another exception occurred:
Mar 30 21:38:19 raspberrypi python3[467]: Traceback (most recent call last):
Mar 30 21:38:19 raspberrypi python3[467]:   File "/home/pi/Desktop/PythonScripts/skateboard.py", line 11, in <module>
Mar 30 21:38:19 raspberrypi python3[467]:     lineString = ser.readline().decode('utf-8').rstrip()
Mar 30 21:38:19 raspberrypi python3[467]:   File "/usr/lib/python3/dist-packages/serial/serialposix.py", line 509, in read
Mar 30 21:38:19 raspberrypi python3[467]:     raise SerialException('read failed: {}'.format(e))
Mar 30 21:38:19 raspberrypi python3[467]: serial.serialutil.SerialException: read failed: device reports readiness to read but returned no data (device disconnected or multiple access on port?)
Mar 30 21:38:19 raspberrypi systemd[1]: skateboard.service: Main process exited, code=exited, status=1/FAILURE
Mar 30 21:38:19 raspberrypi systemd[1]: skateboard.service: Failed with result 'exit-code'.

此外,如果它相关,这里是 python 脚本:

#!/usr/bin/python3.7
import serial

port = "/dev/ttyACM0"
ser = serial.Serial(port, 57600)
shock = 0

while 1:
    while ser.in_waiting:

        lineString = ser.readline().decode('utf-8').rstrip()



        lineInt = float(lineString)
        print(lineInt)

        if(lineInt >= .4):
            shock = 1

        if(shock == 1 and lineInt < 5):

            ser.write(b"Shock!\n")
            print("shock")
            shock = 0

这是.service文件

[Unit]
Description=skateboard
After=multi-user.target
[Service]
Type=simple
ExecStart=/usr/bin/python3 /home/pi/skateboard.py
Restart=on-abort
User=pi
[Install]
WantedBy=multi-user.target

正如我在上面的评论中所说,我认为问题可能是串行控制台没有被禁用并且它吐出的消息干扰了你的程序。 所以首先要做的是确保控制台被禁用。 此处解释了完整的过程,但非常简单:只需在菜单上运行sudo raspi-config和 select Interface Options ,然后运行Serial Port 对第一个问题回答No ”以禁用控制台,然后回答“ Yes以出于您的目的启用端口,重新启动,您就完成了。

接下来你应该做的是确保运行服务的用户( pi )是dialup组的成员,以便能够访问串行端口。 为此,只需运行:

sudo usermod -a -G dialout pi

在命令行上。

根据您的串行链路的可靠性(这取决于很多事情,例如布线距离、质量等),您可能需要使您的代码更可靠以捕获异常(也许您很幸运并且端口可以正常工作暂时还好,但在某些时候,您的设备可能无法发送数据并且您的服务将崩溃,因此在这种情况下添加异常处理不仅仅是好的做法)这样的事情应该可以解决问题:

#!/usr/bin/python3.7
import serial

port = "/dev/ttyACM0"
ser = serial.Serial(port, 57600)
shock = 0

while 1:
    while ser.in_waiting:
        #Handle exception, i.e. serial port not reading anything
        try: 
            lineString = ser.readline().decode('utf-8').rstrip()
            lineInt = float(lineString)
            print(lineInt)

            if(lineInt >= .4):
                shock = 1

            if(shock == 1 and lineInt < 5):

                ser.write(b"Shock!\n")
                print("shock")
                shock = 0

        except serial.serialutil.SerialException:
            print("Something went wrong, no data received!")

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM