@Daniel B:
Der PIC hat einen 64 Byte großen Puffer, daran kann ich leider nichts einstellen...
...
@Corpsman:
Danke, ich werde die Information im Hinterkopf behalten...
---
Inzwischen habe ich ein wenig weiter gearbeitet...
Ich habe auf die Funktionen
_MPUSBWrite und
_MPUSBRead
für de USB-Kommunikation zurück gegriffen...
Gesendet wird mein Codewort READ_IR und der Pic reagiert darauf (mit einer leuchtenden LED)
Dann habe ich eine While-Schleife dahinter gesetzt, die prüft, ob Daten angekommen sind...
Und hey, das Programm springt nur raus, wenn auch welche gekommen sind.
(Habe es getestet, in dem ich im PIC ein Delay eingebaut hat, dass erst nach einer Weile 2 Datenpackete in die Buffer schreibt, die vom Delphi-Programm ausgelesen werden -> receive_buf)
Jedenfalls, jetzt wollte ich einen Timout einbauen, der in einem TLABEL oder einem TEDIT-Feld angezeigt wird.
ABER
Der macht das nicht...
Guggst du:
Delphi-Quellcode:
//Rumtesten
send_buf[0]:=READ_IR; // Wird vom Microcontroller erkannt und er schaltet seine Interrupts ein
RecvLength:=4; // Anzahl der erwarteten Bytes
ExpectedReceiveLength:= RecvLength;
if(_MPUSBWrite(myOutPipe,send_buf,1,SentDataLength,100)<> 0) then begin
Memo1.lines.add('gesendet'); // wird ausgegeben, PIC reagiert
receive_buf[2] := 0; // Voreinstellung, damit er nicht vorzeitig aus der Schleife gekickt wird
TimeCounter := 10; // 10 Sekunden Timeout
// wenn der µC in den Buffer schreibt, ist der Wert 52 soweit erst mal fest
while((receive_buf[2] <> 52) AND (TimeCounter > 0)) do begin
// Habe ich etwas empfangen? Nein = 0, dann "warte"
if(_MPUSBRead(myInPipe,receive_buf,ExpectedReceiveLength,RecvLength,100)=0) then
begin
Memo1.Lines.Add("Warte": IntToStr(TimeCounter)); // Ausgabe des Timers im Memofeld
Label2.Caption := IntToStr(TimeCounter); // Ein Label, in dem der Timer angezeigt werden soll
sleep(900); // 100ms werden schon in der _MPUSBRead-Funktion gewartet
TimeCounter:=TimeCounter-1;
end
else
Memo1.lines.add('Empfangen'); // funktioniert auch, wenn der PIC seine Daten gesendet hat
end;
if TimeCounter = 0 then
Memo1.lines.add('TIMEOUT!'); // funktioniert auch, wenn der Timer abgelaufen ist
Memo1.lines.add('Firmware version : '+ IntToStr(receive_buf[3])+'.'+IntToStr(receive_buf[2]));
end;
Die Zeit im Memofeld wird angezeigt, aber nicht im Label o_O...
Und auch, wenn ich das Label durch ein TEdit ersetze und die Zuweisung
Edit1.Text := IntToStr(TimeCounter);
einbaue geht es nicht... -_-...
Jedoch, wenn "TIMEOUT!" ausgegeben wurde, setzt er das Label auf "1" o_O...
WARUM macht der das?
Und warum macht er nicht das, was er machen soll?
Jemand eine Idee?
Ich habe den Sleep-Befehl auch schon mal entfernt -> Ging auch nicht...
Im Anhang ein Screenshot der
GUI