Forum: PC-Programmierung JAVA RXTX Übertragungsproblem


von Luke (Gast)


Lesenswert?

Hi

Also folgende Situation:
PC --> FT232RL --> µC

Kommunikation funktioniert mit Putty einwandfrei. Aber mit meinem Java 
Programm nicht. Es kommen falsche werte am µC an und es kommen auch 
falsche Werte zurück (z.B.: aus 254 wird 252) Hardwarefehler 
ausgeschlossen.
Verbindungsaufbau:
1
 
2
serialPort = (SerialPort) CPI.open("Test", 2000);
3
inputStream = serialPort.getInputStream();
4
outputStream = serialPort.getOutputStream();
5
6
serialPort.setSerialPortParams(31250, SerialPort.DATABITS_8,
7
           SerialPort.STOPBITS_1, SerialPort.PARITY_NONE);
8
serialPort.setFlowControlMode(SerialPort.FLOWCONTROL_NONE);
9
serialPort.notifyOnDataAvailable(true);
10
            
11
try
12
{
13
      serialPort.addEventListener(this);
14
} catch (TooManyListenersException e)
15
      {
16
            e.printStackTrace();
17
       }
Senden:
1
 public void send(int data)
2
    {
3
        try
4
        {
5
            outputStream.write(data);
6
            outputStream.flush();
7
        } catch (IOException e)
8
        {
9
            e.printStackTrace();
10
        }
11
    }
31250Baud, 1 Stoppbit, 8 Datenbit und keine Flusskontrolle(genau wie im 
Putty eingestellt)
Eigentlich hab ich den Code von einem alten Projekt kopiert, bei dem das 
so funktioniert hat. Aber jetzt wird aus dezimal 49 ('1') dezimal 60.
Hat jemand eine Ahnung was da falsch läuft?

mfg
Lukas

von TestX .. (xaos)


Lesenswert?

einen tipp: nimm JD2XX und nicht RXTX.org wenn du einen FTDI chip 
verwendest. funktioniert zwar beides, aber die nativen treiber sind doch 
etwas schicker ;)

@topic
das mit den werten hört sich nach falscher baudrate an...

von Luke (Gast)


Lesenswert?

JD2XX kenn ich ja noch gar nicht. Danke!

Baudrate doppelt und dreifach geprüft. Wenn da nicht noch irgendein 
Parameter von RXTX reinpfuscht muss die stimmen. JD2XX werde ich gleich 
morgen ausprobieren

von Lukas H. (1uk3)


Lesenswert?

Weitere Infos:
- Umstellen der Baudrate ändert nichts.
- Hardware-Echo (RX-TX Kurzschluss) funktioniert! ich schreibe 1 runter 
und bekomme 1 zurück(im Java).

Nächster Schritt: Mit dem Oszi Signal analysieren :(

EDIT Ist der Server von JD2XX down? Ich komme nur auf den SVN, die 
kompilierte Version ist nicht verfügbar.

von Läubi .. (laeubi) Benutzerseite


Lesenswert?

Lukas H. schrieb:
> Hardware-Echo (RX-TX Kurzschluss) funktioniert! ich schreibe 1 runter
> und bekomme 1 zurück(im Java).

Also das hört sich doch nach irgeneinem Baudratenproblem an, was ist das 
überhaupt für eine komische Baudrate? Nutzt du einen passende Quarz am 
µC?

von Lukas H. (1uk3)


Lesenswert?

Ja es ist ein Baudratenproblem! Egal was ich einstelle es kommen 
9600Baud (von Java)
Quarz ist 12MHz. Es funktioniertja mit Putty, nur mit Java nicht.
Kann RXTX das einfach nicht?
Wenn ich 62.5kBaud einstelle kommt auch nur 9600Baud raus

von Läubi .. (laeubi) Benutzerseite


Lesenswert?

Also was mir so auffällt ist das du die Parameter erst nach dem öffnen 
der "Ströme" setzt.
Ich öffne das immer so:
1
SerialPort serialPort = (SerialPort) commPort;
2
serialPort.setSerialPortParams(BAURATE, DATABITS, STOPBITS, PARITY);
3
InputStream in = serialPort.getInputStream();
4
OutputStream out = serialPort.getOutputStream();

Lukas H. schrieb:
> Kann RXTX das einfach nicht?
Bei meinen letzten Versuchen konnte es das noch ;)

von Lukas H. (1uk3)


Lesenswert?

Leider auch nicht

Hab jetzt ftd2xx probiert --> funktioniert!
Also ist das Problem gelöst, auch wenn ich den Fehler nur zugern wüsste.

Vielen Dank für die Antworten
Lukas

von C. Kretzschmar (Gast)


Lesenswert?

Ich habe momentan ein ähnliches Problem, jedoch funktioniert bei mir die 
Kommunikation gar nicht über den RXTX. Da wollte ich dann auch mal den 
jd2xx probieren, jedoch finde ich nirgends eine Kopie die funktioniert. 
Hab mir was aus einem SVN kopiert, jedoch bekomme ich dann einen 
unstatisfied link error...

Wäre nett zu erfahren, was man alles wo runter laden muss, dass es 
funktioniert. Am besten wäre ein kleines Projekt was nur HalloWelt oder 
so raus schreibt, als Eclipse Project, was dann die Library nutzt... 
Wenns keine Umstände bereitet, natürlich.

Grüße,
Christoph Kretzschmar

von Uwe (Gast)


Lesenswert?

Nimm standartbaudraten 300,600,1200,4800,9600,19200,38400,115200. Der 
FTDI kann zwar auch nicht standart Baudraten aber nur mit speziellen 
Befehlen aus der dll (und ich glaube nicht das irgendeine JAVA app 
dadrauf zugreift).
Die wird den standart Treiber benutzen und der akzeptiert nur die 
standart Baudraten als Parameter (siehe Oben). Wenn er die Baudrate 
nicht akzeptiert, nimmt er warscheinlich seine default Einstellung und 
die ist 9600.

von Läubi .. (laeubi) Benutzerseite


Lesenswert?

C. Kretzschmar schrieb:
> unstatisfied link error

Dann mußt du den Lib-Pfad anpassen, das geht über Projekt --> 
Eigenschaften --> Java Buildpath

Dort im Tab Source deinen scr Folder aufklappen und "Native Library 
location" auf den Pfad zeigen lassen wo die dll/so/... liegt.

von Peter (Gast)


Lesenswert?

Ich greife jetzt auf ein älteres Thema zu, in der Hoffnung, das Ihr eine 
funktionierende Lösung gefunden habt, auf die ich selbst nicht gestossen 
bin.

Zu meiner Arbeit:
Ich schreibe gerade eine Technikerarbeit, in der ich einem uC Daten 
sende und die der uC mir beantworten soll. Diese muss ich auswerten und 
in einer Sinuskurve anzeigen lassen (Frequenzen). Mein Problem ist das 
selbe, wie bereits oben beschrieben!
--> ich sende ein Char und bekomme vom uC das gleiche Char als Antwort 
zurück. Wenn ich jetzt aber den Befehl sende, das er mir die Daten für 
eine Frequenz senden soll, bekomme ich ein totales durcheinander, mit 
dem ich nichts anfangen kann. Ich erwarte ungefähr 12500 Chars und 
bekomme nur 768.
Es fehlen haufenweise Daten..... Bei Putty passt es ganz genau.
Ich verwende ebenso RxTx und davor hab ich JavaComm probiert.
"jd2xx" hab ich bereits in Eclipse mit eingebunden, brachte aber kein 
Erfolg.

Einstellungen:
Bits pro Sekunde: 9600
Datenbits: 8
Parität: keine
Stoppbits: 1
Flusssteuerung: Hardware

Über eine Hilfe würde ich mich sehr freuen!

Vielen Dank!

VG
Peter

von Lukas H. (1uk3)


Lesenswert?

Bei mir war die Lösung jd2xx, weil rxtx einfach kein andere Baudrate 
setzen wollte. Set/Get funktioniert zwar, mit dem Oszi gemessen war es 
aber immer 9600 Baud!

Mach mal beim senden eine Pause zwischen den Werten.

Ansonst könntest du mal Java und uC Code posten

>"jd2xx" hab ich bereits in Eclipse mit eingebunden, brachte aber kein Erfolg.

Hats nicht funktioniert, oder war wieder das selbe Problem?

von Läubi .. (laeubi) Benutzerseite


Lesenswert?

Also ich nutze RXTX mit Baudraten bis 200k das ist überhaupt kein 
Problem, ein Problem ist nur "irgendwas" von "irgendwoher" 
zusammenzukopieren und dann zu hoffen das es "irgendwie" funktioniert...

Peter schrieb:
> Flusssteuerung: Hardware
Kann/Weiß dein uC auch davon?

von Peter P. (exflame)


Lesenswert?

@Läubi:
Ne, bei der Technikerarbeit ist nichts mit "zusammen kopieren!" Ich hab 
von einem Lehrer nur ein PDF-Datenblatt über JavaComm erhalten. Den Rest 
versuche ich selbst zu programmieren. Dazu muss ich alles Dokumentieren, 
Verzeichnisse vermerken, Links angeben (wie diesen hier),......
Ja, der uC weiß davon! Hat unser Lehrer auch kontrolliert. Die Syntax 
des uC  ist einwandfrei. Das ist das Problem! Es kann nur am Java 
liegen.... (uC ist ein MSP430 von TI)

@Lukas: Meinst Du Pausen beim Senden setzen oder Empfang? Kann ich 
überhaupt beim Empfang Pausen setzten? Hm, OK, in der Schleife! Muss ich 
noch testen...

Benutzt Ihr einen USB-Converter oder wie macht Ihr das? Ich muss einen 
verwenden, da die Firma (für die ich das gleichzeitig programmiere) 
alles über Converter verbindet. Laut Gerätemanager von Windows ist es 
ein FTDI!

Danke vielmals für Eure Hilfe!

VG
Peter

von Läubi .. (laeubi) Benutzerseite


Lesenswert?

Peter Peschel schrieb:
> Es kann nur am Java
> liegen
Dann zeig doch einfach mal deinen Code + Schaltplan...
Wie gesagt ich setze das "beruflich" ein und hatte noch nie Probleme mit 
verlorenen Daten. Weder mit echten noch mit USB Schnittstellen. Ein 
beliebter Fehler ist z.B. das beim lesen nicht alle Verfügbaren Zeichen 
sonder immer nur eines gelesen werden was irgendwann zu Pufferüberläufen 
führt.

Peter Peschel schrieb:
> OK, in der Schleife!

Hört sich schon mal nicht sooo gut an...

von Lukas H. (1uk3)


Lesenswert?

>Wie gesagt ich setze das "beruflich" ein und hatte noch nie Probleme mit
verlorenen Daten.

Ich auch noch nie! Nur in diesem Fall. Hab sonst noch nie einen FT232 
eingesetzt. Mit einem anderen USB-Seriell Konverter hat es noch immer 
Funktioniert

Das mit der Pause kannst du vergessen! Du hast ja Flusssteuerung.

Ohne Schaltplan und Code kann man nicht sehr viel sagen.

von Peter P. (exflame)


Angehängte Dateien:

Lesenswert?

Anbei meine Datei! Bin mal gespannt, wo mein Fehler liegt!

Danke für Eure Hilfe!

VG
Peter

von Läubi .. (laeubi) Benutzerseite


Lesenswert?

Peter Peschel schrieb:
> Bin mal gespannt, wo mein Fehler liegt!

Mal abgesehen von der etwas merkwürdigen Programmstruktur:
1
while(ins.available() > 0)
2
{
3
  int numBytes = ins.read(readBuffer);
4
}
 Hier wirfst du alle bytes bis auf das letzte weg solange Daten 
