2016-10-24 3 views
0

Ich entwickle eine Java-Anwendung, die JSSC-Bibliothek für die serielle Schnittstelle Kommunikation mit externen Gerät verwendet. Ich muss einen Befehl senden und dann sofort die Antwort zurück lesen. Das Problem, dem ich gegenüberstehe, ist, dass ohne eine Verzögerung von 200 ms zwischen Schreib- und Lesebefehl die Antwort leer ist. Ich habe ähnliche Funktionalität mit Python entwickelt und in Python funktioniert es perfekt, aber in Java aufgrund von 200 ms Verzögerung ist die Kommunikation sehr langsam. Ich würde gerne fragen, ob es irgendeine Möglichkeit gibt, es schneller zu machen? Ich habe versucht, Ang ang öffnenden Port zwischen Betrieb, Purge-Port zu schließen, aber ohne Erfolg. Vielen Dank im Voraus für Ihre Hilfe. Bellow Sie können meinen CodeGroße Verzögerung zwischen schreiben und lesen Betrieb mit Java Serielle Kommunikation jssc Bibliothek

serialPort = new SerialPort(getPortName()); 

     if (false == serialPort.isOpened()) { 
      try { 

       logger.debug("Opening serial port: " + getPortName()); 
       // Open port 
       serialPort.openPort(); 
       // We expose the settings. You can also use this line - serialPort.setParams(9600, 8, 1, 0); 
       serialPort.setParams(SerialPort.BAUDRATE_115200, SerialPort.DATABITS_8, SerialPort.STOPBITS_1, 
         SerialPort.PARITY_NONE); 
      } catch (SerialPortException ex) { 
       logger.error("Exceptiion during opening port: " + ex); 
      } 
     } 
serialPort.writeBytes(cmd); 
      logger.debug("command sended=" + javax.xml.bind.DatatypeConverter.printHexBinary(cmd)); 
      // delay added because java didn`t read data at once 
      Thread.sleep(200); 

      answer = serialPort.readBytes(); 

Antwort

0

finden glaube ich JSSC auf Javax comm api javax.comm basiert, diese API eine Verzögerung von 200ms hat, während ein Befehl gesendet wird und dann die Antwort zu lesen ... ich denke, das ist, warum Sie bekomme keine Antwort beim Versuch, vor dem 200ms zu lesen ...

Dies ist meine Ausgabe Zeiten mit javax.comms, ich versuche, eine Lösung für diese Verzögerung zu finden, verwende ich serielle Kommunikation zu kommunizieren mit einem ESP8266

2016-11-08 12:32:31.155[INFO]Starting the receiver 2016-11-08 12:32:31.355[INFO]Receives first char 200ms after..

wi lch probiere ein paar Dinge aus und poste, wenn ich eine Lösung habe ... auch hier, wenn jemand eine Lösung findet.

------- UDATE ------------- (sorry für all die Kommentare im neuen Stackoverflow)

In javax Comms API eine Eigenschaft es ist gesetzt Die Zeit, die der Leser auf Daten wartet, ist standardmäßig auf 200 ms eingestellt (zu viel, denke ich), Sie können ihn auf den gewünschten Wert setzen, aber denken Sie daran, dass Sie lesen können, nachdem die Daten angekommen sind und ein - 1 als Antwort Byte:

  port = (javax.comm.SerialPort) portId.open(String.valueOf(this), (int) timeout); 
      port.setSerialPortParams(freq, dataBits, stopBits, parity); 
      port.enableReceiveTimeout(0); 

mit diesem und einem kleinen reprograming meines Codes i Antworten in weniger als 3 ms bekam, ich denke, etwas ähnliches geschieht in JSSC.

2016-11-08 01:43:32.875[DEBUG]Starting the receiver 2016-11-08 01:43:32.878[DEBUG]Receives first char 3ms after

+0

Ok etwas gefunden, dass es für mich gelöst javax.comms verwenden, wenn Sie die serielle Schnittstelle erhalten können Sie die Zeit einstellen, dass es wartet auf Daten ... standardmäßig ankommen wird auf 200 ms (zu viel ich denke) Sie können es auf den Wert setzen, den Sie wollen ... aber Sie riskieren zu lesen, bevor Daten ankommen, wissen nicht, ob diese Eigenschaft durch JSSC verfügbar ist, aber werfen Sie einen Blick und lassen Sie es uns wissen. – Mjkhajl

+0

Forgot das Eigentum: – Mjkhajl

+0

javax.comm.SerialPort.enableReceiveTimeout der Wert, den es empfängt, ist in Millisekunden, beste Grüße !!! – Mjkhajl

Verwandte Themen