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


von Jan H. (derbastelfreund)


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
von Läubi .. (laeubi) Benutzerseite


Lesenswert?

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

von Jan H. (derbastelfreund)


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

von Läubi .. (laeubi) Benutzerseite


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/api/index.html ) 
erweitert CommPort, und der hat eine Mehtode getOutputStream(). Und in 
diesen Outputstream schreibst du einfach 0xFF mittels der Write Methode.

von Jan H. (derbastelfreund)


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.

von Läubi .. (laeubi) Benutzerseite


Lesenswert?

1
SerialPort s = .... (wo auch immer der herkommt);
2
OutputStream out = s.getOutputStream();
3
out.write(0xFF);

von Jan H. (derbastelfreund)


Lesenswert?

Super!! :)
Tausend Dank!
Ich probiere es gleich mal aus.

MFG.Jan

von Läubi .. (laeubi) Benutzerseite


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 ;)

von Jan H. (derbastelfreund)


Angehängte Dateien:

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.

von max.p (Gast)


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.

von Jan H. (derbastelfreund)


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

von Läubi .. (laeubi) Benutzerseite


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?

von Jan H. (derbastelfreund)


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:
1
import java.awt.*;
2
import java.awt.event.*;
3
import java.io.OutputStream;
4
import java.util.Enumeration;
5
import javax.swing.*;
6
import javax.swing.event.*;
7
import javax.comm.*;
8
9
public class Lüftersteuerung5 {
10
  
11
  static long startzeit = System.currentTimeMillis();
12
  static long endzeit;
13
  static int SollSpeedL1;
14
  static int SollSpeedL2;
15
  static String ComArray[]= new String[3];
16
  static int COMIndex = 0;
17
  static boolean Bit0 = true;
18
  static boolean Bit1 = false;
19
  static boolean Bit2 = true;
20
  static boolean Bit3 = false;
21
  static boolean Bit4 = false;
22
  static boolean Bit5 = false;
23
  static boolean Bit6 = false;
24
  static boolean Bit7 = false;
25
  static boolean BitArray[] = {Bit0,Bit1,Bit2,Bit3,Bit4,Bit5,Bit6,Bit7};
26
  static int BitIndex = 0;
27
  static int IstSpeedL1;
28
  static long MesszeitL1 = 1000;
29
  static int IstSpeedL2;
30
  static long MesszeitL2 = 1000;
31
  
32
//****************************************************************************************  
33
  
34
  //FENSTER
35
  
36
  public static void Fenster() {
37
    
38
    JFrame f = new JFrame( "Lüftersteuerung" );
39
     
40
    //Statusfeld wird erzeugt
41
     final JTextField TF3 = new JTextField("Status");
42
    
43
    //Slider für Lüfter 1 wird erzeugt und überwacht;Das AusgabeTextField wird ebenfalls erzeugt
44
     final JTextField TF1 = new JTextField("Lüfter1 aus!");
45
     final JSlider Slider1 = new JSlider(0,100,100);
46
     Slider1.setPaintTicks(true);
47
     Slider1.setMajorTickSpacing(50);
48
     Slider1.setPaintLabels(true);
49
     ChangeListener CL1 = new ChangeListener(){
50
      public void stateChanged(ChangeEvent CE1) {
51
      SollSpeedL1 = ((JSlider) CE1.getSource()).getValue() * 20;
52
      TF1.setText("Geschwindigkeit Lüfter 1: " + SollSpeedL1 + "RPM");
53
      
54
Übertragung();//GEHE ZU ÜBERTRAGUNG;FUNKTIONIERT NICHT;DIESE ZEILE IST LAUT ECLIPSE FALSCH
55
      
56
      }
57
     };
58
     Slider1.addChangeListener(CL1);
59
     Slider1.setEnabled(false);
60
     TF1.setEnabled(false);
61
          
62
     //Kontrollkästchen 1 wird erzeugt und überwacht
63
     final JCheckBox Luefter1 = new JCheckBox( "Lüfter1" );
64
     Luefter1.setSelected(false);
65
     ActionListener AL1 = new ActionListener(){
66
       public void actionPerformed(ActionEvent AE1){
67
        if(Luefter1.isSelected()){
68
           Slider1.setEnabled(true);
69
           TF1.setText("Lüfter1 an!");
70
           TF1.setEnabled(true);
71
        }else{
72
          Slider1.setValue(100);
73
          Slider1.setEnabled(false);
74
          TF1.setText("Lüfter1 aus!");
75
          TF1.setEnabled(false);
76
          }
77
        }
78
     };
79
      Luefter1.addActionListener(AL1);  
80
     
81
     //Slider für Lüfter 2 wird erzeugt und überwacht;Das AusgabeTextField wird ebenfalls erzeugt
82
     final JTextField TF2 = new JTextField("Lüfter2 aus!");
83
     final JSlider Slider2 = new JSlider(0,100,100);
84
     Slider2.setPaintTicks(true);
85
     Slider2.setMajorTickSpacing(50);
86
     Slider2.setPaintLabels(true);
87
     ChangeListener CL2 = new ChangeListener(){
88
      public void stateChanged(ChangeEvent CE2) {
89
      SollSpeedL2 = ((JSlider) CE2.getSource()).getValue() * 20;
90
      TF2.setText("Geschwindigkeit Lüfter 2:" + SollSpeedL2 + "RPM");
91
      
92
Übertragung();//GEHE ZU ÜBERTRAGUNG;FUNKTIONIERT NICHT;DIESE ZEILE IST LAUT ECLIPSE FALSCH
93
        
94
      }
95
     };
96
     Slider2.addChangeListener(CL2);
97
     Slider2.setEnabled(false);
98
     TF2.setEnabled(false);
99
     
100
     //Kontrollkästchen 2 wird erzeugt und überwacht
101
     final JCheckBox Luefter2 = new JCheckBox( "Lüfter2" );
102
     Luefter2.setSelected(false);
103
     ActionListener AL2 = new ActionListener(){
104
       public void actionPerformed(ActionEvent AE2){
105
         if(Luefter2.isSelected()){
106
            Slider2.setEnabled(true);
107
            TF2.setText("Lüfter2 an!");
108
            TF2.setEnabled(true);
109
         }else{
110
            Slider2.setValue(100);
111
            Slider2.setEnabled(false);
112
            TF2.setText("Lüfter2 aus!");
113
            TF2.setEnabled(false);            
114
            }
115
        }   
116
     };
117
     Luefter2.addActionListener(AL2);
118
     
119
     //Fenster wird erzeugt
120
     Container contentPane = f.getContentPane(); 
121
     contentPane.setLayout(new GridLayout(4,2));
122
     contentPane.add(Luefter1);
123
     contentPane.add(Luefter2);
124
     contentPane.add(TF1);
125
     contentPane.add(TF2);
126
     contentPane.add(Slider1);   
127
     contentPane.add(Slider2);
128
     contentPane.add(TF3);
129
     f.setResizable(false);
130
     f.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
131
     endzeit = System.currentTimeMillis();
132
     System.out.println(endzeit-startzeit + "ms");
133
     f.pack();
134
     f.setVisible(true);
135
     //FENSTER ENDE
136
     }
137
//****************************************************************************************
138
  
139
  public static void main(String[] args){  
140
   
141
   //Com Port wird ermittelt und verbunden
142
   Enumeration<CommPortIdentifier> portList;
143
    portList = CommPortIdentifier.getPortIdentifiers();
144
    while (portList.hasMoreElements()) {
145
      CommPortIdentifier PortID = portList.nextElement();
146
      if (PortID.getPortType() == CommPortIdentifier.PORT_SERIAL) {
147
        ComArray[COMIndex]=(PortID.getName());
148
        COMIndex++;
149
      }
150
    }
151
   CommPortIdentifier PortID;
152
   String PortName = ComArray[0];
153
   try {
154
    PortID = CommPortIdentifier.getPortIdentifier(PortName);
155
    final SerialPort SPort = (SerialPort) PortID.open("Lüftersteuerung",1000);
156
    //TF3.setText(PortName + "geöffnet");
157
    Fenster();
158
     
159
    //ÜBERTRAGUNG
160
    
161
    public void Übertragung{//PROGRAMMTEIL ÜBERTRAGUNG;DIESE ZEILE IST LAUT ECLIPSE FALSCH
162
    
163
    //IstSpeed wird eingelesen     
164
     IstSpeedL1 = 0;
165
       while(MesszeitL1 >= System.currentTimeMillis()){
166
         if(SPort.isCD() == true){
167
            if(SPort.isCD() == false){
168
            IstSpeedL1++;  
169
          }
170
         }
171
       }
172
    
173
     IstSpeedL2 = 0;
174
      while(MesszeitL2 >= System.currentTimeMillis()){
175
         if(SPort.isCD() == true){
176
            if(SPort.isCD() == false){
177
            IstSpeedL2++;  
178
          }
179
         }
180
        }
181
      
182
      //Vergleich von IST und SOLL
183
      
184
     if(SollSpeedL2 > IstSpeedL2){
185
         Bit3 = true;
186
         Bit4 = false;
187
       }else if(SollSpeedL2 < IstSpeedL2){
188
         Bit4 = true;
189
         Bit3 = false;
190
       }else if(SollSpeedL2 == IstSpeedL2){
191
         Bit3 = false;
192
         Bit4 = false;
193
      }
194
      
195
     if(SollSpeedL1 > IstSpeedL1){
196
         Bit1 = true;
197
         Bit2 = false;
198
       }else if(SollSpeedL1 < IstSpeedL1){
199
         Bit2 = true;
200
         Bit1 = false;
201
       }else if(SollSpeedL1 == IstSpeedL1){
202
         Bit1 = false;
203
         Bit2 = false;
204
       }
205
          
206
     //Übertragung zum schieberegister
207
     //0xff = High Pegel;0x00 = Low Pegel
208
     
209
     while(BitIndex < BitArray.length){
210
       //Clock
211
       OutputStream out = SPort.getOutputStream();
212
        out.write(0xff);
213
        try {
214
           Thread.sleep(100);
215
         } catch (InterruptedException TS){       
216
         }
217
       //Data
218
       SPort.setDTR(BitArray[BitIndex]);
219
       BitIndex++;
220
       }
221
     //Strobe
222
     SPort.setRTS(true);
223
     try {
224
       Thread.sleep(100);
225
     } catch (InterruptedException TS){       
226
     }
227
     SPort.setRTS(false);
228
  }
229
     //ÜBERTRAGUNG ENDE
230
     
231
//**************************************************************************************** 
232
     
233
  }catch (Exception e) {
234
    //TF3.setText("Fehler:\n" + e.toString());
235
    }
236
  }
237
}

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

von Matthias (Gast)


Lesenswert?

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

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

von Jan H. (derbastelfreund)


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!

von Läubi .. (laeubi) Benutzerseite


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.