Daten aus einer Seriellen Schnittstelle empfangen

Status
Nicht offen für weitere Antworten.

Dana

Aktives Mitglied
Hallo Freunde,

ich versuche aus einer seriellen Schnittstelle Daten zu empfangen.
Ich habe im Netz den unteren Code gefunden.
Es funktioniert außer, dass am Enden des Codes einpaar komische Rechtecke stehen. Wieso ?
Und beim byte[] readBuffer = new byte[8]; warum gerade 8 ?

Vielen Dank im Voraus


Code:
public void Test(MyFrame frame)
{
   
   try{portId = CommPortIdentifier.getPortIdentifier("COM2");
        serialPort = (SerialPort) portId.open("",1000);
    }
    catch(Exception exc){System.out.println("Fehler1 :"+exc);}
    
    try {
         is = serialPort.getInputStream();
         serialPort.addEventListener(new commListener());
       }
      catch (Exception e) { System.out.println("Fehler2: "+e);}
      
     serialPort.notifyOnDataAvailable(true);
      try {serialPort.setSerialPortParams(9600,
                                SerialPort.DATABITS_8,
                                SerialPort.STOPBITS_1 ,
                                SerialPort.PARITY_NONE);}
 catch (UnsupportedCommOperationException e) {}
 
   
}
      public class commListener implements SerialPortEventListener{
          public void serialEvent(SerialPortEvent event) {
            if(event.getEventType()==SerialPortEvent.DATA_AVAILABLE){
              byte[] readBuffer = new byte[8];
              try {
                while (is.available() > 0) 
                {
                  int numBytes = is.read(readBuffer);
                }
                String nachricht = new String(readBuffer);
                frame.TextCode.append(nachricht);
                 
              }
              catch (IOException e)
              {
                System.out.println("Fehler3: "+e);
              }
            }
          }
        }



}
 
T

tuxedo

Gast
Naja, 8... einfach so halt.. Es werden möglichst immer 8 Zeichen gelesen... Die "seltsamen" Rechtecke sind nicht darstellbare Sonderzeichen. Du kannst ja mal den Integer-Wert der rechtecke ausgeben lassen und in einer Ascii-Tabelle nachschlagen was das für Zeichen sind. Aber ich Tippe mal auf CR (Wagenrücklauf) und LF (Zeilenumbruch).

BTW: Von was für einer Quelle liest du zeichen ein?
 
T

tuxedo

Gast
?? Du liest doch von der seriellen Schnittstelle...
Meine Frage war: Was ist da die Quelle der Daten?

GPS-Empfänger, Heizungssteuerung XY, Receiver YZ, ...

Sowas in der Art hab ich erwartet.. Schließlich kann man keine Textdatei an eine serielle Schnittstelle anschließen... :) Oder gibts jetzt Textdateien mit RS232-Schnittstelle *jokingly*

Nochmal zum Read-Buffer: Den kannst du nach belieben wählen. Machst du ihn größer wird mehr pro Durchgang gelesen. Machst du ihn kleiner wird weniger gelesen. Ist halt ein Puffer den du "frei" wählen kannst.

- Alex
 

Dana

Aktives Mitglied
in der Textdatei habe ich
1
2
3
A
B

geschrieben. Die Buchstaben und die Ziffern werden alle angezeigt, aber am Ende kommen sechs Rechtecke. Ich habe in der Textdatei geschaut da ist nix hinter der letzter Buchstabe
 
T

tuxedo

Gast
Wenn du die Textdatei aufmachst: Siehst du dann den Zeilenumbruch als Zeichen? Nein. Du siehst nur dass ein neuer Buchstabe/Zahl in einer neuen Zeile steht. Der Texteditor hat "intern" quasi auch solche "Rechtecke". Nur weiß der Texteditor dass er daraus einen Zeilenumbruch etc. machen muss.

Du kannst jetzt folgendes machen:

1) Du lässt dir den Integer-Wert der Rechtecke ausgeben und schlägst in einer ASCII-Tabelle nach was das für zeichen sind.

