Results 1 to 12 of 12

Thread: Delphi7-asyncpro4.07-windows7 issue met TApdComPort component

  1. #1
    Registered User
    Join Date
    Oct 2017
    Location
    Groesbeek
    Posts
    17

    Delphi7-asyncpro4.07-windows7 issue met TApdComPort component

    Ik gebruik deze combinatie voor communicatie met Arduino uno bordje.
    Ik zend een karakter 'z' naar het bordje en dan zend het bordje een serie karakters terug tot maximaal 600 strings met getallen gevolgd door een spatie als scheidingsteken. Dit gaat de eerste keer helemaal goed. maar bij herhaald dat opvragen geeft het programma op een gegeven moment een foutmelding dat er naar een ongeldig adres geschreven wil worden. In delphi stopt het dan bij de ontriggeravail event. lijkt dus ergens mis te gaan in de component zelf.

    Ik begin te twijfelen aan de goede werking van deze component.
    Heeft iemand ervaringen hiermee of suggesties?

  2. #2
    Geen concrete ervaring met dit probleem. We gebruiken dat component al jaren voor het aansturen van scanners, kassaladen en tot voor kort pinautomaten. Vziw nooit problemen mee geweest. Komt op mij over alsof de poort zelf wegvalt, mogelijk een hardware issue met de Arduino?
    1+1=b

  3. #3
    Registered User
    Join Date
    Oct 2017
    Location
    Groesbeek
    Posts
    17
    als ik via de seriele monitor van de arduino software het ontvang teken verstuur werkt het wel. Daaruit was mijn conclusie dat het aan Delphi kant moet zitten. Ook ergens gelezen dat het issue mogelijk zou kunnen komen door de tegenwoordige USB softwarelaag in de laptop die mogelijk per laptop kan verschillen en niet gegarandeerd compatible is met de originele seriele poort waar de asyncpro oorspronkelijk voor was gemaakt. Maar in hoeverre dat klopt is de vraag.

  4. #4
    Dat zou kunnen. Ik vrees dat mijn hands-on ervaring met COM-poorten niet uitgebreid genoeg is om deze vraag te beantwoorden.:/
    1+1=b

  5. #5
    je probleem is me niet duidelijk, maar je schrijft dat het de eerste keer goed gaat en daarna niet meer.

    Die comport werkt met een circulair buffer. Als je op het einde van het buffer bent overschrijft ie vrolijk het begin. Mogelijk zit daar een issue.

    Ik heb async pro lang niet meer gebruikt, maar volgens mij verschoof je leesbuffer ook afhankelijk van het aantal bytes die je gelezen hebt. Meestal frame je berichten ook, bv door een bepaald karakter of reeks karakters. Zo weet je altijd waar een bericht begint. Ook op het einde zet je een speciaal karakter of reeks. Wat ik altijd deed was mijn buffer leeg lezen tot ik mijn begin frame kreeg. Daarna bleef ik lezen tot het eindframe. Dan heb je een compleet bericht dat je verder kunt verwerken.

    De grootste problemen die ik in het wild tegenkwam waren meestal te kleine buffers. Bij een hogere bitrate heb je een groter buffer nodig. Ayncpro blijft het buffer wel vullen in zijn eigen thread, door daar gebruik van te maken wordt het verwerken voor jou simpeler omdat je het meeste gewoon in de main thread kunt doen.

  6. #6
    Registered User
    Join Date
    Oct 2017
    Location
    Groesbeek
    Posts
    17
    ook op een lage bitrate heb ik dit probleem. dit is een serie met goede ontvangst:
    0
    0
    1
    2
    2
    3
    3
    4
    4
    5
    5
    6
    6
    7
    7
    8
    9
    9
    10
    10
    18
    19
    20
    21
    21
    22
    23
    24
    24
    25
    25
    26
    26
    27
    27
    28
    28
    29
    29
    30
    30
    31
    31
    32
    32
    32
    33
    33
    36
    38
    40
    40
    41
    41
    42
    42
    43
    43
    44
    44
    44
    45
    45
    46
    46
    47
    47
    48
    48
    49
    49
    50
    50
    51
    51
    52
    52
    53
    54
    54
    55
    55
    56
    56
    57
    57
    58
    58
    59
    59
    59
    60
    60
    61
    61
    62
    62
    63
    63
    64
    64
    65
    65
    66
    66
    67
    67
    68
    68
    69
    69
    dan gaat het 6 x goed en de 7e keer fout en dan ontvang ik deze reeks met als fout karakter 27 ipv 33:
    access violation read of adress 00000026 of iets wat daar op lijkt (niet steeds hetzelfde)
    0
    0
    1
    2
    2
    3
    3
    4
    4
    5
    5
    6
    6
    7
    7
    8
    9
    9
    10
    10
    18
    19
    20
    21
    21
    22
    23
    24
    24
    25
    25
    26
    26
    27
    27
    28
    28
    29
    29
    30
    30
    31
    31
    32
    32
    32
    33
    27
    36
    38
    40
    40
    41
    41
    42
    42
    43
    43
    44
    44
    44
    45
    45
    46
    46
    47
    47
    48
    48
    49
    49
    50
    50
    51
    51
    52
    52
    53
    54
    54
    55
    55
    56
    56
    57
    57
    58
    58
    59
    59
    59
    60
    60
    61
    61
    62
    62
    63
    63
    64
    64
    65
    65
    66
    66
    67
    67
    68
    68
    69
    69

    het gaat blijkbaar fout in ADport unit :

    procedure TApdCustomComPort.TriggerAvail(Count : Word);
    {-For internal triggeravail processing}
    begin
    if Assigned(FOnTriggerAvail) then
    FOnTriggerAvail(Self, Count);

    dit is de procedure die vrijwel standaard is overgenomen en aangevuld met wat eigen spullen:

    procedure TForm1.ApdComPort1TriggerAvail(CP: TObject; Count: Word);
    var
    I:integer;
    c1:char;
    begin
    for I:=1 to count do
    begin
    c1:=ApdComPort1.GetChar;
    if c1=' ' then else
    co2_1.deelstring:=co2_1.deelstring+c1;
    if c1=' ' then
    begin
    co2_1.co2[co2_1.pointer]:=strtoint(co2_1.deelstring);
    memo1.Lines.Add(inttostr(co2_1.co2[co2_1.pointer]));
    co2_1.pointer:=co2_1.pointer+1;
    co2_1.deelstring:='';
    edit3.Text:=inttostr(co2_1.pointer);
    end;
    end;
    end;

  7. #7
    Registered User
    Join Date
    Oct 2017
    Location
    Groesbeek
    Posts
    17
    eea op 2 laptops geprobeerd, een oude windows xp laptop en een met windows 7. beide zelfde probleem.

  8. #8
    wat is co2_1 voor iets?

  9. #9
    Registered User
    Join Date
    Oct 2017
    Location
    Groesbeek
    Posts
    17
    Quote Originally Posted by Benno View Post
    wat is co2_1 voor iets?
    type co2data= array[0..600] of cardinal;

    type co2object= class(Tobject)
    co2:co2data;
    deelstring:string;
    pointer:word;
    comport:array[0..10] of word;
    end;

    gaat om een teller van pulsen die op het arduino bordje binnenkomen. Co2 heeft betrekking op koolzuurproductie bij een vat gistend bier. Daarmee kan ik de gisting volgen.

  10. #10
    Registered User
    Join Date
    Oct 2017
    Location
    Groesbeek
    Posts
    17
    Inmiddels denk ik de oorzaak gevonden.
    co2data= array[0..600] of cardinal;
    Ik houdt een tellertje bij mbt de positie binnen het array. Bij herhaald ontvangen loopt dat tellertje natuurlijk over de 600 grens heen en ik ben vergeten dat te checken en tellertje weer op 0 te zetten. en dan geeft Delphi een adress error. Tellertje springt nu van 600 naar 0 en nu doet het probleem zich niet meer voor. Lijkt dus geen probleem met asyncpro maar dom programmeer issue. Helaas leidt delphi debugger je niet naar de oorzaak, maar dat kan ook liggen aan mij. misschien weet iemand hoe je dit soort fouten wel kan achterhalen als die optreden?

  11. #11
    mooi dat je het gevonden hebt.

    tools zoals madexcept of eurekalog kunnen je bij een crash een stacktrace leveren die je in de juiste richting zou kunnen wijzen.

  12. #12
    Registered User
    Join Date
    Oct 2017
    Location
    Groesbeek
    Posts
    17
    Ik kwam er net achter dat je bij project -options en dan compiler en dan vinkje 'range tracking' en 'overflowchecking' aan kunt zetten. Dan geeft delphi er wel een foutmelding op als het optreedt. zie nu dat dit soort checks erg veel tijd kunnen schelen, omdat er iets fout gaat waarvan je totaal geen idee hebt waar het door komt.

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
  •