Java und RS232 - wer kann aushelfen ?

awesome

Grünschnabel
Hallo allerseits !

Mein Problem ist folgendes :

Ich möchte mit JAVA über eine RS232 Schnittstelle Daten senden.
Um das ganze einmal auszuprobieren haben ich mir ein Beispielprogramm
zur Brust genommen und das ganze ausprobiert, hat auch funktioniert,
sprich ich konnte per Hyperterminal alles empfangen.

Nun wollte ich das ganze etwas umgestallten, und schon ging der Ärger
los.

Mein Gedanke war folgender: Per Schieberegler kann ich einen Wert von 0
bis 255 einstellen. Dieser Wert wird dann in ein Feld kopiert und in
einen binär Wert umgewandelt (alles noch kein Problem). Jetzt hatte ich
vor eben diesen binär Wert per RS232 an das Hyperterminal zu schicken.
Und siehe da es funktioniert nicht. Ich dachte mir wenn ich das
Beispielprogramm an meine Bedürfnisse anpasse kann das ja nicht so
schwer sein -> Falsch gedacht.

Vielleicht kann mir ja irgendjemand gute Ratschläge und vielleicht auch
ein paar Erklärungen geben (habe zwar gegoogelt aber die Ausbeute war
eher mager und unbefriedigend)

Der Code sieht wie folgt aus :

Code:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.*;
import java.io.*;
import javax.comm.*;

        
public class schieberegler extends JFrame 
{
  
  static JTextField tf;
  static JScrollBar sb;
  static JButton aendern;
  static JTextField binär;
  static JButton senden;
  static JTextArea ausgabe;
  static JLabel label1;
  static JLabel label2;
  static JLabel label3;
  static JLabel label4;
  static JLabel label5;
  static JLabel label6;
  static CommPortIdentifier portID;
  InputStream ins;
  OutputStream out;
  static SerialPort serss;
  


  public static void main( String args[] )
  {
    try{portID = CommPortIdentifier.getPortIdentifier("CNCA0");
        serss = (SerialPort) portID.open("Schieberegler",2000);
        
    }
    catch(Exception exc){System.out.println("Fehler :"+exc);} 
    JFrame f = new JFrame();
    f.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
    f.setTitle("RS232 Ansteuerung von ");
    f.pack();
    f.setSize(250,130);
    f.setVisible( true );
     Container c = f.getContentPane();

    c.setLayout( new GridLayout(6,2) );

    c.add (label1 = new JLabel("Aktueller SR Wert:"));
    c.add ( tf = new JTextField( 20 ) );
    c.add (label2 = new JLabel("Schieberegler:"));
    c.add ( sb = new JScrollBar( JScrollBar.HORIZONTAL, 0, 10, 0, 255+10 ) );
    c.add (label3 = new JLabel("Wert ändern:"));
    c.add(aendern = new JButton("ändern"));
    c.add (label4 = new JLabel("Binärer Wert:"));
    c.add(binär = new JTextField(20));
    c.add (label5 = new JLabel("Gäenderten Wert senden:"));
    c.add(senden = new JButton("Wert senden"));
    c.add(label6 = new JLabel("Satus:"));
    c.add(ausgabe = new JTextArea("Port COM geöffnet\n",7,40));
    
    aendern.addActionListener(new ActionListener() { 
        public void actionPerformed(ActionEvent e) {
        
        String b = null;
          int Wert; 
          Wert = sb.getValue();
          
           b = (new Integer(Wert)).toBinaryString(Wert);
           binär.setText(""+b);
        }
    } );

    tf.addActionListener( new ActionListener() {
          public void actionPerformed( ActionEvent e ) {
            sb.setValue( Integer.parseInt(tf.getText()) );
          }
    } );

    sb.addAdjustmentListener( new AdjustmentListener() {
          public void adjustmentValueChanged( AdjustmentEvent e ) {
            tf.setText( "" + sb.getValue() );
          }
    } );
  }
  