Verfügbar sind...
Auch ist für kontinuierliche Datenströme ein Thread besser als ein 
Eventlistener.
Ansosnten auch mal auf die Warnungen des Compiler hören (oder der SDK 
falls du Eclipse benutzt o.ä.) du hast einige Variablen welche nicht 
verwendet werden.

von Peter P. (exflame)


Lesenswert?

OK, werde ich testen! Danke! Aber wieso werfe ich sie weg? Die Schleife 
besagt doch, das er solange in der Schleife bleiben soll, solange Daten 
vorhanden sind..... Und dann lese ich den Buffer aus....

Die Variablen die nicht verwendet werden hab ich für weitere Dinge 
vorgesehen. Das Programm ist noch nicht fertig!

von Läubi .. (laeubi) Benutzerseite


Lesenswert?

Vergleiche
1
while(ins.available() > 0)
2
{
3
  int numBytes = ins.read(readBuffer);
4
}
5
String nachricht = new String(readBuffer); 
6
n.add(nachricht);
mit
1
while(ins.available() > 0)
2
{
3
  int numBytes = ins.read(readBuffer);
4
  String nachricht = new String(readBuffer); 
5
  n.add(nachricht);
6
}
und überlege was im erstem Fall falsch läuft...

von Peter P. (exflame)


Lesenswert?

Hast Du grad meinen Freudenschrei gehört? Wie konnte ich das so lange 
übersehen?!?!
Wenn ich wüsste, das Du hier in der Nähe wohnen würdest, dann würde ich 
Dich jetzt zu einem Bier einladen!

VIELEN VIELEN DANK! Boa eh! Jetzt fällt mir ein Stein vom Herzen!

Aber seltsam ist es schon, das ich doch einige Daten bekommen habe.

Danke Dir nochmal!

Gruß
Peter

von Läubi .. (laeubi) Benutzerseite


Lesenswert?

Peter Peschel schrieb:
> Aber seltsam ist es schon, das ich doch einige Daten bekommen habe.

Nein ist es nicht. Deswegen schrieb ich ja das es manchmal besser ist 
nicht irgendwelche Beispiel zu kopieren.
Du liest einfach ein byte ein und solange weitere verfügbar sind 
überschreibst du das zuvor gelesene Byte, also Beispiel:
1
A B C
Also können 3 Zeichen gelesen werden.
1.Durchlauf readBuffer = 'A'
2.Durchlauf readBuffer = 'B'
3.Durchlauf readBuffer = 'C' --> Abbruch da keine weiteren Zeichen 
vorhanden.

Nun schreibst du den Inhalt von readBuffer in deine Liste (mommentan 
Wert = 'C'), es sieht also so aus als hättest du 2 Zeichen nicht 
empfangen. Da die Größe dieses Datenpuffers u.A. von der Auslastung des 
Systems mit anderen Aufgaben abhängt hat es den Anschein als würden 
zufällig Zeichen verloren gehen.

Das hat aber primär weder was mit Java noch mit RXTX zu tun sondern ist 
einfach ein Programmierfehler welcher durch eine vernünftige 
Programmstruktur und Debugging auffindbar sein sollte, in so einem 
Fall hilft es auf jedenfall nicht den Fehler in der Programmiersprache 
zu suchen.

Peter Peschel schrieb:
> Wie konnte ich das so lange
> übersehen?!?!

Wie gesagt die Programmstruktur ist nicht gerade optimal und es gibt in 
dem Code noch eine ganze Menge Stolperfallen. Mein Tip wäre mal mit 
deinem Betreuer über den Code drüberzugehen und sich ein paar Tips 
abzuholen, das Internet ersetzt eine gewisse Erfahrung nicht.

von Hans-Peter M. (Gast)


Lesenswert?

