Ola
Estou tentando sincronizar algumas tarefas porem nao estou obtendo sucesso.
O problema ocorre ao tentar ler e escrever em uma porta serial, sendo que a leitura nao pode ser aleatoria, pois depende da resposta da porta serial.
Vejamos o seguinte situacao, apos estabelecer comunicacao com a porta serial eu envio um comando AT, porem o proximo comando AT so pode ser enviado após a resposta da serial.
Eu tentei usar os metodos wait() e notify(), mas estes nao funcionaram como eu imaginei.
Alguem pode me dar umas dicas se eu devo usar tais metodos, ou indicar algum material que fale sobre algo parecido.
Abaixo segue o codigo
//imports
public class Modem{
private static final Properties PROP = Util.readResource();
private static final String PORT = PROP.getProperty("comPort");
private static SerialPort serialPort = null;
private static CommPortIdentifier portId = null;
private static OutputStream outputStream = null;
private static InputStream inputStream = null;
private static ModemListener listener = null;
static {
try {
portId = CommPortIdentifier.getPortIdentifier(PORT);
serialPort = (SerialPort) portId.open("Modem-MC35i", 2000);
serialPort.notifyOnOutputEmpty(true);
serialPort.notifyOnDataAvailable(true);
serialPort.setSerialPortParams(115200,
SerialPort.DATABITS_8,
SerialPort.STOPBITS_1,
SerialPort.PARITY_NONE);
inputStream = serialPort.getInputStream();
outputStream = serialPort.getOutputStream();
listener = new ModemListener(inputStream);
serialPort.addEventListener(listener);
listener.start();
} catch (Exception ex){
ex.printStackTrace();
}
}
public static void stop(){
try {
listener.interrupt();
inputStream.close();
outputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
public static void sendCommandAT(String message) {
try {
outputStream.write(message.getBytes());
} catch (Exception e) {
e.printStackTrace();
}
}
}
public class ModemListener extends Thread implements SerialPortEventListener{
private static final Logger logger = Util.startLogger(ModemListener.class);
private InputStream inputStream;
public ModemListener(InputStream inputStream){
this.inputStream = inputStream;
}
public void serialEvent(SerialPortEvent event) {
switch (event.getEventType()) {
case SerialPortEvent.OUTPUT_BUFFER_EMPTY:
break;
case SerialPortEvent.DATA_AVAILABLE:
byte[] readBuffer = new byte[1];
try {
while (inputStream.available() > 0) {
inputStream.read(readBuffer);
logger.info(new String(readBuffer));
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
public class ServiceModem {
private static final String ENTER = "\r\n";
public static void sendSMS(String phone, String message){
Modem.sendCommandAT("AT+CMGS="+phone + ENTER);
Modem.sendCommandAT(message+(char)26 + ENTER);
Modem.stop();
}
}
O problema do codigo acima, é que o metodo sendSMS executa o metodo Modem.sendCommandAT sem esperar a resposta do modem.
A resposta do Modem é enviada ao arquivo de log, porem isso nao me ajuda muito.
Alguem sabe como sincronizar isso ?