我创建了一个简单的 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;
}
}