У меня есть 2 датчика (A и B), подключенных к Arduino Nano, затем в моем приложении у меня есть две кнопки, одна для начала чтения, а другая для остановки чтения.Когда я нажимаю старт, я посылаю arduino сообщение вроде {start: [a, b]}
Когда я нажимаю стоп, я отправляю {stop: [a, b]}
У меня есть3 возможности прямо здесь
- Нажать кнопку «Пуск», а затем «Стоп», без датчиков, отправляющих мне какие-либо данные (это прекрасно работает)
- Чтобы нажать «Пуск», запишите данные с каждого датчика (датчиковпосылает по одной строке каждый) это тоже отлично работает
- И несчастный случай, то есть когда я нажимаю старт, использую ТОЛЬКО один датчик, а затем пытаюсь нажать стоп в середине.Дело в том, что когда я делаю это, мое приложение зависает в этот момент.Я покажу вам кусок кода и объясню вам, что передает
input.close()
, и если я его удаляю, то он зависает на serialPort.removeEventListener();
, поэтому я не могу найти решение самостоятельно.
edit: добавив больше информации об этой проблеме, дело в том, что
serialPort.removeEventListener();
serialPort.close();
ничего не делают.
private SerialPort serialPort;
private BufferedReader input;
private OutputStream output;
public synchronized void close() {
try {
if (serialPort != null) {
input.close();
output.flush();
output.close();
new Thread() {
@Override
public void run() {
serialPort.removeEventListener();
serialPort.close();
}
}.start();
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public void serialEvent(SerialPortEvent oEvent) {
if(oEvent.getEventType() == SerialPortEvent.DATA_AVAILABLE){
while(comparar(_sensores,_valorCorte)){
String jsonRecibido;
try {
jsonRecibido = input.readLine();
System.out.println("Se recibio: " + jsonRecibido);
ObjectMapper mapper = new ObjectMapper();
Medicion medicion = mapper.readValue(jsonRecibido,
Medicion.class);
mediciones.add(medicion);
int canal = 0;
canal = medicion.getCanal();
_sensores[canal-1] ++;
} catch (IOException e) {
System.out.println("Fallo al leer el buffer");
System.err.println(e.toString());
}
}
}
}