JAVA RXTX Übertragungsproblem

Gast #2157596
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
Persönliche Seite #2158757
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 ;)
Gast #2272368
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
Gast #2272441
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.
Gast #2515266
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
#2515616
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?
#2518662
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
Persönliche Seite #2518796
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...
#2518860
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.
Persönliche Seite #2521627
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.
Persönliche Seite #2521663
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...
#2521777
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
Persönliche Seite #2521816
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.
#2529108
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!" ;)
Gast #2529167
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
Gast #2530026
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.
Gast #2575513
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?
Gast #2575569
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....
Gast #2576293
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.
Gast #2578282
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?

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren