Hallo,
ich habe ein Programm für meinen Atmega8 geschrieben, der gibt mit, wenn
ich ein 's' sende den ADC-Wert zurück - soweit geht dies im
Hyperterminal.
Jetzt möchte ich dies jedoch in Java implementieren, um hier eine
Temperatursteuerung zu bauen, jedoch weiss ich nicht, wie ich in Java
gleichzeitig senden und empfangen kann?, ich denke hintereinander kann
ich dies nicht machen?
Gruß
Pfeiffy
Wenn Du in Java etwas gleichzeitig machen willst ist die Klasse "Thread"
dein Freund.
Alternativ kann man in einer Klasse das Interface "Runnable"
implementieren.
Gute Onlinedoku über Java findet sich unter "Java ist auch eine Insel".
Das ist ein Onlinebuch, das man sich auch runterladen kann.
Ausseredem solltest Du immer die Onlinereferenz der Java API offen
haben.
Serielle Programmierung habe ich in Java noch nicht gemacht, da brauchts
dann Rechner/Betriebssystemspezifische Module. Sollte aber kein
hexenwerk sein, Google hilft da bestimmt weiter.
Bei Fragen : Hier rein posten
Hallo,
ja, suche - so einfach ist es auch nicht, habe ich gerade gemacht. Das
problem ist, dass ich in Java praktisch gleichzeitig senden und
Empfangen muss, das mache ich klar in einem Thread, aber der Comport ist
eben beim senden dann durch das empfangen gesperrt - das ist die Frage.
Gruß
Pfeiffy
Pfeiffy schrieb:> Das> problem ist, dass ich in Java praktisch gleichzeitig senden und> Empfangen muss,
Das sehe ich so noch nicht. Nur weil Du
Pfeiffy schrieb:> der gibt mit, wenn> ich ein 's' sende den ADC-Wert zurück
ein Zeichen schreibst und dann 2 Byte empfangen willst, brauchst du
keine 2 Threads und gleichzeitiges schreiben und lesen.
Alleine die Hardware hat im PC schon 16 Byte Puffer, die Treiber werden
das noch etwas vergrößern.
Wenn Dein Protokoll also nicht deutlich komplexer wird, würde ich mir
das Multithreading an der Stelle sparen.
Hallo,
ok, com in Java war bis jetzt noch nicht so meine Welt, kannst du mir
sagen, mit was für einem Befehl ich das mache?, das schreiben - worauf
ich ja die 2 byte erwarte ist der Befehl:
Pfeiffy schrieb:> kannst du mir sagen, wie ich dann den String ("S") mitgeben kann?
genauso, wie du es schon geschrieben hast, ich hab dir ja im Konstruktor
schon einen OutputStream angelegt.
Jetzt fügst du z.B. noch eine Funktion ein:
if (evt.getEventType() == SerialPortEvent.DATA_AVAILABLE) {
48
try {
49
StringBuffer readBuffer = new StringBuffer();
50
int c;
51
// lies bis \r\n
52
while ((c = inputStream.read()) != 10) {
53
if (c != 13) {
54
System.out.println("empfange");
55
readBuffer.append((char) c);
56
}
57
}
58
inputStream.close();
59
empfangen = readBuffer.toString();
60
// mach was mit den eingelesenen Daten
61
} catch (IOException e) {
62
e.printStackTrace();
63
}
64
}
65
}
66
67
private void schreibeAufSeriell(String foo) {
68
try {
69
outputStream.write(foo.getBytes());
70
outputStream.flush();
71
outputStream.close();
72
} catch (IOException e) {
73
e.printStackTrace();
74
}
75
}
76
77
}
das heisst: sofort nach meinem senden, sendet der AVR, welches sofort in
den String "empfangen" übergeben wird und ich kann den empfangenen
String benutzen.
Gruß
Pfeiffy
Äh, nein.
Wenn das funktioniert, dann nur durch Glück und Zufall.
Deine Ausgabe machst du in serialEvent(), ich hab dazu extra noch einen
Kommentar hinterlassen:
Di Pfe schrieb:> aber, um etwas zu empfangen muss ich ja zuerst senden, durch das senden> löse ich somit ja erst den serial-event aus.
Ja.
Der Event kommt aber irgendwann, deshalb musst du in der Methode auf
das Ereignis reagieren.
Du kannst nicht davon ausgehen, dass deine Daten sicher zwischen der
Ausführung der beiden Zeilen
aus main() entfernen würdest, klappts wahrscheinlich sogar.
Ich würde an deiner Stelle gleich noch ganz auf die globale Variable
"empfangen" verzichten, das verwirrt in der Konstellation nur.
Aber denk dran, dass dein AVR bei dem Code seine Strings mit \r\n
abschliessen muss.
Hallo,
nun habe ich doch noch einen Fehler drinnen, ich kann das Programm 1 mal
starten, aber beim nächsten mal ist der comport belegt, das ist ja blöd,
da ich noch keine gui habe und beim stoppen keinen windows-event
abfangen kann muss ich das Programm über die Kommandozeile stoppen, dann
bleibt der comport wahrscheinlich offen - kann ich den irgendwie im PC
wirder freigeben?
Gruß
Pfeiffy
Ähm?
Wenn du das Programm beendest, ist der Comport auch wieder frei.
Ich weiss nicht, was du mit "stoppen" meinst oder was das ganze mit
einer gui zu tun haben soll?
Hallo,
ja ich habe herausgefunden: ich habe das Programm in eclipse laufen
lassen und hier nur den Prozess nach dem beenden nicht gestoppt, da ich
ja nur 1 mal sende, aber immer auf Bereitschaft bin. Lösung: entweder
den Prozess im Eclipse stoppen oder ein system.exit(0) einbauen.