temperatura serie serial puerto leer giovynet descargar datos con comunicar comunicacion java serial-port

serial - leer puerto serie con java



Leyendo el archivo desde el puerto serial en Java (3)

Soy principiante en tecnología Java, tengo que leer el archivo desde el puerto. Primero escribiré "FLASH" en outputstream y obtendré respuesta como "FLASH_OK" del dispositivo de destino, luego de recibir FLASH_OK como respuesta, nuevamente tengo que escribir el nombre del archivo que quiero, pero el problema es que no está escribiendo nombre de archivo a outputstream, abajo está mi código. Por favor, ayúdame.

package writeToPort; import java.awt.Toolkit; import java.io.*; import java.util.*; import javax.comm.*; import javax.swing.JOptionPane; import constants.Constants; public class Flashwriter implements SerialPortEventListener { Enumeration portList; CommPortIdentifier portId; String messageString = "/r/nFLASH/r/n"; SerialPort serialPort; OutputStream outputStream; InputStream inputStream; Thread readThread; String one, two; String test = "ONLINE"; String[] dispArray = new String[1]; int i = 0; byte[] readBufferArray; int numBytes; String response; FileOutputStream out; final int FLASH = 1, FILENAME = 2; int number; File winFile; public static void main(String[] args) throws IOException { Flashwriter sm = new Flashwriter(); sm.FlashWriteMethod(); } public void FlashWriteMethod() throws IOException { portList = CommPortIdentifier.getPortIdentifiers(); winFile = new File("D://testing//out.FLS"); while (portList.hasMoreElements()) { portId = (CommPortIdentifier) portList.nextElement(); if (portId.getPortType() == CommPortIdentifier.PORT_SERIAL) { if (portId.getName().equals("COM2")) { try { serialPort = (SerialPort) portId.open("SimpleWriteApp", 1000); } catch (PortInUseException e) { } try { inputStream = serialPort.getInputStream(); System.out.println(" Input Stream... " + inputStream); } catch (IOException e) { System.out.println("IO Exception"); } try { serialPort.addEventListener(this); } catch (TooManyListenersException e) { System.out.println("Tooo many Listener exception"); } serialPort.notifyOnDataAvailable(true); try { outputStream = serialPort.getOutputStream(); inputStream = serialPort.getInputStream(); } catch (IOException e) { } try { serialPort.setSerialPortParams(9600, SerialPort.DATABITS_8, SerialPort.STOPBITS_1, SerialPort.PARITY_NONE); serialPort .setFlowControlMode(SerialPort.FLOWCONTROL_NONE); number = FLASH; sendRequest(number); } catch (UnsupportedCommOperationException e) { } } } } } public void serialEvent(SerialPortEvent event) { SerialPort port = (SerialPort) event.getSource(); switch (event.getEventType()) { case SerialPortEvent.DATA_AVAILABLE: try { if (inputStream.available() > 0) { numBytes = inputStream.available(); readBufferArray = new byte[numBytes]; int readBytes = inputStream.read(readBufferArray); one = new String(readBufferArray); System.out.println("readBytes " + one); } if (one.indexOf("FLASH_") > -1 & !(one.indexOf("FLASH_F") > -1)) { System.out.println("got message"); response = "FLASH_OK"; number = FILENAME; sendRequest(number); } out = new FileOutputStream(winFile, true); out.write(readBufferArray); out.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } readBufferArray = null; // break; } } public void sendRequest(int num) { switch (num) { case FLASH: try { outputStream.write(messageString.getBytes()); outputStream.flush(); } catch (IOException e) { e.printStackTrace(); } break; case FILENAME: try { outputStream.write("/r/n26-02-08.FLS/r/n".getBytes()); outputStream.flush(); } catch (IOException e) { e.printStackTrace(); } break; } } }


¿Has probado con un software Serial Port Emulator?

Cuando hice este tipo de aplicaciones para la universidad, nuestro profesor nos dijo que construyeramos la aplicación y la probemos con un emulador, ya que es mucho más barata y menos propensa a errores.

Al buscar google, puedes encontrar algunos softwares que hacen eso. No recuerdo exactamente el que usamos en ese momento, pero funcionó bastante bien.

Me refiero a productos como este: Eterlogic - Virtual Serial Ports Emulator , pero eso es solo un ejemplo (y no he probado este software, solo lo busqué en Google)


Lo siento, no puedo ayudarte con el código de Java, pero ¿estás seguro de que los datos "FLASH" se envían realmente en tu puerto serie? Cuando tengo este tipo de problema usualmente uso un osciloscopio para mirar el pin TX en el puerto serie y verifico si puedo "ver" los datos que se envían (la ráfaga de datos será breve pero podrás ver eso). Si puede verlo, use el alcance para buscar en el pin RX del puerto serie y vea si puede ver realmente la respuesta "FLASH_OK".

Nueve de diez veces el problema no es el software, sino un problema de hardware a menudo debido a pines de handshaking conectados incorrectamente.

Buena suerte con esto.


Estás asumiendo erróneamente que siempre se recibirán mensajes completos. En cambio, cuando se desencadena un evento en serie, solo parte del mensaje puede estar disponible. Por ejemplo, puede obtener un evento y leer "FLAS" y un evento posterior dará "H_OK". Debes adaptar tu código a algo como esto:

// member variables byte [] receiveBuffer = new byte[BUFFER_LENGTH]; int receiveIndex = 0; // Receive code receiveIndex += inputStream.read(receiveBuffer, receiveIndex, BUFFER_LENGTH - receiveIndex);