Läubi .. schrieb:
> Wie gesagt die Programmstruktur ist nicht gerade optimal und es gibt in
>
> dem Code noch eine ganze Menge Stolperfallen

Das ist noch recht milde ausgedrückt.
An welcher Schule wird die Technikerarbeit gemacht?

von Peter P. (exflame)


Lesenswert?

Na na na, jetzt mal langsam!! Das die Syntax jetzt gerade nicht die 
schönste ist, und ich mir leichter tun würde, wenn sie strukturierter 
wäre, ist mir vollkommen klar! Und da hat meine Technikerschule nichts 
damit zu tun!! Auch nicht mein Lehrer!

Wie gesagt, bei dem Programm handelt es sich um meine Technikerarbeit! 
Um einen Teil davon! Die eigentliche Technikerarbeit kommt erst noch!! 
;)

Zur Erklärung:
Ich hab hier ein "Testboard", das wir (ein Kollege und ich) 
programmieren, auslesen,....... Als"Vorarbeit!" Das eigentliche Gerät, 
das wir erstellen, ist noch im Bau und in Planung. Er erstellt gerade 
den Schaltplan usw..... Die Platine wird dann erst geätzt und bestückt. 
DANN kann ich erst mit dem eigentlich Programm beginnen. Dieses wird 
schon strukturierter. Mit eigenen Klassen und Threads...... Dann kann 
ich einen Teil von der bestehenden Syntax kopieren, strukturieren,..... 
OK?

Das ich den o.g. Fehler nicht gesehen habe war wirklich "blindheit!" ;)

von Hans-Peter M. (Gast)


Lesenswert?

Peter Peschel schrieb:
> Das ich den o.g. Fehler nicht gesehen habe war wirklich "blindheit!" ;)
Richtig.

Ausreden für Programmierer:
- Das ist noch Beta. Später sieht alles besser aus
- Das ist erstmal ein grober Entwurf.
- Ja, bis dahin wird es fertig sein.
- Wie konnte denn das passieren?
- Man kann ja nicht alles testen.
- Abgesehen davon, dass es nicht läuft, wie findest Du es?
- Es ist fertig, nur noch nicht getestet.

Das ist der Beste:
Wahrscheinlich haben Sie eine alte Version.

An welcher Schule ist nun die Technikerarbeit?

Gruß
HP

von MaNiX (Gast)


Lesenswert?

Peter Peschel schrieb:
> Benutzt Ihr einen USB-Converter oder wie macht Ihr das? Ich muss einen
>
> verwenden, da die Firma (für die ich das gleichzeitig programmiere)
>
> alles über Converter verbindet. Laut Gerätemanager von Windows ist es
>
> ein FTDI!

Wir verwenden heutzutage auch nur noch USB-Konverter. Wobei das keine 
Rolle spielt. Wenn ich das alles so verfolge hat Läubi völlig recht. Da 
wurde recht viel zusammengewürfelt ohne zu Wissen was wirklich passiert.
Am Besten Du ließt alles nochmal von Läubi durch und lässt Dir das durch 
den Kopf gehen.

von Robert Bosch (Gast)


Lesenswert?

Ist immer schön, wenn der Programmcode gut dokumentiert ist :-D

//----- RS232 - nach Hr.Zilz -----
    static CommPortIdentifier portID;

einfach mal googlen, dann kommst Du auf die Elektronikschule Tettnang 
:-D

von Thomas G. (Gast)


Lesenswert?

Kann den anderen Usern nur Zustimmen! Der Programmcode ist echt 
grauenhaft. Nach langer Rechere hab ich erfahren, dass man in der 
Elektronikschule schnell die Note 1 in der Technikerarbeit bekommt. 
Dafür sind die Prüfungen schwer, bzw. es konnte nicht alles vermittelt 
werden was abgefragt wurde. An deiner Stelle würde ich dennoch den 
Programmcode anpassen. eventuell Hilfe bei jemanden suchen, der dir 
weiterhelfen kann. In welcher Fachrichtung wird denn die Technikerarbeit 
absolviert?

