Serial Lib für Java, die auch funktuioniert?

OP (Firma: Q3) #6039584
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.
Gast #6040491
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?
OP (Firma: Q3) #6040661
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.
Gast #6041229
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.
OP (Firma: Q3) #6046263
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
OP (Firma: Q3) #6049128
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.
#6049709
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.
#6053679
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.
#6053701
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.
#6065887
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.
#6066156
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 ).
#6140462
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).

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren