www.mikrocontroller.net

Forum: PC-Programmierung 0xff an TXD in Java senden


Autor: Jan H. (derbastelfreund)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Es ist mir zwar ein bisschen peinlich zu fragen,
wie ich in Java das Byte 0xff an den TXD Ausgang des Com Ports sende,
da ich hier bei [[Beitrag "Ausgangserweiterung für den COM-Port mit Java ansteuern"]] 
gesagt habe,
dass ich es könne.

Da habe ich mich wohl geirrt.
Ich dachte, dass das nicht so schwer sei, doch nun verzweifele ich 
daran.
Bitte helft mit!!

MFG. Jan

PS: Falls jemand wegen meiner vorherigen Aussage sauer sein sollte:
Sag es mir.

: Gesperrt durch User
Autor: Läubi .. (laeubi) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Und woran verzweifelst du nun? Du brauchst halt eine Serial-Lib z.B. 
RXTX

Autor: Jan H. (derbastelfreund)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
OK
Ich präzisiere mich.
Über welchen Befehl wird das nun gemacht.
SerialPort.sendByte(0xff)
funktioniert meines Wissens nicht.
Ich benutze übrigens die SUN API.
SerialPort.setDTR(true)
funktioniert super, wenn SerialPort in Java als Serielport definiert 
ist.

Bei weiteren Fragen bitte kurz melden.

MFG. Jan

Autor: Läubi .. (laeubi) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Jan H. schrieb:
> SerialPort.sendByte(0xff)
> funktioniert meines Wissens nicht.
Ahah und woher beziehst du dein Wissen? Man rät doch nicht was für 
Funktionen es möglicherweise gibt...
SerialPort ( 
http://java.sun.com/products/javacomm/reference/ap... ) 
erweitert CommPort, und der hat eine Mehtode getOutputStream(). Und in 
diesen Outputstream schreibst du einfach 0xFF mittels der Write Methode.

Autor: Jan H. (derbastelfreund)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du meinst also ich soll das über
getOutputStream(0xff)
machen?

Ich check das einfach nicht.
Könntest du mir vielleicht ein Beispiel geben, oder eins verlinken?

Das mit dem falschen Beispiel war ne doofe Sache,
natürlich rate ich nicht die Funktionen.

Ich bin erst dabei mir mein Wissen anzueignen,
und du hilfst mir gerade dabei etwas wichtiges zu verstehen.

MFG. Jan

EDIT: Befehl oben sollte
OutputStream.write(0xff)
heißen.

Autor: Läubi .. (laeubi) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
SerialPort s = .... (wo auch immer der herkommt);
OutputStream out = s.getOutputStream();
out.write(0xFF);

Autor: Jan H. (derbastelfreund)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Super!! :)
Tausend Dank!
Ich probiere es gleich mal aus.

MFG.Jan

Autor: Läubi .. (laeubi) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Jan H. schrieb:
> Ich probiere es gleich mal aus.
Nicht nur Probieren, sondern obigen Link mal lesen und versuchen zu 
verstehehn warum diese merkwürdige anreihung von Buchstaben dein Problem 
lösen könnte ;)

Autor: Jan H. (derbastelfreund)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Also jetzt da ich weiß, wie es geht, verstehe ich nun auch den Befehl.
Ich konnte vorher nämlich nichts mit dem Returns anfangen, jetzt schon.

Nochmals vielen dank dafür!

Kurzer Themenwechsel:
Könntest du mir vielleicht einen Tipp geben, wie ich eine Methode
in einem Try erstelle, um darauf zuzugreifen?
Ich bin nämlich anscheinend zu doof dazu, bzw. finde keine Lösung im 
I-Net.
Bild von dem Beispielprogramm,welches nur zur Veranschaulichung des 
Problems dient, ist im Anhang.

MFG.Jan

EDIT:
Kurz zu dem Programm:
Es soll erst nach einer bestimmten wechselden Zeit von "AA" zu "UB" 
gewechselt werden
UND "UB" soll auf JEDEN Fall beim Start ausgeführt werden,
dashalb ist es auch in dem try.

EDIT2:
Falls das unter einem neuen Thread gepostet werden sollte,
verschieben wir das eben dorthin.

