Einzelnen Beitrag anzeigen

KRM

Registriert seit: 6. Feb 2007
Ort: Kölle am Rhing
24 Beiträge
 
Turbo Delphi für Win32
 
#4

Re: Wie kann ich mit Delphi Daten vom USB-Controller abfrage

  Alt 14. Apr 2007, 12:33
@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
Miniaturansicht angehängter Grafiken
gui_163.jpg  
  Mit Zitat antworten Zitat