2) Du schreibst (write(byte[] byte);) das, was dein Programm von der seriellen Schnittstelle ließt per Java in eine Datei und öffnest diese nachher mit einem Texteditor. Die Datei sollte, wenn du alles richtig gemacht hast, wieder so aussehen wie am Anfang.


- Alex
 

Dana

Aktives Mitglied
Erst mal danke für deine mühe. (Ah ja.. D.h. du hast ein Programm das auf der seriellen Schnittstelle sendet (Hyperterminal, ein Java-Tool oder was in der Art), und auf einem anderen PC ein zweites Programm das empfängt. Und dazwischen hängt ein Null-Modem-Kabel, oder?)
Richtig es ist genau so.

Die Rechtecke können mit der Textdatei nicht zu tun habe, denn wenn ich die
byte[] readBuffer = new byte[8]; von acht auf z.B. 10 oder 13 Umstelle dann werden die Rechtecke viel mehr
 
T

tuxedo

Gast
Tu uns beiden den gefallen und lass die Integer-Werte der Rechtecke ausgeben und dann poste die hier bitte.

Wie gesagt: In einem Texteditor wird nicht alles als Zeichen angezeigt was da auch wirklich drin ist.
Wenn du vorher bei 5 Zeilen 6 Rechtecke hattest heißt das für mich: Pro Zeile eine Rechteck für Zeilenumbruch und abschließend eins für's Ende der Datei, oder sowas in der Art.

Wir können aber noch lange rumrätseln was das für Zeichen sind, solange du nicht den Integer-Wert der Zeichen auswertest.

- Alex
 
T

tuxedo

Gast
Hier ein wenig Beispielcode.

Code:
        // Pufferinhalt zeilenweise als Integer ausgeben
        for (int i=0; i<readBuffer.length;i++){
            System.out.println((int)buffer[i]);
        }

Solltest du in deinem Beispielcode nach Zeile 33 einbauen. Also nachdem der readBuffer befüllt wurde...
 
T

tuxedo

Gast
Anonymous hat gesagt.:
Das Kästchen ist ein Zeilenumbruch... Ziemlich sicher...

Muss nicht unbedingt ein Zeilenumbruch sein. Wenn in der Textfile nur eine Zeile existiert kanns tatsächlich auch was anderes sein. Ein EOF-Zeichen oder sowas...
 

Dana

Aktives Mitglied
Ich habe in der Textdatei Hallo geschrieben
das Programm gibt die Zahlen aus
Die Zahlen 104

97
108
108
111
0
0
0
d.h. die Drei Null sind zuviel. Woran liegt es bitte ?
 

Dana

Aktives Mitglied
Hallo hat 5 Buchstaben und das Programm gibt 8 Zahlen raus, weil in der Zeile 28
byte[] readBuffer = new byte[8]; steht, oder ?? wenn ja, wie kann ich diese Array die richtige Länger der Zeile übergeben??
 

Dana

Aktives Mitglied
Hallo hat 5 Buchstaben und das Programm gibt 8 Zahlen raus, weil in der Zeile 28
byte[] readBuffer = new byte[8]; steht, oder ?? wenn ja, wie kann ich diese Array die richtige Länger der Zeile übergeben??
 
T

tuxedo

Gast
Der Ascii-Wert "0" ist kein Zeichen aus dem herkömmlichen Alphabet.

Tauchen _immer_ drei Nullen auf? Sprich: Tauchen die bei jeder Antwort der CNC-Maschine am Ende auf?

Wenn ja dann ist das eine eigenart der Maschine. Normalerweise sind solche Sachen auch in einem Handbuch spezifiziert.

Vielleicht hilft es auch weiter wenn du "erklärst" was du genau machen willst. Macht ja an sich wenig Sinn an der CNC-Maschine eine Textdatei mit Inhalt "Hallo" via serieller Schnittstelle an einen PC zu senden. Geht's vielleicht drum ein CNC-Programm von der Maschine zum PC zu übertragen und vllt. auch wieder zurück?

