[C++/BCB] WinAPI & Async communicatie perikelen

Pagina: 1
Acties:

  • TimmeStein
  • Registratie: Augustus 2001
  • Laatst online: 04-06 15:20

TimmeStein

Slopen is ook een kunst

Topicstarter
Ik moet een apllicatie schrijven die communiceert met een microcontroller board. Nu wil ik uit een file een line halen en die dan via rs232 naar dat ding sturen. Ik krijg dan een checksum terug en die controleer ik dan.

Nu had ik het volgende bedacht:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
  unsigned char lengte, i;
  unsigned char temp[2], checksum, Receive_byte, received_checksum;
  unsigned char test;
  string line;

  unsigned long dwCommEvent, dwBytesTransferred;

  ifstream in("C:\\test2.hex", ios::binary);

  while(getline(in, line))
  {
    TransmitCommChar(hComm, 'L');
    checksum=0;
    for( i=0; i<lengte; i++ )
    {
      temp[0]=line[9+(2*i)];
      temp[1]=line[9+1+(2*i)];
      checksum+=hex2byte(temp);
      TransmitCommChar(hComm, hex2byte(temp));
    }

    SetCommMask( hComm, EV_RXCHAR );
    WaitCommEvent (hComm, &dwCommEvent, 0);
    if (dwCommEvent & EV_RXCHAR)
    {
      do
      {
          ReadFile( hComm, &Receive_byte, 1, &dwBytesTransferred, 0 );
      } while (dwBytesTransferred == 1);

       if( Receive_byte==checksum )
         MainForm->Memo1->Text = "Checksum OK.";
       else
         MainForm->Memo1->Text = "Checksum Wrong !!!";
      }
  }


Het versturen lijkt goed te gaan. Echter moet ik daarna wachten op de byte die ik terug krijg van de controller. Vandaar die SetCommMask op EV_RXCHAR.

Als ik de boel compile en de code uitvoer, zie ik op mijn digitale geheugen scoop dat er wel data wisseling plaatsvindt (paar karakter naar board en weer 1 van board naar host) maar ik krijg nergens de uitvoer van "if(Receive_byte==checksum)" te zien. Grrrr.

Staat er iets raars tussen ofzo ?

Het maakt niet niet uit of het rechts of het links is, maar TimmeStein weet precies wat de Jinx is !


  • curry684
  • Registratie: Juni 2000
  • Laatst online: 13-08 16:46

curry684

left part of the evil twins

Is die call naar ReadFile niet gewoon blocking?

Professionele website nodig?


  • TimmeStein
  • Registratie: Augustus 2001
  • Laatst online: 04-06 15:20

TimmeStein

Slopen is ook een kunst

Topicstarter
Laat maar. Heb het al gevonden :)

Het maakt niet niet uit of het rechts of het links is, maar TimmeStein weet precies wat de Jinx is !


  • LordLarry
  • Registratie: Juli 2001
  • Niet online

LordLarry

Aut disce aut discede

En dan vertel je altijd netjes wat het was voor de overige mensen :p toch?

We adore chaos because we like to restore order - M.C. Escher


  • TimmeStein
  • Registratie: Augustus 2001
  • Laatst online: 04-06 15:20

TimmeStein

Slopen is ook een kunst

Topicstarter
O.K. :)

Op de laatste regel (execute commando naar de uC) schijn ik helemaal geen reactie te krijgen vanaf de uController. De code was dus toch wel goed (later wel aangepast), maar stond dus eeuwig te wachten op dat ene char waarvan ie verwachtte dat ie ging komen
(:?)...

:)

Het maakt niet niet uit of het rechts of het links is, maar TimmeStein weet precies wat de Jinx is !


  • curry684
  • Registratie: Juni 2000
  • Laatst online: 13-08 16:46

curry684

left part of the evil twins

TimmeStein schreef op 18 oktober 2002 @ 16:29:
O.K. :)

Op de laatste regel (execute commando naar de uC) schijn ik helemaal geen reactie te krijgen vanaf de uController. De code was dus toch wel goed (later wel aangepast), maar stond dus eeuwig te wachten op dat ene char waarvan ie verwachtte dat ie ging komen
(:?)...

:)
Blocking probleem dus, oftewel ik had gelijk... ;)

Professionele website nodig?


  • TimmeStein
  • Registratie: Augustus 2001
  • Laatst online: 04-06 15:20

TimmeStein

Slopen is ook een kunst

Topicstarter
Nou..

Je had niet helemaal gelijk. Het is de ReadFile() niet die problemen oplevert, maar de do(){} die eromheen zit.

Klein stukje erboven staat namelijk:
code:
1
2
3
4
5
6
7
// Set new Timeout variables: all in milliSecs...
        ctmoNew.ReadTotalTimeoutConstant = 100;
        ctmoNew.ReadTotalTimeoutMultiplier = 0;
        ctmoNew.WriteTotalTimeoutMultiplier = 0;
        ctmoNew.WriteTotalTimeoutConstant = 0;
// Export the new Timeout variables...
        SetCommTimeouts(hComm, &ctmoNew);


Oftewel. De ReadFile timed out na 100mS. Maar dat kon jij niet weten ;)

Het maakt niet niet uit of het rechts of het links is, maar TimmeStein weet precies wat de Jinx is !

Pagina: 1