Avatar billede krukken Juniormester
17. november 2004 - 17:59 Der er 11 kommentarer og
1 løsning

Timer interrupt ved læsning af COM-port

Hej,

Jeg læser nogle data på en COM-porten. I den forbindelse vil jeg gerne vide hvordan man kan lave et interrupt når et bestemt tid er gået(1 sek). ALtså så et helt program ikke hænger pga. kommunikationen er gået galt?
Avatar billede krukken Juniormester
17. november 2004 - 18:00 #1
Jeg compiler med g++
Avatar billede bertelbrander Novice
17. november 2004 - 20:14 #2
Hvis det er windows og du bruger CreateFile til at åbne porten med, kan du bruge SetCommTimeouts til at bestemme hvor lang til du vil vente:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/devio/base/setcommtimeouts.asp

Det letteste er at kalde GetCommTimeouts først og så modificere struct'en og derpå kalde SetCommTimeouts
Avatar billede krukken Juniormester
17. november 2004 - 20:25 #3
Jeg compiler med g++-> linux eller unix:-)
Avatar billede bertelbrander Novice
17. november 2004 - 20:34 #4
Jeg bruger g++ på windows...

På Linux/Unix skal du vist kikke på ioctl
Avatar billede bertelbrander Novice
17. november 2004 - 20:47 #5
Du kunne sætte porten til at køre async og så polle så længe der kommer data.
Eller du kan starte en paralel tråd, og så lukke (cancel) porten derfra.
Avatar billede segmose Nybegynder
18. november 2004 - 13:59 #6
Brug select på din fd.
Avatar billede krukken Juniormester
18. november 2004 - 14:02 #7
segmose >> Gider du at forklare det lidt nærmere?
Avatar billede bertelbrander Novice
18. november 2004 - 20:24 #8
Et hurtigt utestet eksempel:

  fd_set ReadSet;
  struct timeval Time;
  memset(&ReadSet, 0, sizeof(ReadSet));
  FD_SET(port, &ReadSet);
  Time.tv_sec = TIMEOUT;
  Time.tv_usec = 0;

  if(select(port + 1, &ReadSet, 0, 0, &Time) > 0)
    DataReceived();
  else
    Timeout();

Læs om select her (det er vist det samme som "man select):
http://www.rt.com/man/select.2.html
Avatar billede krukken Juniormester
18. november 2004 - 20:29 #9
Så spørger jeg måske lidt dumt.

Men hvis man forestiller sig at man skal have 20 byte over en seriel linie. Nulstilledes timeren så ikke hver gang de modtages noget?

Altså det vil sige - hvis TIMEOUT sættes til 1 sekunder, så tillader man faktisk at læsning af de 20 byte må tage 20 sekunder?
Avatar billede bertelbrander Novice
18. november 2004 - 20:48 #10
select vil lave en timeout når tiden er udløbet og der ikke er modtaget det ønskede antal karakterer.
Hvis du modtager alle dine karakterer inden timeout vil select kun returnere én gang.

Hvis du kun modtager nogle af de ønskede karakterer inden timeout vil select returnere og fortælle at der er modtaget noget, du kan så læse igen med en ny select og vente på resten (evt med en ny mindre timeout).
Avatar billede bertelbrander Novice
18. november 2004 - 20:50 #11
Timeout nulstilles ikke når der modtages noget.
Husk at sætte timeout igen inden en ny select.
Avatar billede segmose Nybegynder
24. november 2004 - 11:54 #12
Ellers risikeres der ved nogen implementationer at der bruges rest tiden! (hvis ikke timeout sætter igen).
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester