RxTx Java Event Listener mit USB Converter Problem

Gast #1603470
Hi, vielleicht könnt ihr mir helfen.

Ich versuche gerade über Java ein Messmodull anzusprechen über die USB 
Schnittstelle. Dabei wird ein ADAM 456^ USB to RS485 verwendet.

Dabei kann ich befehle zur Hardware senden, aber bekomme keine reaktion 
vom Eventlistener.
Wenn ich das ganze über einen RS232 Schnittstelle laufen lasse geht das 
ohne Probleme.
Weiß einer wie man das umgehen kann ?
1
package usb;
2

3
import gnu.io.*;
4

5
import java.io.IOException;
6
import java.io.InputStream;
7
import java.io.OutputStream;
8
import java.util.Enumeration;
9
import java.util.TooManyListenersException;
10

11
//import OeffnenUndSenden.serialPortEventListener;
12

13

14

15
public class Main implements Runnable {
16

17
  /**
18
   * @param args
19
   */
20
  public static void main(String[] args)
21
  {
22
    Runnable runnable = new Main();
23
    new Thread(runnable).start();
24
    System.out.println("main finished");
25
  }
26

27
  /**
28
   *
29
   */
30

31
  CommPortIdentifier serialPortId;
32
  Enumeration enumComm;
33
  SerialPort serialPort;
34
  OutputStream outputStream;
35
  InputStream inputStream;
36
  Boolean serialPortGeoeffnet = false;
37

38
  int baudrate = 460800;
39
  int dataBits = SerialPort.DATABITS_8;
40
  int stopBits = SerialPort.STOPBITS_1;
41
  int parity = SerialPort.PARITY_NONE;
42
        int fluss = SerialPort.FLOWCONTROL_NONE;
43
  String portName = "/dev/ttyUSB0";
44

45
  int secondsRuntime = 60;
46

47
  public Main()
48
  {
49
    System.out.println("Konstruktor: EinfachSenden");
50
  }
51

52
    public void run()
53
    {
54
        Integer secondsRemaining = secondsRuntime;
55
        if (oeffneSerialPort(portName) != true)
56
          return;
57

58
    while (secondsRemaining > 0) {
59
      System.out.println("Sekunden verbleiben: " + secondsRemaining.toString() );
60
      secondsRemaining--;
61
      try {
62
      Thread.sleep(2000);
63
    } catch(InterruptedException e) { }
64
    sendeSerialPort("@128001disc;&");
65
    }
66
  schliesseSerialPort();
67

68

69
    }
70

71
  boolean oeffneSerialPort(String portName)
72
  {
73
    Boolean foundPort = false;
74
    if (serialPortGeoeffnet != false) {
75
      System.out.println("Serialport bereits geöffnet");
76
      return false;
77
    }
78
    System.out.println("Öffne Serialport");
79
    enumComm = CommPortIdentifier.getPortIdentifiers();
80
    while(enumComm.hasMoreElements()) {
81
      serialPortId = (CommPortIdentifier) enumComm.nextElement();
82
      if (portName.contentEquals(serialPortId.getName())) {
83
        foundPort = true;
84
        break;
85
      }
86
    }
87
    if (foundPort != true) {
88
      System.out.println("Serialport nicht gefunden: " + portName);
89
      return false;
90
    }
91
    try {
92
      serialPort = (SerialPort) serialPortId.open("Öffnen und Senden", 500);
93
    } catch (PortInUseException e) {
94
      System.out.println("Port belegt");
95
    }
96

97
    try {
98
      outputStream = serialPort.getOutputStream();
99
    } catch (IOException e) {
100
      System.out.println("Keinen Zugriff auf OutputStream");
101
    }
102

103
    try {
104
      inputStream = serialPort.getInputStream();
105
    } catch (IOException e) {
106
      System.out.println("Keinen Zugriff auf InputStream");
107
    }
108
    try {
109
      serialPort.addEventListener(new serialPortEventListener());
110
    } catch (TooManyListenersException e) {
111
      System.out.println("TooManyListenersException für Serialport");
112
    }
113
    serialPort.notifyOnDataAvailable(true);
114
    try {
115
      serialPort.setSerialPortParams(baudrate, dataBits, stopBits, parity);
116
                        serialPort.setFlowControlMode(fluss);
117
    } catch(UnsupportedCommOperationException e) {
118
      System.out.println("Konnte Schnittstellen-Paramter nicht setzen");
119
    }
120

121
    serialPortGeoeffnet = true;
122
    return true;
123
  }
124

125
  void schliesseSerialPort()
126
  {
127
    if ( serialPortGeoeffnet == true) {
128
      System.out.println("Schließe Serialport");
129
      serialPort.close();
130
      serialPortGeoeffnet = false;
131
    } else {
132
      System.out.println("Serialport bereits geschlossen");
133
    }
134
  }
135

136
  void serialPortDatenVerfuegbar() {
137
    try {
138
      byte[] data = new byte[150];
139
      int num;
140
      while(inputStream.available() > 0) {
141
        num = inputStream.read(data, 0, data.length);
142
        System.out.println("Empfange: "+ new String(data, 0, num));
143
      }
144

145
    } catch (IOException e) {
146
      System.out.println("Fehler beim Lesen empfangener Daten");
147
    }
148
  }
149

150
        void sendeSerialPort(String nachricht)
151
  {
152
    System.out.println("Sende: " + nachricht);
153
    if (serialPortGeoeffnet != true)
154
      return;
155
    try {
156
      outputStream.write(nachricht.getBytes());
157
    } catch (IOException e) {
158
      System.out.println("Fehler beim Senden");
159
    }
160
  }
161

162

163
  class serialPortEventListener implements SerialPortEventListener {
164
    public void serialEvent(SerialPortEvent event) {
165
      System.out.println("serialPortEventlistener");
166
      switch (event.getEventType()) {
167
      case SerialPortEvent.DATA_AVAILABLE:
168
        serialPortDatenVerfuegbar();
169
        break;
170
      case SerialPortEvent.BI:
171
      case SerialPortEvent.CD:
172
      case SerialPortEvent.CTS:
173
      case SerialPortEvent.DSR:
174
      case SerialPortEvent.FE:
175
      case SerialPortEvent.OUTPUT_BUFFER_EMPTY:
176
      case SerialPortEvent.PE:
177
      case SerialPortEvent.RI:
178
      default:
179
      }
180
    }
181
  }
182
}

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 16 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.