Implementacja timeoutu w komunikacji szeregowej w Keil przy problemach z połączeniem
C i komunikacja.
From: "Bartosz Waleska" <combosoft_at_nospam_poczta.onet.pl>
Subject: C i komunikacja.
Date: Sun, 14 Sep 2003 16:41:23 +0200
Czesc,
Podczas mojej zabawy znowu natknalem sie na problem. (dotyczy keil'a).
Mam komunikacje szeregowa z innym ukladem. Wysylam zapytanie do tego
urzadzenia, w odpowiedzi mam otrzymac kod. Realizuje to tak:
puts("rozkaz");
gets(buffor,strlen(buffor));
ale teraz wlasnie rodzi sie problem, co zrobic jak magistrala polaczeniowa
bedzie rozlaczona? tzn. jak zrobic timeout, by powiedzmy po x czasie proba
zostala ponowiona? gets "zawiesza" program w tym miejscu. Znalazlem funkcje
ungetchar(znak), czy takie cos realizuje sie przez te funkcje i timera? Z
timerem powinienem dac sobie rade (jest pare przykladow w exemplach), a
funkcje ungetchar musialbym wykonac tyle razy ile znakow oczekuje? czyli
strlen(buffor)?
A moze jest inny sposob?
pozdrawiam,
Bartek.
========
Path: news-archive.icm.edu.pl!agh.edu.pl!news.agh.edu.pl!news.onet.pl!newsfeed.gazeta.pl!opal.futuro.pl!newsfeed.tpinternet.pl!atlantis.news.tpi.pl!news.tpi.pl!not-for-mai
From: "Marek" <neticus_at_nospam_wp.pl>
Subject: Re: C i komunikacja.
Date: Sun, 14 Sep 2003 22:35:50 +0200
Mam komunikacje szeregowa z innym ukladem. Wysylam zapytanie do tego
urzadzenia, w odpowiedzi mam otrzymac kod. Realizuje to tak:
puts("rozkaz");
gets(buffor,strlen(buffor));
ale teraz wlasnie rodzi sie problem, co zrobic jak magistrala polaczeniowa
bedzie rozlaczona? tzn. jak zrobic timeout, by powiedzmy po x czasie proba
zostala ponowiona? gets "zawiesza" program w tym miejscu. Znalazlem
funkcje
ungetchar(znak), czy takie cos realizuje sie przez te funkcje i timera? Z
timerem powinienem dac sobie rade (jest pare przykladow w exemplach), a
funkcje ungetchar musialbym wykonac tyle razy ile znakow oczekuje? czyli
strlen(buffor)?
A moze jest inny sposob?
Sposobów jest multum, ale oto pierwszy z głowy:
napisać swoje getc(), (skopiować i zmienić standardowe),
które ma wbudowany timeout i po jego przekroczeniu
zwraca zamiast znaku np. 0xFF.
W swoich programach robię zresztą najczęściej inaczej:
znaki odbierają się w przerwaniu, a pętla oczekiwania
na odpowiedź liczy maksymalny czas na jej nadejście
i potem sygnalizuje timeout.
Pzdr,
Marek
========
Path: news-archive.icm.edu.pl!agh.edu.pl!news.agh.edu.pl!news.onet.pl!newsfeed.tpinternet.pl!news.ats.pl!not-for-mai