  public schieberegler() {
  
    binär.addActionListener(new sendeListener());
    senden.addActionListener(new sendeListener());
    
    try {ins = serss.getInputStream();
         out = serss.getOutputStream();
         serss.addEventListener(new commListener());
    }
   catch (Exception e) { System.out.println("Fehler: "+e);}
    serss.notifyOnDataAvailable(true);
    try {serss.setSerialPortParams(2400,
                                   SerialPort.DATABITS_8,
                                   SerialPort.STOPBITS_1 ,
                                   SerialPort.PARITY_NONE);}
    catch (UnsupportedCommOperationException e) {}
  }
    
    public class sendeListener implements ActionListener{
    public void actionPerformed(ActionEvent e){
      PrintWriter aus = new PrintWriter(out);
      aus.println(binär.getText());
      aus.flush();
      aus.close();
    }
  }

  public class commListener implements SerialPortEventListener{
    public void serialEvent(SerialPortEvent event) {
      if(event.getEventType()==SerialPortEvent.DATA_AVAILABLE){
        byte[] readBuffer = new byte[20];
        try {
          while (ins.available() > 0) {int numBytes = ins.read(readBuffer);}
          String nachricht = new String(readBuffer);
          ausgabe.append(nachricht);
          
        }
        catch (IOException e) {System.out.println("Fehler: "+e);}
    
      }
    }
  }
}
 
Hallo,

nichts für ungut aber der Code ist echt starker Tobac.

Für mich ein Anwerter auf den "Worst Code Award 2008".

Aber setz einfach mal ein new schieberegler() ans ende deiner main-Methode
dann werden auch deine ActionListener ordnungsgemäß registriert.

Aber nochmal möchte ich sowas nicht lesen müssen !

Gruß JAdix
 
Gut, vielen Dank !

Hat funktioniert, das ganze läuft wie geschmiert.

Ich wäre dir sehr dankbar, wenn du mir jetzt noch erklären könntest warum das ganze nun funktioniert.

Vielen Vielen Dank, awesome
 
Zuletzt bearbeitet:
Hi, mach ich doch gern !

Deine Klasse schieberegler (die man GROSS schreiben sollte, weil man
das in Java bei Klassen so macht) baut ja in der main()-Methode die GUI
auf (was schonmal schön scheußlig genug ist, all die schönen Objekte
in häßlichen static-Klassenfeldern).
Aber der Konstruktor der Klasse (die auch noch von JFrame abgeleitet ist, aber
nie selbst ein richtiges Fenster sein darf, arme Klasse) wurde nie aufgerufen.
In der Folge wurden dein AktionListener sendeListener() nie instanziiert und dem
Button übergeben. Was dann dazu führte das der ActionEvent ins Leere lief und
der entsprechende Code nie ausgeführt wurde.

Zum ...
Hat funktioniert, das ganze läuft wie geschmiert.
... ist zu sagen,
auch wenn es Funktioniert ist der Code eine Zumutung !
Hätte der Compiler gefühle, er hätte geweint !

Gruß JAdix
 
hi,

das ist zwar kein gut geschriebener Code, dennoch bin ich der Meinung könnte man das besser ausdrücken und eventuell auch Informationsquellen preisgeben. Es hat niemand was davon, wenn man ihn nur anschnauzt!

Nur mal so am Rande.

Greeze Chimaira
 
Sorry,

Ich dachte aus Sätzen wie :

was schonmal schön scheußlig genug ist, all die schönen Objekte
in häßlichen static-Klassenfeldern

und

Hätte der Compiler gefühle, er hätte geweint !

wäre ein gewisses Augenzwinkern herauszulesen gewesen.

Werde nächstesmal mindestens ein halbes duzend Smileys zur
entschärfung meiner Worte einsetzen.

Bin ja garnicht so böse, wie es hier klingt ... ;-]

Nur Spass :)

Also nix für ungut, - Frieden ? ? ?

Gruß JAdix
 
Zurück