当由cron启动时,Raspberry pi(3)shell脚本无法正常工作

时间:2017-07-21 15:51:58

标签: java gps raspberry-pi raspberry-pi3 wiringpi

我创建了一个简单的shell脚本,它基本上只是启动一个“.jar”文件。

此脚本包含以下内容

now=$(date +"%s")
sudo java -jar /home/pi/Desktop/test.jar > /home/pi/Desktop/output_$now.txt

我用

将脚本添加到crontask
@reboot sudo bash /home/pi/Desktop/testmygps.sh

我的应用程序将是一个“GPS控制器”,用于丢弃狐狸的诱饵(免疫接种狂犬病)。 我的应用程序由3个线程组成,一个用于更新连接的LCD显示器,一个用于更新GPS位置和速度,另一个用于丢弃诱饵。

我使用GPS Modul的串行通信(然后提取所需的数据)和pi4j库(v1.1)与GPIO通信。

当我从终端启动jar时,一切都按预期工作(到目前为止,我只计算掉落之间的距离并保存每个放置坐标,并在LCD上显示当前速度和计算的滴之间的延迟)。 / p>

但是当我用“sudo reboot”重新启动我的pi时,我的jar启动,然后进行一些“速度更新”,然后以某种方式连接到GPS模块的连接丢失,只有LCD继续工作。 / p>

任何人都知道我的问题可能是什么原因?

PS。 这是我项目的GPSController类

package baitcontrol.v2;

import java.util.Date;
import java.util.logging.Logger;

import com.pi4j.wiringpi.Serial;

import exceptions.NMEAparseException;
import utils.Parser;
import utils.Utils;

public class GPSController implements Runnable {
private static final Logger LOGGER =  
Logger.getLogger(GPSController.class.getName());

private int serialPort;
private static boolean continueLoop = true;

private static GPSController instance;

private GPGGAEvent lastGPGGAUpdateEvent;
private GPVTGEvent lastGPVTGUpdateEvent;

private GPSController() {
    LOGGER.info("GPSController init");
    this.serialPort = Serial.serialOpen("/dev/serial0", 9600);
    LOGGER.info("GPSController initialised");
    if (this.serialPort == -1) {
        LOGGER.severe("Serial Port Failed");
        System.out.println("Serial Port Failed");
    }
}

public static GPSController getInstance() {
    if (instance == null) {
        instance = new GPSController();
    }
    return instance;
}


@Override
public void run() {
    LOGGER.info("GPSController started");
    String nmea = "";
    while (continueLoop) {

        if (Serial.serialDataAvail(serialPort) > 0) {
            byte[] rawData = Serial.serialGetAvailableBytes(serialPort);
            for (byte dataByte : rawData) {
                char character = (char) dataByte;
                if (character == '\n') {
                    LOGGER.fine("new nmealine " +nmea);
                    if(nmea.contains("GPGGA")){
                        LOGGER.fine("new GPGGA line");
                        try {
                            lastGPGGAUpdateEvent = Parser.parseGPGGAToGPSEvent(nmea);   
                        } catch (NMEAparseException e) {
                            LOGGER.warning(e.getMessage());
                            System.out.println(e.getMessage());
                            Utils.addToTxt("error_" + Utils.dateToString(Main.startTime), e.getMessage());
                        }
                    }
                    if(nmea.contains("GPVTG")){
                        LOGGER.fine("new GPGGA line");
                        try {
                            lastGPVTGUpdateEvent = Parser.parseGPVTGToGPSEvent(nmea);   
                        } catch (NMEAparseException e) {
                            LOGGER.warning(e.getMessage());
                            System.out.println(e.getMessage());
                            Utils.addToTxt("error_" + Utils.dateToString(Main.startTime), e.getMessage());
                        }
                    }
                    nmea = "";
                }else{ 
                    nmea+=Character.toString(character);
                }
            }
        } else {
            LOGGER.finest("data empty");
        }

        try {
            Thread.sleep(5);
        } catch (InterruptedException e) {
            LOGGER.finest(e.getMessage());
            System.out.println(e.getMessage());
            Utils.addToTxt("error_" + Utils.dateToString(Main.startTime), e.getMessage());
        }
    }
}

public GPGGAEvent getLastGPGGAUpdateEvent() {
    return lastGPGGAUpdateEvent;
}

public GPVTGEvent getLastGPVTGUpdateEvent() {
    return lastGPVTGUpdateEvent;
}

public boolean positionHasAlreadyBeenUpdated(){
    return lastGPGGAUpdateEvent!=null;
}

public boolean speedHasAlreadyBeenUpdated(){
    return lastGPVTGUpdateEvent!=null;
}

}

0 个答案:

没有答案