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


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


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 ...
1
import jssc.*;
2
3
public class JTest {
4
5
  public static void main(String[] args)
6
  {
7
    String[] ports;
8
    ports = SerialPortList.getPortNames();
9
    System.out.println(""+ports.length);
10
    
11
    for(int i=0; i<ports.length; i++)
12
    {
13
      System.out.println(ports[i]);
14
    }
15
  }
16
}
... ergibt immer Null :-((

Tips, Hinweise? Danke.

: Bearbeitet durch User
von Ich (Gast)


Lesenswert?


von Jim M. (turboj)


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)


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)


Lesenswert?

Frank E. schrieb:
> ... - geht garnicht

DAS geht gar nicht ;-(

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


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)


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)


Lesenswert?

Frank E. schrieb:
> funktuioniert

Muss die auch eine Rechtschreibkorrektur haben?

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


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:
1
import com.fazecast.jSerialComm.SerialPort;
2
import com.fazecast.jSerialComm.SerialPortDataListener;
3
import com.fazecast.jSerialComm.SerialPortEvent;
4
5
public class serComm 
6
{
7
  private SerialPort ports[]=null;
8
  private String recBuf="";
9
  private boolean opened = false;
10
  private SerialPort port = null;
11
  
12
  public serComm() //Konstruktor
13
  {
14
    ports=SerialPort.getCommPorts();
15
  }
16
  
17
  public int getCount() {return ports.length;} //Anzahl der gefunden COM-Ports
18
  
19
  public String getName(int i) {return ports[i].getSystemPortName();} //Name des Port(index)
20
  
21
  public boolean isData() {return recBuf.length()>0;} //Daten verfügbar?
22
  
23
  public String getData() //letzte Daten lesen
24
  {
25
      String retUrn = recBuf;
26
      recBuf="";
27
      return retUrn;
28
  };
29
  
30
  public void writeData(String dat)
31
  {
32
    byte[] sndBytes = dat.getBytes();    
33
    port.writeBytes(sndBytes,sndBytes.length);
34
  }
35
  
36
  //Port mit Parametern öffnen und Listener dranhängen
37
  public boolean getPort(int idx, int baud, int bits, int stop, int pari) //Port(index) öffnen
38
  {
39
    try
40
    {
41
      port = SerialPort.getCommPorts()[idx];
42
      port.setComPortParameters(baud, bits, stop, pari);
43
      port.openPort();
44
      port.addDataListener(new SerialPortDataListener() 
45
      {
46
        public int getListeningEvents()
47
        {
48
          return SerialPort.LISTENING_EVENT_DATA_RECEIVED;
49
        }
50
        public void serialEvent(SerialPortEvent e)
51
            {
52
          byte[] recBytes = e.getReceivedData();
53
          recBuf = new String(recBytes);
54
            }
55
      });  
56
      opened=true;
57
    }    
58
    catch (Exception e)
59
    {
60
      opened=false;
61
    }    
62
    return opened;
63
  }
64
}

getestet hiermit (Port 2 aus der Liste der verfügbaren Ports):
1
public class SerialTest {
2
3
  public static void prn(String msg) {System.out.println(msg);}
4
  
5
  public static void main(String[] args) throws Exception
6
  {
7
    serComm serial = new serComm();
8
    
9
    for (int i=0; i<serial.getCount(); i++)
10
    {
11
      prn( i+": "+serial.getName(i));
12
    }
13
    
14
    if(serial.getPort(2, 9600, 8, 1, 0))
15
    {
16
      while(true)
17
      {
18
        //Thread.sleep(1000);
19
        if(serial.isData())
20
        {
21
          prn(serial.getData());
22
        }
23
        else
24
        {
25
          prn("nix ...");
26
        }
27
      }  
28
    }
29
    else
30
    {
31
      prn ("shit ...");
32
    }
33
  }
34
}

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

: Bearbeitet durch User
von Christoph M. (mchris)


Lesenswert?

Bei mir läuft JSSC auf allen Systemen einwandfrei: Linux,Win,MAC

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


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)


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)


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)


Lesenswert?


von Rolf M. (rmagnus)


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)


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)


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)


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.

von Sven L. (sven_rvbg)


Lesenswert?

Tja böse Welt...

Wenn man eine Anwendung will, die auf allen möglichen Platformen 
funktioniert, dann muss man halt beim Setup oder beim Ausführen der 
Anwendung entsprechend prüfen, ob die Vorgaben erfüllt sind und ggf. 
gegensteuern.

Trotzdem wird man immer wieder auf irgendwelche Hindernisse stoßen und 
das auch nicht dadurch lösen, das man sein Programm in Java schreibt.

Irgendwo ist Hardwarezugriff eben schon etwas anderes, wie nur ein paar 
Fenster anzuzeigen.

Linux ist auch nicht gleich Linux und auch bei Windows ist es nicht 
immer einfach ein Programm auf verschiedenen Versionen bereit zu 
stellen.

Nicht umsonst scripten sich Administratorn die Finger wund um 
Installationsscripte oder Anmeldescripte zu erstellen, die möglichst 
immer funktionieren.

Wieso sollte es dann bei Java anders sein?

Logosoft von Siemens baut auch irgendwie auf Java auf, gewisse Treiber 
müssen dort auch von Hand installiert werden.

Eigentlich ist es ein gutes Zweichen wenn nicht jeder Benutzer alles 
darf, das Sicherheit eigentlich nie bequem ist, sollte ohnehin klar 
sein.

von Christoph M. (mchris)


Lesenswert?

>Wenn man eine Anwendung will, die auf allen möglichen Platformen
>funktioniert, dann muss man halt beim Setup oder beim Ausführen der
>Anwendung entsprechend prüfen, ob die Vorgaben erfüllt sind und ggf.
>gegensteuern.

Deshalb empfehle ich ja JSSC: Die Arduino-IDE läuft bekanntlich auf sehr 
vielen Platformen ( inclusive RaspPi ).

von R. D. (rdiez)


Lesenswert?

Mit PureJavaComm hatte ich Ärger:

https://github.com/nyholku/purejavacomm/issues/118

Am Ende musste ich einfach die Zeit für die Übertragung berechnen, und 
Pausen einfügen.  8-(

Mittlerweile scheint PureJavaComm ein totes Projekt zu sein.

von Mike J. (linuxmint_user)


Lesenswert?

Ich nutze die RXTX-Lib unter Linux.

https://github.com/rxtx/rxtx

Das Problem was ich hier hatte, das war die seltsame Eigenart dass die 
Kommunikation nicht funktioniert wenn man eine Baudrate von 38400 Baud 
einstellt.
Die Wenglor-Sensoren arbeiten im Auslieferungszustand gerade auf der 
Frequenz. Man konnte die Datenrate aber zum Glück beim Sensor umstellen, 
das passiert vorher per Hand (nicht aus der Java-Anwendung heraus).

von J. V. (janvi)


Lesenswert?

Vor Jahren hatte ich mal eine Matlab Anwendung die sowohl unter W7 wie 
auch Ubuntu mit seriell erstaunlich gut gefunzt hat. Ist unter der Haube 
auch alles Java und man könnte nachgucken was die da machen.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.