Results 1 to 3 of 3

Thread: Asyncpro ComportTriggerAvail probleem

  1. #1

    Asyncpro ComportTriggerAvail probleem

    Hallo,

    Wij maken gebruik van Delphi 5 met Asyncpro 2.58 voor het maken van TCP socket connecties.
    Hiervoor plaatsen wij een TapdWinsockPort component op ons Form.
    Het connecteren, data ontvangen en verzenden is geen enkel probleem.

    Maar nu ben ik tijdens het debuggen een raar probleem tegen gekomen. Wat me voor een raadsel stelt en aangezien we TapdWinsockPort component veelvuldig gebruiken heb ik dit ook nog nooit meegemaakt.
    Asyncpro maakt gebruik van een ComportTriggerAvail procedure om aan te geven dat er data op de port is.
    Hier krijg je dan ook een variabele Count mee wat het aantal bytes weergeeft dat beschikbaar is.

    Tijdens debuggen ben ik verbonden met een Terminal programma om communicatie te simuleren. Dit is wel Modbus weet niet of dit uitmaakt
    Een timer stuurt elke 250ms via de volgende code wat uit over de port:
    Code:
    comport.putstring(CHR(2) + CHR(0) + CHR(0) + CHR(0) + CHR(0) + chr(6) + chr(1) + chr(1) + chr(0) + chr(0) + chr(0) + chr(8));
    Het Terminal programma stuurt daar als antwoord het volgende op:
    <STX><NUL><NUL><NUL><NUL><EOT><NUL><SOH><SOH><CR >

    Dit is dus voor ComportTriggerAvail telkens een Count van 10. Nu is het probleem als ik dit een minuut of 10 zo laat lopen komen er meerdere (4 ongeveer) ComportTriggerAvail met een Count van 4095 (InSize staat op 4096)
    De InBuffUsed is dan ook ineens 4095. Via onderstaande Code Kijk je naar wat er beschikbaar is. En dat is idd 4095 lang en met telkens herhalingen van wat de Terminal gestuurd heeft.
    Code:
        
        for k := 1 to count do begin
          if comport.CharReady then
            received := received + comport.GetChar;
        end;
    Het lijkt erop dat ineens de complete Inbuffer naar de ComportTriggerAvail gekopieerd wordt meerdere keren.
    Wat is er aan de hand? Kan ik dit oplossen of achterhalen waar dit vandaan komt?

    Onderstaand de volledige ComportTriggerAvail Code en daaronder een logging die gemaakt is. Op 10:14:42 kan je zien wat ik bedoel.
    Code:
    procedure TOT.ComportTriggerAvail(CP: TObject; Count: Word);
    var i,id,o,k:integer;
    begin
      if Inlineerror then begin
        Inlineerror := false;
        for i := 1 to MAXDEVICE do begin
          if (Device[i].dosend) then begin
            postmessage(Device[i].rhnd, Device[i].mes, Device[i].Hnd, 0);
          end;
        end;
      end;
      try
        //DEVICE SPECIFIC
        if count > 12 then begin
          Dolog('Count of: ' + inttostr(Count) + ' received and InBuffUsed: ' + IntToStr(comport.InBuffUsed));
    
        end;
        for k := 1 to count do begin
          if comport.CharReady then
            received := received + comport.GetChar;
        end;
        while (length(received) > length(cmdhead)) and (copy(received, 1, length(cmdhead)) <> cmdhead) do begin
          received := copy(received, 2, length(received));
        end;
        DoLog('Received: ' + received + ' InBuffUsed: ' + IntToStr(comport.InBuffUsed));
        while (length(received) > 6) and (length(received) >= ord(received[6]) + 6) do begin
          timeout := 0;
          //if copy(received, 8, 1) = chr(2) then begin
          if copy(received, 8, 1) = chr(1) then begin
            id                := polltimer.tag;
            o                 := device[id].inputs;
            device[id].inputs := ord(received[10]);
            for i := 1 to MaxDevice do begin
              if (device[i].dosend) and (device[i].addr = device[id].addr) then begin
                device[i].inputs := device[id].inputs;
                if Device[i].Request or (isfollow and (o <> Device[i].Inputs)) then begin
                  Device[i].Request := false;
                  postmessage(Device[i].rhnd, Device[i].mes, Device[i].Hnd, 3);
                end
                else if (o <> Device[i].Inputs) then
                  postmessage(Device[i].rhnd, Device[i].mes, Device[i].Hnd, 11);
              end;
            end;
          end;
          received := copy(received, ord(received[6]) + 6, length(received));
        end;
      except
        received := '';
      end;
    end;
    IO-WEIGHBRIDGE 120190501.zip

  2. #2
    mov rax,marcov; push rax marcov's Avatar
    Join Date
    Apr 2004
    Location
    Ehv, Nl
    Posts
    10,357
    Ik denk dat dit normaal is, seriële componenten werken niet met commando's, alleen met streams van bytes. Dus als je die pollt, krijg je in een event alle data mee.

  3. #3
    Ik denk niet dat dat het probleem is. Heb dit component vaker gebruikt en nog nooit dit issue gehad.
    Maar heb het probleem gevonden.

    De TapdWinsockPort component heeft ook een Telnet mogelijkheid. Dit zet je aan met de property wsTelnet. Alleen leuk feitje.... dit staat default op True. Als dit op False gezet wordt is het probleem verholpen.

Thread Information

Users Browsing this Thread

There are currently 1 users browsing this thread. (0 members and 1 guests)

Bookmarks

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •