Hallo, ich probiere atm Messwerte von meinem AVR mit Java auszuwerten.
Ich kann zwar einigermaßen in VB, C oder PHP programmieren aber OOP
liegt mir einfach irgendwie nicht... Will es mir aber nun irgendwie
beibringen, da ich es für die Schule brauche und Java allgemien sehr
weit verbreitet ist...
Nun gut... Habe ich mir also die Libary sowie ein Beispielscript von
http://www.rxtx.org/ runtergeladen und mit Eclipse ausprobiert. Da ich
nicht alle funktionen benötige, habe ich das Script etwas entkernt.
Raus kam:
public static class SerialReader implements Runnable
34
{
35
InputStream in;
36
37
public SerialReader ( InputStream in )
38
{
39
this.in = in;
40
}
41
42
public void run ()
43
{
44
byte[] buffer = new byte[1024];
45
int len = -1;
46
try
47
{
48
while ( ( len = this.in.read(buffer)) > -1 )
49
{
50
System.out.print(new String(buffer,0,len));
51
}
52
}
53
catch ( IOException e )
54
{
55
e.printStackTrace();
56
}
57
}
58
}
59
public static void main ( String[] args )
60
{
61
try
62
{
63
(new new2()).connect("COM3");
64
}
65
catch ( Exception e )
66
{
67
e.printStackTrace();
68
}
69
}
70
71
}
So, dieses Script gibt mir nun meine Messwerte in der Konsole wunderbar
aus. Ich möchte diese Werte aber weiterverarbeiten.
Ich möchte also irgendwie eine Funktion haben, die mir den aktuellen
Messwert zurückliefert.
"System.out.print(new String(buffer,0,len));" gibt den aktuellen Wert in
der Konsole aus, soviel ist mir klar. Also dacht ich mir: Mach ich
"public void run" zu "public String run" und sage anstelle der Konsolen
Ausgabe "return new String(buffer,0,len)" aber das funktioniert alles
nicht wirklich... Wie bekomm ich das hin?
Ähm, das ist kein Skript, das ist erwachsenes Java.
Einfach nur die Rückgabe von main zu ändern ist sinnfrei.
Spezifiziere doch bitte deine Aussage "Ich möchte diese Werte aber
weiterverarbeiten"
Willst du ein Program, daß du beispielsweise per Shell aufrufst und das
dir bei jedem Aufruf einen (oder wegen mir x) gemessenen Wert ausgibt?
Oder willst du die Werte innerhalb von Java weiterverwenden?
Grüsse
Ich möchte die Werte innerhalb von Java weiterverarbeiten.
Zu diesem Zweck würde ich gerne einfach eine Funktion aufrufen können,
die mir als Rückgabewert den zuletzt, über UART, empfangenen Wert
liefert.
Ab da reichen meine Programmierkentnisse (hoffentlich) wieder :-)
dau45 schrieb:
> "System.out.print(new String(buffer,0,len));" gibt den aktuellen Wert in> der Konsole aus, soviel ist mir klar. Also dacht ich mir: Mach ich
Also das dir sonderlich viel von dem Klar ist was da passier bezweifel
ich einfach mal ;)
Und ganz viel in eine Zeile schreiben mag zwar Cool sein, hilft einem am
Anfang bei der Fehlersuche aber nicht wirklich...
Das gibt dir die möglichkeit den aktuellen Wert auszulesen.. aber
vorsicht: Bist du zu langsam gehen Werte verloren und du kannst nicht
feststellen wann ein neuer Wert eintrifft. Wenn du sowieso zeichenweise
Arbeiten willst, läßt sich das ganze einfacher machen:
ok, ganz von anfang:
jede klasse, die runnable implementiert oder von thread abgeleitet ist,
ist ein thread. jeder thread hat eine funktion "public void run()", die
die eigentliche arbeit des threads erledigt. wenn die signatur von "run"
geändert wird, funktioniert auch der thread nicht mehr.
in deinem fall liest der thread von der seriellen schnittstelle, bis die
funtion "read" des inputstreams -1 zurückliefert (frag mich bitte nicht,
unter welchen umständen das passiert -> doku).
wenn du die daten außerhalb des threads weiterverabeiten möchtest, musst
du einen weg finden, diese nach außen weiterzugeben: stichworte
(ring)pufferung, aktive weitergabe durch den thread, wait/notify,
observer oder ähnliche techniken, wobei die ersten zwei die einfachsten
lösungen sind.
der langen rede kurzer sinn:
du musst entweder in der run-methode eine andere funktion (in einem
anderen thread) aufrufen, die die daten weiterverarbeitet, oder die
daten im SerialReader buffern, bis sie von einem anderen thread
verarbeitet werden.
Ich glaube, die Sache zu verstehen, wird für den Anfang ne Nnummer zu
hard... Von daher schonmal danke @ Läubi für deine Mühe!
Dein erstes Programm liefert mit leider die Fehlermeldung
1
gnu.io.NoSuchPortException
2
at gnu.io.CommPortIdentifier.getPortIdentifier(CommPortIdentifier.java:218)
3
at SerialTest.connect(SerialTest.java:14)
4
at SerialTest.main(SerialTest.java:65)
Wenn ich aus "test.connect("COM3:")" "test.connect("COM3")" mache, läuft
das Programm zumindest. Liefert jedoch immer den Dezimalwert "10", egal
welchen Wert der AVR sendet.
Das 2. Programm liefert immer folgende Fehlermeldung:
[Code]
Exception in thread "main" java.lang.Error: Unresolved compilation
problem:
Cannot use this in a static context
at SerialTest.connect(SerialTest.java:14)
at SerialTest.main(SerialTest.java:31)
[Code]
dau45 schrieb:
> Wenn ich aus "test.connect("COM3:")" "test.connect("COM3")" mache, läuft
Hab jezt nicht geschaut wie man den Comport angeben muß ohne : ist wohl
korrekt.
> Das 2. Programm liefert immer folgende Fehlermeldung:
1
import java.io.*;
2
import gnu.io.*;
3
4
public class SerialTest {
5
public InputStream connect (String portName) throws Exception
throw new IOException(portName+ " ist kein Comport!");
16
}
17
return in;
18
}
19
20
public static void main ( String[] args )
21
{
22
try
23
{
24
SerialTest test = new SerialTest();
25
InputStream in = test.connect("COM1");
26
while(true) {
27
//Ein Zeichen von der Seriellen Schnittstelle lesen
28
int wert = in.read();
29
if(wert > -1) {
30
System.out.println("Neuer Wert:\n"+
31
"\tDezimal: "+wert+"\n"+
32
"\tZeichen: "+(char)wert+"\n"+
33
"\tHex: "+Integer.toHexString(wert)
34
);
35
}
36
}
37
}
38
catch ( Exception e )
39
{
40
e.printStackTrace();
41
}
42
}
43
}
Hier mal was kompilierbares, hatte das mehr als ANREGUNG geschrieben
das du siehst wie es prinzipiell funktioniert und habe es vorher nicht
kompiliert... Du sollstest auf jedenfall versuchen zu verstehen warum
das so gemacht wurde... Lektüre z.B.:
http://openbook.galileocomputing.de/javainsel8/
Moin Läubi,
danke nochmals aber leider funktioniert das immernoch nicht. Es lässt
sich zwar kompilieren aber liefert (wie dein erster Code) völlig falsche
Werte... Der Mikrocontroller sendet z.B. aktuelle immer die momentane
Temperatur (atm ca. 25). Der von mir gepostete Code und ein
Terminalprogramm liefern da auch den richtigen Wert.
Dein erstes programmm hat immer 10 geliefert und dein zweites immer die
Zahlenfolge 50, 53, 13, 10 und dann von vorn. Baud-Rate, Stop- / Data-
sowie Paritätsbits sind richtig eingestellt. Genauso wie der Com-Port.
Ich werde später sicherlich probieren, das ganze zu verstehen aber für
den Anfang in Java is das etwas schwer... Deshalb wollte ich mich
erstweinmal der Verarbeitung der Werte witmen.
Okay, dann schnappst du dir jezt eine ASCII Tabelle und schlägst mal
nach was diese vier Zahlen als Zeichen darstellen, vieleicht dämmert es
dir ja dann... Eigentlich hatte ich genau deshalb die Ausgabe in
DEZ/ASC/HEX gemacht oder gibt er dir da dreimal das gleiche?
Und wie willst du Werte verarbeiten wenn du schon Probleme hast ein
Zeichen zu empfangen und es dann richtig zu interpretieren? Das Wird
schiefgehen und ein paar einfache Programme zum Einsteig (z.B. aus dem
geposteten Tutorial) kosten auch nicht mehr Zeit als bei jeder neuen
Hürde hier zu warten bis dir jemand antwortet.