mikrocontroller.net

Forum: PC-Programmierung Serial Lib für Java, die auch funktuioniert?


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Frank E. (Firma: Q3) (qualidat)


Bewertung
0 lesenswert
nicht lesenswert
Kann mir bitte jemand eine Empfehlung geben, für eine SerialLib für 
Java, die auch plattformübergreifend einfach nur funktioniert? Habe 
bisher ca. 6 Stück ausprobiert, irgendwas ist immer - hier Beispiele:

1. JSerialCom: Läuft auf Mac sofort und einwandfrei, unter Windows 10 
wird die Ausführung mit einem "problematic frame"-Error beim Auflisten 
der vorhandenen Ports abgebrochen, was immer das auch sein mag

2. RxTx: Läuft nur unter Windows und der Anwender soll eine DLL händisch 
irgendwo hin kopiereren - geht garnicht

3. Ardulink: Kann die notwendigen Importe nicht auflösen, obwohl die 
externe jar-Lib natürlich korrekt im Erstellungspfad von Eclipse 
eingetragen ist und auch im Projektordner angezeigt wird ...

4. JSSC: Läuft zwar ohne sichtbare Errors, findet aber auf dem Mac keine 
Ports, obwohl der Arduino-Monitor das Gegenteil zeigt ...
import jssc.*;

public class JTest {