Würde definitv mal das Handbuch nach Infos und Angaben zur seriellen Schnittstelle durchsuchen. Weil ein Java-Seitiger "Fehler" ist das mit 99,9999998%iger Wahrscheinlichkeit nicht.

- Alex

P.S. Hier mal ne Ascii-Tabelle. Da kannst du die Zahlencodes auch selbst nachschlagen:
asciifull.gif

extend.gif
 
T

tuxedo

Gast
Okay, du warst schneller als ich ....

jo, du kannst den Puffer auch verkleiner. Stell ihn mal stat 8 auf 1 ein ...

Hab da noch ne Idee.. momentchen ...

[update]

So... jetzt...

Code:
byte[] readBuffer = new byte[8]; 
              try { 
                while (is.available() > 0) 
                { 
                  int numBytes = is.read(readBuffer); 
                } 
                String nachricht = new String(readBuffer); 
                frame.TextCode.append(nachricht); 
                  
              }

Du hast also den Puffer auf 8... ABER beim lesen merkst du dir die anzahl der gelesenen Zeichen in "numBytes"...

Dieser Wert sollte, wenn nur "Hallo" übertragen wird, eigentlich 5 betragen. Damit kannst du den Puffer im nachinein entsprechend "kürzen". Vorher geht das nicht. Du weißt ja nicht wieviele Zeichen du empfängst... Und den Puffer auf 1 runterschrauben ist keine gute Idee.

Prüf das mal mit dem "numBytes"...

- Alex
 

Dana

Aktives Mitglied
Erstmal vielen Dank für eure Mühe, besonders du Alex.
Geht's vielleicht drum ein CNC-Programm von der Maschine zum PC zu übertragen und vllt. auch wieder zurück?
Genau so ist es.

Es ist was „für mich unerklärliches “ passiert. An der Zeile 35 meine Codes steht
frame.TextCode.append(nachricht);
TextCode ist eine JTextArea gewesen und habe sie in TextArea umgewandelt. Die Rechtecke werden nicht mehr angezeigt, bzw. der Text wird genauso übertragen wie er geschrieben ist. Könntet ihr das verstehen?? Macht es einen Unterschied??
MfG
 
T

tuxedo

Gast
Argh. Du solltest Swing (Die J-Klassen, z.b. "JTextArea"), nicht mit AWT-Klassen (ohne J am Anfang, z.B. "TextArea") nicht mischen. Das führt früher oder später unweigerlich zu Problemen.

Das was du da "versuchst" ist keine Lösung des Problem. Das ist nur ein "dirty Work-Around". Du bekämpfst die Symptome, nicht aber die Ursache.

Ich vermute die Sonderzeichen werden deshlab im "TextArea" nicht mehr angezeigt weil da drin einfach keine Sonderzeichen angezeigt werden können.. Wie gesagt, habs nicht probiert, ich vermute es.

Du wandelst ja irgendwann deinen byte[]-Puffer in einen String um...

Code:
String nachricht = new String(readBuffer);

Du solltest hier jedoch prüfen ob du den Puffer beim lesen vollmachen konntest, oder ob noch leere Stellen drin sind. Das kannst du wie gesagt über "numBytes", welches du hier bekommst:

Code:
while (is.available() > 0) { 
   int numBytes = is.read(readBuffer); 
}
/* erst hier wird der Puffer weiter verarbeitet */

Du liest bisher solange Daten wie welche anliegen, und füllst damit den Puffer. Was machst du wenn der Puffer voll ist?

Ein Beispiel:
Gehen wir wieder von einer Puffergröße von 8 aus. Und die Maschine sendet 10 Zeichen...
Nehmen wir mal an das wäre folgender String:

"abcdefghij"

Beim ersten lesen wird der Puffer mit "abcdefgh" gefüllt und ist voll. Die Bedingung der While-Schleife ist aber noch "true". Es liegen ja noch 2 Zeichen an, nämlich i und j. Der Puffer wird also erneut benutzt. Der bisherige Inhalt von readBuffer wird weggeworfen und durch "ij" ersetzt. Die letzten 6 Zeichen, die im Puffer dann noch übrig sind, dürften wieder diese Sonderzeichen sein.

Du solltest also sowas hier machen:

Code:
while (is.available() > 0) { 
   int numBytes = is.read(readBuffer); 
   String nachricht = new String(readBuffer,0,numBytes);
   /* mache hier was mit "nachricht" */
}

Zum einen nimmst du nur soviel aus dem Puffer raus wie auch drin steht, und zum anderen werden Teile der ankommenden Information, die nicht auf einmal in den Puffer passe nicht weggeworfen, sondern gleich verarbeitet, bevor sie weggeworfen werden.

- Alex

P.S.

Dana hat gesagt.:
Die Rechtecke werden nicht mehr angezeigt, bzw. der Text wird genauso übertragen wie er geschrieben ist.

Du hast da was falsch verstanden: Die Rechtecke sind nicht Teil der Übertragung. Die Rechtecke sind leere Plätze im Puffer. Wenn der Puffer 8 groß ist und du nur 5 zeichen reinschreibst, hast du 3 leere Stellen. Und das sind deine Rechtecke.
Die Übertragung ist also nach wie vor die gleiche. Nur zeigt TextArea scheinbar keine Sonderzeichen an...
 

Dana

Aktives Mitglied
Suuuuuper es hat mit der Ergänzung

Code:
while (is.available() > 0) 
       {
         int numBytes = is.read(readBuffer);
          String nachricht = new String(readBuffer,0,numBytes); 
           frame.PCode.append(nachricht);
       }

Funktioniert. Es spielt jetzt keine Rolle mehr, wie lang mein Buffer ist, oder ?

Vielen Dank Alex
 
T

tuxedo

Gast
Naja, die Puffergröße ist eine Frage der Datenmenge.
Funktionieren tuts jetzt immer. Ob du jetzt 1 oder 1024 einstellst.
Aber wenn du Megabyteweise Daten durchschaufelst, ist es sinnvoller keine allzukleinen blöcke (z.B. puffergröße 1) zu lesen.

Denn dann wird für jedes einzelne Byte das hier aufgerufen:

Code:
int numBytes = is.read(readBuffer);

Ist der Puffer also 1 groß und du willst 1 Megabyte übertragen, wird etwa 1 Million mal is.read() aufgerufen.
Ist der Puffer größer als 1, z.B. 512, dann wird die Methode nur knapp etwa 2000 mal aufgerufen.

Du merkst: 500 mal mehr die is.read() Methode aufrufen dauert dann auch länger...

Musst dir also überlgen wieviele Daten du senden und Empfangen willst, und dann den Puffer einstellen.

- Alex
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
V Umgang mit fehlenden Daten in einer Java-Datenanalyseanwendung Allgemeine Java-Themen 5
J JSON Daten von einer Webseite erhalten Allgemeine Java-Themen 2
N Daten einer JCoTable in JTextArea anzeigen Allgemeine Java-Themen 7
K Gespeicherte Daten von einer LinkedList auf vier LinkedList verteilen Allgemeine Java-Themen 6
A Erste Schritte Daten aus einer Website auslesen Allgemeine Java-Themen 7
C HtmlUnit Daten einer Tabelle bekommen ohne, dass diese eine ID aufweist Allgemeine Java-Themen 1
T Mit Apache Poi Daten aus einer Excel Tabelle kopieren und in Word einfügen Allgemeine Java-Themen 1
G Combobox füllen mit daten aus einer Tabelle Allgemeine Java-Themen 4
Z Daten von einer Klasse in eine andere übertragen Allgemeine Java-Themen 8
Z Daten aus einer Internetseite auslesen? Allgemeine Java-Themen 2
G Daten aus einer For Schleife zwischen speichern Allgemeine Java-Themen 4
D Flackern beim Anzeigen von Daten mit einer JdbTable Allgemeine Java-Themen 3
M Auslesen von Daten aus einer txt Datei fast funktionierend Allgemeine Java-Themen 2
T Daten einer Chipkarte über einen Chipkartenleser auslesen Allgemeine Java-Themen 3
I Mehrere Klassen mit den selben Daten Allgemeine Java-Themen 5
padde479 Collections Daten in Dreiecksform Allgemeine Java-Themen 13
torresbig Url nach Webseiten-Login auslesen & Daten an Webseite senden Allgemeine Java-Themen 9
A Hartgecodete Daten auslagern Allgemeine Java-Themen 4
F Laden von bestimmten Daten aus TAR Archiv Allgemeine Java-Themen 23
S Webservices für binäre Daten? Allgemeine Java-Themen 5
OnDemand Daten in RAM zwischenspeichern oder lieber aus DB holen? Allgemeine Java-Themen 24
J Daten über serielle Schnittstelle empfangen Allgemeine Java-Themen 4
S Entities aus XML - Daten. Allgemeine Java-Themen 1
M Schnelleres Speichern von XML-Daten über URLConnection Allgemeine Java-Themen 4
kodela Klasse mit "gezipten" Daten Allgemeine Java-Themen 6
M Daten aus MatLab Datei lesen Allgemeine Java-Themen 8
kodela Klassen Klasse "vergisst" ihre Daten Allgemeine Java-Themen 2
C Daten für Klassifikationsverfahren gewinnen Allgemeine Java-Themen 6
J Daten von Quelltext Allgemeine Java-Themen 5
K OOP Daten addieren sich bei GUI-Eingabe Allgemeine Java-Themen 10
J Jasper Reports - Daten vom Hoster Allgemeine Java-Themen 2
kodela Daten während Laufzeit zugriffsbereit Allgemeine Java-Themen 15
J Millisekunde zwischen 2 Daten Allgemeine Java-Themen 6
Q Selbständig ActionEvent auslösen zum Daten senden über serielle Schnittstelle Allgemeine Java-Themen 7
J Daten aus Website-Quelltext auslesen Allgemeine Java-Themen 62
R Android Daten online senden Allgemeine Java-Themen 0
P Datenbank-MiniGUI fügt keine Daten ein Allgemeine Java-Themen 4
Q-bert Daten von Java Programm speichern Allgemeine Java-Themen 4
K Datei (CSV-ähnlich) in Java einlesen & mit teil der Daten Graphen erstellen Allgemeine Java-Themen 9
OnDemand Desktop-Applikation schreiben, wie daten persistent? Allgemeine Java-Themen 9
S Erste Schritte Fehlender Gedanken-Ansatz bei Interpretation von Daten Allgemeine Java-Themen 1
J Auslesen Daten Java/HTML Allgemeine Java-Themen 15
K Große Mengen an Daten speichern Allgemeine Java-Themen 9
D Daten in MySQL-Datenbank schreiben Allgemeine Java-Themen 13
A Swing FileWriter schreibt keine Daten in Datei Allgemeine Java-Themen 13
M Daten aus anderen Programmen auslesen Allgemeine Java-Themen 2
D Best Practice Login-Daten: Wie am besten abrufen? Allgemeine Java-Themen 6
L Best Practice Log Dateien analysieren und eventuell passende Daten am Chart darstellen Allgemeine Java-Themen 1
J Serial Port Daten empfangen Allgemeine Java-Themen 5
H Daten via COM Schnittstelle erhalten Allgemeine Java-Themen 2
J Daten persistent speichern Allgemeine Java-Themen 14
S Allgemeine parallelisierte Loesung um Daten im Hintergrund zu laden..? Allgemeine Java-Themen 6
L Daten ohne Datenbank richtig abspeichern Allgemeine Java-Themen 5
G Daten aus Website auslesen Allgemeine Java-Themen 7
J Daten aus GUI auslesen und in Objekte umwandeln Allgemeine Java-Themen 6
O Serial Port Daten als Tastaturanschlag senden Allgemeine Java-Themen 0
N Zeitabstand zwischen 2 Daten(Mehrzahl von Datum) Allgemeine Java-Themen 3
T Input/Output Daten in eine Datei schreiben Allgemeine Java-Themen 4
Z daten bindung Allgemeine Java-Themen 1
A Datentypen Gregorian Calendar - 2 Daten sind gleich?? Allgemeine Java-Themen 3
L Vergleich-Xml-Daten Allgemeine Java-Themen 3
vandread Daten verschlüsseln mit Java oder Datenbank Allgemeine Java-Themen 15
A Daten in Formularen/Vorlagen erstellen und ausdrucken Allgemeine Java-Themen 3
T Daten über port abfangen mit proxy server Allgemeine Java-Themen 12
Todesbote Excel Blattschutz aufheben und Daten einfügen Allgemeine Java-Themen 3
OnDemand PC identifizieren / Daten auslesen Allgemeine Java-Themen 15
J Maven .war enthält veraltete Daten Allgemeine Java-Themen 3
N Daten aus Jar laden Allgemeine Java-Themen 10
P Datentypen String-Daten zu Byte-Zahlen konvertieren - Komme nicht weiter nach vielem versuchen :-/ Allgemeine Java-Themen 7
K Input/Output Daten speichern / laden Allgemeine Java-Themen 2
M Best Practice: Daten aufnehmen-speichern-bereitstellen Allgemeine Java-Themen 8
T Daten effizient verwalten Allgemeine Java-Themen 4
B JTable eigene Daten Add Methode Allgemeine Java-Themen 2
S OOP Apache Commons Math - Verwendung von Genetics - Wie werden Daten in Chromosomen gespeichert? Allgemeine Java-Themen 4
C Daten über URL an PHP verschicken Allgemeine Java-Themen 4
R Daten aus DB auslesen in ein formular (JSP) Allgemeine Java-Themen 13
S Library fuer Internet-Text-Daten-Quellen..? Allgemeine Java-Themen 8
H OOP Daten über TCP Allgemeine Java-Themen 5
H Input/Output Binäre Daten konvertieren, Output hat Zeilenumbrüche?? Allgemeine Java-Themen 9
D Daten eines User auslesen. Allgemeine Java-Themen 5
B Input/Output Einbinden von Daten in Java Allgemeine Java-Themen 3
L Einbinden von Daten in ausführbare Jar Allgemeine Java-Themen 6
N Methoden Einzelne Daten aus "Person" auslesen Allgemeine Java-Themen 3
R SerialPort auslesen und Daten verarbeiten Allgemeine Java-Themen 23
ARadauer Wo liegen die Daten der Preferences Klasse Allgemeine Java-Themen 3
Madlip Erste Schritte Java speichert Daten im Programm?!? Allgemeine Java-Themen 9
S JDialog Daten ins JFrame übergeben Allgemeine Java-Themen 5
F Threads synchronisierung des Zugriffes auf daten Allgemeine Java-Themen 4
O Amazon S3 Anmelden / Daten downloaden Allgemeine Java-Themen 2
A Daten aufbereiten Allgemeine Java-Themen 11
P Daten kopieren mit nio - Zugriff verweigert Allgemeine Java-Themen 8
L Speichern von Daten in JKS Allgemeine Java-Themen 5
K JFreeCharts - Dummy für fehlende Daten Allgemeine Java-Themen 6
M Daten aus doc, pdf .... auslesen Allgemeine Java-Themen 12
A Login-Daten Formular automatisch ausfüllen Allgemeine Java-Themen 10
C Daten speichern und verwalten Allgemeine Java-Themen 3
E BlueJ Daten in Textdatei schreiben Allgemeine Java-Themen 21
T Gleichzeitige Zugriffe auf Daten auf dem Server Allgemeine Java-Themen 11
ruutaiokwu META-INF-daten bei ungepackten library-projekten während der entwicklung mit einbeziehen...? Allgemeine Java-Themen 2
K Server Daten Visualisieren Allgemeine Java-Themen 3

Ähnliche Java Themen

Neue Themen


Oben