Autor: max.p (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo

Du verwechselst da was. try-catch ist dafür gedacht, Befehle 
auszuführen, die möglicherweise einen Fehler produzieren. Mit catch kann 
dann gebührend darauf reagiert werden.

Was du brauchst is eine if-Abfrage.

Autor: Jan H. (derbastelfreund)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nur leider ist die Verbindung zum Com Port nur durch try - catch 
herstellbar.
Deshalb das try - catch.
Ich möchte nun von außerhalb ("AA") im try etwas ausführen.
Im Bsp. ist das "UB",
das schaffe ich jedoch nicht :(
Das man das Beispielprogramm anders aufbauen kann ist mir schon klar,
nur dann stellt es nicht mehr den Sachverhalt des echten Problems dar.
vielleicht muss ich auch nur vor das "UB" andere Modifier vorsetzen,
nur welche??

MFG. Jan

Autor: Läubi .. (laeubi) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Erstmal Sourcecode bitte als Anhang oder wenigstens das Bild soweit 
beschneiden das nur das wesentliche zu sehen ist.
musst einfach UB als Funktion deklarieren und dann das "sleep" in AB 
verlagern und dann UB aufrufen.
Ansonsten würde ich dir dringend empfehlen erstmal ein bisschen was Mit 
Java zu machen anstatt Blind herumprobieren.
Oder wenigstens das tatsächliche Problem zu beschreiben, das Beispiel 
ist irgendwie nicht sehr stimmig.

> Nur leider ist die Verbindung zum Com Port nur durch try - catch
> herstellbar.
Nein, das stimmt so nicht, das Verbinden kann nur fehlschlagen, deshalb 
brauchst du das try/catch, du könntest aber auch mit trow die Exception 
"weiterwerfen"

> Ich möchte nun von außerhalb ("AA") im try etwas ausführen.
Wenn es von "außerhalb" ist ist es nicht "im" try... warum sollte es 
auch?

Autor: Jan H. (derbastelfreund)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
OK ich glaube wir reden aneinander vorbei,
da ich mich irgendwie nicht richtig ausdrücke.
Ich poste jetzt mal die ~200 Zeilen des Programmes, welches ich erst 
nach Vollendung veröffentlichen wollte:
import java.awt.*;
import java.awt.event.*;
import java.io.OutputStream;
import java.util.Enumeration;
import javax.swing.*;
import javax.swing.event.*;
import javax.comm.*;

public class Lüftersteuerung5 {
  
  static long startzeit = System.currentTimeMillis();
  static long endzeit;
  static int SollSpeedL1;
  static int SollSpeedL2;
  static String ComArray[]= new String[3];
  static int COMIndex = 0;
  static boolean Bit0 = true;
  static boolean Bit1 = false;
  static boolean Bit2 = true;
  static boolean Bit3 = false;
  static boolean Bit4 = false;
  static boolean Bit5 = false;
  static boolean Bit6 = false;
  static boolean Bit7 = false;
  static boolean BitArray[] = {Bit0,Bit1,Bit2,Bit3,Bit4,Bit5,Bit6,Bit7};
  static int BitIndex = 0;
  static int IstSpeedL1;
  static long MesszeitL1 = 1000;
  static int IstSpeedL2;
  static long MesszeitL2 = 1000;
  
//****************************************************************************************  
  
  //FENSTER
  
  public static void Fenster() {
    
    JFrame f = new JFrame( "Lüftersteuerung" );
     
    //Statusfeld wird erzeugt
     final JTextField TF3 = new JTextField("Status");
    
    //Slider für Lüfter 1 wird erzeugt und überwacht;Das AusgabeTextField wird ebenfalls erzeugt
     final JTextField TF1 = new JTextField("Lüfter1 aus!");
     final JSlider Slider1 = new JSlider(0,100,100);
     Slider1.setPaintTicks(true);
     Slider1.setMajorTickSpacing(50);
     Slider1.setPaintLabels(true);
     ChangeListener CL1 = new ChangeListener(){
      public void stateChanged(ChangeEvent CE1) {
      SollSpeedL1 = ((JSlider) CE1.getSource()).getValue() * 20;
      TF1.setText("Geschwindigkeit Lüfter 1: " + SollSpeedL1 + "RPM");
      
Übertragung();//GEHE ZU ÜBERTRAGUNG;FUNKTIONIERT NICHT;DIESE ZEILE IST LAUT ECLIPSE FALSCH
      
      }
     };
     Slider1.addChangeListener(CL1);
     Slider1.setEnabled(false);
     TF1.setEnabled(false);
          
     //Kontrollkästchen 1 wird erzeugt und überwacht
     final JCheckBox Luefter1 = new JCheckBox( "Lüfter1" );
     Luefter1.setSelected(false);
     ActionListener AL1 = new ActionListener(){
       public void actionPerformed(ActionEvent AE1){
        if(Luefter1.isSelected()){
           Slider1.setEnabled(true);
           TF1.setText("Lüfter1 an!");
           TF1.setEnabled(true);
        }else{
          Slider1.setValue(100);
          Slider1.setEnabled(false);
          TF1.setText("Lüfter1 aus!");
          TF1.setEnabled(false);
          }
        }
     };
      Luefter1.addActionListener(AL1);  
     
     //Slider für Lüfter 2 wird erzeugt und überwacht;Das AusgabeTextField wird ebenfalls erzeugt
     final JTextField TF2 = new JTextField("Lüfter2 aus!");
     final JSlider Slider2 = new JSlider(0,100,100);
     Slider2.setPaintTicks(true);
     Slider2.setMajorTickSpacing(50);
     Slider2.setPaintLabels(true);
     ChangeListener CL2 = new ChangeListener(){
      public void stateChanged(ChangeEvent CE2) {
      SollSpeedL2 = ((JSlider) CE2.getSource()).getValue() * 20;
      TF2.setText("Geschwindigkeit Lüfter 2:" + SollSpeedL2 + "RPM");
      
Übertragung();//GEHE ZU ÜBERTRAGUNG;FUNKTIONIERT NICHT;DIESE ZEILE IST LAUT ECLIPSE FALSCH
        
      }
     };
     Slider2.addChangeListener(CL2);
     Slider2.setEnabled(false);
     TF2.setEnabled(false);
     
     //Kontrollkästchen 2 wird erzeugt und überwacht
     final JCheckBox Luefter2 = new JCheckBox( "Lüfter2" );
     Luefter2.setSelected(false);
     ActionListener AL2 = new ActionListener(){
       public void actionPerformed(ActionEvent AE2){
         if(Luefter2.isSelected()){
            Slider2.setEnabled(true);
            TF2.setText("Lüfter2 an!");
            TF2.setEnabled(true);
         }else{
            Slider2.setValue(100);
            Slider2.setEnabled(false);
            TF2.setText("Lüfter2 aus!");
            TF2.setEnabled(false);            
            }
        }   
     };
     Luefter2.addActionListener(AL2);
     
     //Fenster wird erzeugt
     Container contentPane = f.getContentPane(); 
     contentPane.setLayout(new GridLayout(4,2));
     contentPane.add(Luefter1);
     contentPane.add(Luefter2);
     contentPane.add(TF1);
     contentPane.add(TF2);
     contentPane.add(Slider1);   
     contentPane.add(Slider2);
     contentPane.add(TF3);
     f.setResizable(false);
     f.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
     endzeit = System.currentTimeMillis();
     System.out.println(endzeit-startzeit + "ms");
     f.pack();
     f.setVisible(true);
     //FENSTER ENDE
     }
//****************************************************************************************
  
  public static void main(String[] args){  
   
   //Com Port wird ermittelt und verbunden
   Enumeration<CommPortIdentifier> portList;
    portList = CommPortIdentifier.getPortIdentifiers();
    while (portList.hasMoreElements()) {
      CommPortIdentifier PortID = portList.nextElement();
      if (PortID.getPortType() == CommPortIdentifier.PORT_SERIAL) {
        ComArray[COMIndex]=(PortID.getName());
        COMIndex++;
      }
    }
   CommPortIdentifier PortID;
   String PortName = ComArray[0];
   try {
    PortID = CommPortIdentifier.getPortIdentifier(PortName);
    final SerialPort SPort = (SerialPort) PortID.open("Lüftersteuerung",1000);
    //TF3.setText(PortName + "geöffnet");
    Fenster();
     
    //ÜBERTRAGUNG
    
    public void Übertragung{//PROGRAMMTEIL ÜBERTRAGUNG;DIESE ZEILE IST LAUT ECLIPSE FALSCH
    
    //IstSpeed wird eingelesen     
     IstSpeedL1 = 0;
       while(MesszeitL1 >= System.currentTimeMillis()){
         if(SPort.isCD() == true){
            if(SPort.isCD() == false){
            IstSpeedL1++;  
          }
         }
       }
    
     IstSpeedL2 = 0;
      while(MesszeitL2 >= System.currentTimeMillis()){
         if(SPort.isCD() == true){
            if(SPort.isCD() == false){
            IstSpeedL2++;  
          }
         }
        }
      
      //Vergleich von IST und SOLL
      
     if(SollSpeedL2 > IstSpeedL2){
         Bit3 = true;
         Bit4 = false;
       }else if(SollSpeedL2 < IstSpeedL2){
         Bit4 = true;
         Bit3 = false;
       }else if(SollSpeedL2 == IstSpeedL2){
         Bit3 = false;
         Bit4 = false;
      }
      
     if(SollSpeedL1 > IstSpeedL1){
         Bit1 = true;
         Bit2 = false;
       }else if(SollSpeedL1 < IstSpeedL1){
         Bit2 = true;
         Bit1 = false;
       }else if(SollSpeedL1 == IstSpeedL1){
         Bit1 = false;
         Bit2 = false;
       }
          
     //Übertragung zum schieberegister
     //0xff = High Pegel;0x00 = Low Pegel
     
     while(BitIndex < BitArray.length){
       //Clock
       OutputStream out = SPort.getOutputStream();
        out.write(0xff);
        try {
           Thread.sleep(100);
         } catch (InterruptedException TS){       
         }
       //Data
       SPort.setDTR(BitArray[BitIndex]);
       BitIndex++;
       }
     //Strobe
     SPort.setRTS(true);
     try {
       Thread.sleep(100);
     } catch (InterruptedException TS){       
     }
     SPort.setRTS(false);
  }
     //ÜBERTRAGUNG ENDE
     
//**************************************************************************************** 
     
  }catch (Exception e) {
    //TF3.setText("Fehler:\n" + e.toString());
    }
  }
}

Wichtig sind hierbei nur, die Zeilen mit "Übertragung" und 
entsprechender "//" Erklärung
Startzeit und Endzeit sind nur zur Zeitmessung und nicht wichtig!

Probiere es mal  in Eclipse o.Ä. aus, aber ohne die Fehlerzeilen, und 
mit einer Serial Lib (Sun o.Ä).

Falls jetzt noch etwas am Code oder am Problem Unklar sein sollte, sagt 
mir wie immer Bescheid und falls das nun nicht mehr hier hineingehört 
sagt es mir auch.
An alle die diesen Code lesen (oder versuchen ihn zu lesen, oder ihn nur 
zum Teil lesen):
Danke für eure Aufmerksamkeit!!

MFG. Jan

Autor: Matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,
und "Thread.sleep" löst bei dir eine Exception aus ?

Ich vermute da ist etwas an deinem System / Framework faul.

Autor: Jan H. (derbastelfreund)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sch***e!!
Ich habe den falschen Code geposted grrrrrrr!!
Ich war im falschen Programm!!
In diesem Programm kann das, was ich vor habe nicht funktionieren, da 
bei der
kleinsten Änderung von einem Slider bei jedem "Tacken" das Programmteil 
"Übertragung" gestartet werden soll.->Mega Verzögerung!!

@Matthias
Nöö, ich dachte nur WENN mal was passiert.

Ich würde mal sagen es ist Zeit "closed" zu sagen!

CLOSED!

Autor: Läubi .. (laeubi) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Matthias schrieb:
> und "Thread.sleep" löst bei dir eine Exception aus ?
> Ich vermute da ist etwas an deinem System / Framework faul.
Da ist garnix faul... sleep löst die Interruped Exception aus wenn der 
Thread während er "schläft" abgebrchen wird.

btw: Längeren Code als Anhang!

public void Übertragung{//PROGRAMMTEIL ÜBERTRAGUNG;DIESE ZEILE IST LAUT 
ECLIPSE FALSCH

fehlen () und außerdem sind Sonderzeichen nie eine gute Idee!

Jan H. schrieb:
> CLOSED!
Auf Wunsch...

Dieser Beitrag ist gesperrt und kann nicht beantwortet werden.