  public static void main(String[] args)
  {
    String[] ports;
    ports = SerialPortList.getPortNames();
    System.out.println(""+ports.length);
    
    for(int i=0; i<ports.length; i++)
    {
      System.out.println(ports[i]);
    }
  }
}
... ergibt immer Null :-((

Tips, Hinweise? Danke.

: Bearbeitet durch User
von Ich (Gast)


Bewertung
0 lesenswert
nicht lesenswert

von Jim M. (turboj)


Bewertung
0 lesenswert
nicht lesenswert
JSerialCom hatte einen Commit vor 3 Tagen, d.h. neueste Git Version 
saugen und manuell bauen könnte das Problem beheben.

von Wühlhase (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Von JSerialCom kann ich sagen, daß sie funktioniert. Unter Windows 10, 
mit FTDI-Treiber.

Kann es sein, daß das Problem eher auf deinem Rechner liegt? Das ein Lib 
nicht geht-geschenkt. Aber vier?

von Forist (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Frank E. schrieb:
> ... - geht garnicht

DAS geht gar nicht ;-(

von Frank E. (Firma: Q3) (qualidat)


Bewertung
0 lesenswert
nicht lesenswert
Wühlhase schrieb:
> Von JSerialCom kann ich sagen, daß sie funktioniert. Unter Windows
> 10,
> mit FTDI-Treiber.
>
> Kann es sein, daß das Problem eher auf deinem Rechner liegt? Das ein Lib
> nicht geht-geschenkt. Aber vier?

Ich schrieb ja nicht, dass sie durchweg nicht funktionieren, aber eben 
z.B. plattformübergreifend, was man jedoch von einer Java-Lib erwarten 
sollte.

Ganz sicher lässt sich das eine oder andere Prpblem irgendwie lösen, 
aber wenn ich z.B. Software ausliefern möchte, die mit der Seriellen 
arbeitet, kann ich keinem Kunden zumuten, erst hier und da an seinem 
System herumzuschrauben ...

Mein Eintritts-Test, noch bevor ich überhaupt versucht habe Daten zu 
übertragen, war das Auflisten der vorhandenen Ports. Und schon das ging 
nie wirklich auf Win UND Mac. Ist ja oben beschrieben.

von Wühlhase (Gast)


Bewertung
1 lesenswert
nicht lesenswert
Frank E. schrieb:
> Ich schrieb ja nicht, dass sie durchweg nicht funktionieren, aber eben
> z.B. plattformübergreifend, was man jedoch von einer Java-Lib erwarten
> sollte.

Naja, bei hardwarenahen Geschichten ist das halt so eine Sache mit Java, 
dafür ist es nie gebaut worden. Das ist ja in der Regel irgend ein 
Programm z.B. C, daß einmal durch JNI gezogen wird.

Auch wenn es vielleicht nicht allzu prickelnd ist: Schreib dir doch eine 
Wrapper-Klasse für zwei oder drei Bibliotheken und nimm dann die 
Bibliothek, die zum OS passt.

von Raph (Gast)


Bewertung
-1 lesenswert
nicht lesenswert
Frank E. schrieb:
> funktuioniert

Muss die auch eine Rechtschreibkorrektur haben?

von Frank E. (Firma: Q3) (qualidat)


Bewertung
0 lesenswert
nicht lesenswert
Nach dem aktuellen Update funktioniert nun JSerialComm mit identischem 
Code auf Win (Win 10) und Mac OSX (getestet unter 10.13 u. 10.14).

Wen es interessiert, hier eine einfache Testklasse:
import com.fazecast.jSerialComm.SerialPort;
import com.fazecast.jSerialComm.SerialPortDataListener;
import com.fazecast.jSerialComm.SerialPortEvent;

public class serComm 
{
  private SerialPort ports[]=null;
  private String recBuf="";
  private boolean opened = false;
  private SerialPort port = null;
  
  public serComm() //Konstruktor
  {
    ports=SerialPort.getCommPorts();
  }
  
  public int getCount() {return ports.length;} //Anzahl der gefunden COM-Ports
  
  public String getName(int i) {return ports[i].getSystemPortName();} //Name des Port(index)
  
  public boolean isData() {return recBuf.length()>0;} //Daten verfügbar?
  
  public String getData() //letzte Daten lesen
  {
      String retUrn = recBuf;
      recBuf="";
      return retUrn;
  };
  
  public void writeData(String dat)
  {
    byte[] sndBytes = dat.getBytes();    
    port.writeBytes(sndBytes,sndBytes.length);
  }
  
  //Port mit Parametern öffnen und Listener dranhängen
  public boolean getPort(int idx, int baud, int bits, int stop, int pari) //Port(index) öffnen
  {
    try
    {
      port = SerialPort.getCommPorts()[idx];
      port.setComPortParameters(baud, bits, stop, pari);
      port.openPort();
      port.addDataListener(new SerialPortDataListener() 
      {
        public int getListeningEvents()
        {
          return SerialPort.LISTENING_EVENT_DATA_RECEIVED;
        }
        public void serialEvent(SerialPortEvent e)
            {
          byte[] recBytes = e.getReceivedData();
          recBuf = new String(recBytes);
            }
      });  
      opened=true;
    }    
    catch (Exception e)
    {
      opened=false;
    }    
    return opened;
  }
}

getestet hiermit (Port 2 aus der Liste der verfügbaren Ports):
public class SerialTest {

  public static void prn(String msg) {System.out.println(msg);}
  
  public static void main(String[] args) throws Exception
  {
    serComm serial = new serComm();
    
    for (int i=0; i<serial.getCount(); i++)
    {
      prn( i+": "+serial.getName(i));
    }
    
    if(serial.getPort(2, 9600, 8, 1, 0))
    {
      while(true)
      {
        //Thread.sleep(1000);
        if(serial.isData())
        {
          prn(serial.getData());
        }
        else
        {
          prn("nix ...");
        }
      }  
    }
    else
    {
      prn ("shit ...");
    }
  }
}

Die Lib gibts hier: 
https://fazecast.github.io/jSerialComm/binaries/jSerialComm-2.5.3.jar

: Bearbeitet durch User
von Christoph M. (mchris)


Bewertung
0 lesenswert
nicht lesenswert
Bei mir läuft JSSC auf allen Systemen einwandfrei: Linux,Win,MAC

von Frank E. (Firma: Q3) (qualidat)


Bewertung
0 lesenswert
nicht lesenswert
Christoph M. schrieb:
> Bei mir läuft JSSC auf allen Systemen einwandfrei: Linux,Win,MAC

Glaube ich nicht (so). Du musst zumindest unter Windows händisch noch 
eine DLL kopieren. Und beim Einlesen der verfügbaren Ports 
systemspezifische Pfade vorgeben ...

Ich habe nie behauptet, dass es mit entsprechenden Eingriffen und 
Kenntnissen nicht geht, aber es geht definitiv nicht out-of-the-box. 
Damit meine ich: 1 jar-File einbinden und einheitlichen Sourcecode 
verwenden, sonst nix).

Letzteres war aber mein Kriterium, was nun mit der aktuellen Version von 
JSerialComm erfüllt ist.

Ich lass mich aber gerne vom Gegenteil überzeugen.

: Bearbeitet durch User
von TomW (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Ich verwende das: https://github.com/nyholku/purejavacomm und 
funktioniert alles einwandfrei unter Windows und Linux. Unter OSX hab 
ich es aber noch nicht getestet.

von Frank E. (Firma: Q3) (qualidat)


Bewertung
0 lesenswert
nicht lesenswert
TomW schrieb:
> Ich verwende das: https://github.com/nyholku/purejavacomm und
> funktioniert alles einwandfrei unter Windows und Linux. Unter OSX hab
> ich es aber noch nicht getestet.

Danke für den Hinweis, das klingt zumindest dem Namen nach 
vielversprechend, werde ich ausprobieren.

von nux (Gast)


Bewertung
0 lesenswert
nicht lesenswert

von Rolf M. (rmagnus)


Bewertung
0 lesenswert
nicht lesenswert
Frank E. schrieb:
> Ich habe nie behauptet, dass es mit entsprechenden Eingriffen und
> Kenntnissen nicht geht, aber es geht definitiv nicht out-of-the-box.
> Damit meine ich: 1 jar-File einbinden und einheitlichen Sourcecode
> verwenden, sonst nix).

Das geht zumindest unter Linux schon deshalb nicht, weil man erst mal 
dem Benutzer die Berechtigung geben muss, auf den seriellen Port 
zuzugreifen.

von Christoph M. (mchris)


Bewertung
0 lesenswert
nicht lesenswert
>> Damit meine ich: 1 jar-File einbinden und einheitlichen Sourcecode
>> verwenden, sonst nix).

>Das geht zumindest unter Linux schon deshalb nicht, weil man erst mal
>dem Benutzer die Berechtigung geben muss, auf den seriellen Port
>zuzugreifen.

Komischerweise geht das bei mir unter Ubuntu aber genau so.
Soweit ich weiß ist JSSC der Treiber der Arduino IDE und läuft damit auf 
gefühlt 1Mio. Rechnern. Bei so viel Usern ist es ziemlich gesichert, 
dass der Treiber funktioniert.

von Rolf M. (rmagnus)


Bewertung
0 lesenswert
nicht lesenswert
Ja, bei Ubuntu kann das sein. Der erste User, den man bei der 
Installation als Default-User anlegt, hat erweiterte Berechtigungen. 
Legt man einen zweiten User an oder nimmt eine Distribution, bei der das 
nicht so ist, dürfte es nicht funktionieren. Denn neben root haben nur 
die Benutzer, die in der Gruppe dialout sind, Zugriff auf die seriellen 
Schnittstellen.

: Bearbeitet durch User
von Christoph M. (mchris)


Bewertung
0 lesenswert
nicht lesenswert
>Ja, bei Ubuntu kann das sein.

Vielleicht liegt's auch daran, dass ich die Arduino-IDE installiert habe 
und die mit ihrem Installationsscript automatisch die Rechte für JSSC 
freischaufelt.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.