von Peter Peschel (Gast)


Lesenswert?

He, jetzt wird es aber gemein!

1. wer erzählt sowas herum? Das man so leicht eine 1,0 bekommt?
2. ich bin gelernter Kaufmann und bin daher Quereinsteiger. Ich möchte 
mein Hobby zum Beruf machen. Ich lerne erst seit 3,5 Jahren das 
Programmieren!
3. Die Schule hat einen sehr guten Ruf! Und nicht, das man leicht gute 
Noten bekommt!
4. Ihr wisst schon, das ich Eure Hilfe in der Doku meiner 
Technikerarbeit veröffentlichen "muss"
5. Es ist keine BETA! Das ist ein kleines Vorprogramm! Die eigentliche 
Technikerarbeit kommt erst noch. Und da kann ich Programmteile von dem 
o.g. übernehmen! Da muss ich besser strukturieren! KEINE AUSREDE! --> 
MVC
6. Die Lehrer sind echt super!
7. Die TA ist verknüpft mit Kommunikationstechnik/µC und 
Softwareentwicklung

usw...usw....

von Hans Peter (Gast)


Lesenswert?

Keine Panik, lass Thomas G. reden wie sagt man so schön:"Konkurenz 
belebt das Geschäft!" Es wird immer differenzen zwischen den einzelnen 
Schulen geben bzw. wird es immer Leute geben, die meinen, dass sie etwas 
besseres sind. deshalb bin ich für eine Objektive Lösung.

Werde in den nächsten Tagen eine emailadresse einrichten, bei der sich 
jeder nach authentifizierung mit einem Schülerausweis einen acoount 
unter meiner Joomla Homepage holen kann. Wie es auch in einem 
Arbeitszeugnis üblich ist, will ich nicht, dass irgendeine Schule 
negativ bewertet wird sondern nur mit Positiven Sernen, wer die meisten 
positiven Sterne gesammelt hat, hat gewonnen!

für Vorschläge zu den einzelnen Kriterien wäre ich denoch dankbar.

von MaNiX (Gast)


Lesenswert?

@Peter

5. Das hört sich so an:
Ich bau mir ein Haus, erst aus Ästen und Stroh und schau ob es halten 
würde. Danach fange ich mit Ziegelsteinen an. Diese Arbeitsweise hätte 
in meinem Betrieb keine Chance. Man sieht schon sehr schnell ob jemand 
was vom Handwerk versteht oder nicht.
Warum sind zwei Variablen auf static gesetzt?
static CommPortIdentifier portID;
static SerialPort serss;

Kannst Du mir das erklären?

von Lukas H. (1uk3)


Lesenswert?

Bitte zurück zum Thema! Den Rest per PN

von Peter (Gast)


Lesenswert?

Danke Lukas! Das wär das nächste gewesen, was ich geschrieben hätte!

von Hans Peter (Gast)


Lesenswert?

so, die Email-Adresse wäre eingerichten, nach Authentifizierung mit 
einem gültigen Schülerausweis bekommt man zugriff auf die Homepage. Hier 
kann man sich über das Image der jeweiligen Schulen informieren. 
Außerdem kann man dort Klassenarbeiten hoch und runterladen.

Viel Spass

s.stroebele@web.de

von Hans-Peter M. (Gast)


Lesenswert?

Wie ist denn die Technikerarbeit ausgegangen?

von Peter (Gast)


Lesenswert?

Die läuft noch! Ende Juni ist Abgabe! Wenn es Euch interessiert, dann 
setz ich das Ergebnis gerne rein.....;)

von Dennis (Gast)


Lesenswert?

darf ich fragen, was du nun für eine Note bekommen hast?

von Peter (Gast)


Lesenswert?

Stimmt! Das wollte ich Euch noch schreiben! Ich bin seit zwei Wochen 
fertig und hab eine 1,0 für die Technikerarbeit bekommen! ;)

Und nein, es war NICHT einfach zu bekommen.......

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.