0

我创建了一个简单的 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 模块(然后提取所需的数据)和 pi4j 库(v1.1)使用串行通信来与 GPIO 进行通信。

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

但是当我用“sudo reboot”重新启动我的 pi 时,我的 jar 启动,然后进行了一些“速度更新”,然后不知何故,与 GPS 模块的连接丢失了,只有 LCD 继续工作。

有人知道我的问题可能是什么原因吗?

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;
}

}

4

0 回答 0