Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2006.12.03;
Скачать: [xml.tar.bz2];

Вниз

Как прервать цикл ожидания посылки (ComPort 3.1 от WinSoft a)   Найти похожие ветки 

 
Ingwar ©   (2006-11-16 21:01) [0]

Есть задача получать по Com порту пакеты данных на скорости 115200 с интервалом между пакетами 5мс. В этом интервале устройство передающие пакеты ждет ответа.
   Я испробовал много компонентов, но все они не успевали выставлять событие о приеме (возможно потому, что я не знал как и где им повысить приоритет). Пытался попробовать сдеать через API, но к сожалению уровень знаний пока не позволяет. Потом мне посоветовали ComPort 3.1 от WinSoft. Он граммотно выставляет событие о приеме. И проблема с потерей пакетов была решена. Но встала другая проблема... А как не зависнуть, если передающее устройство заткнется на середине передачи пакета. Я решил использовать для этих целей таймер... Но не удачно.

Вообщем, что-то в ниже приведенном куске у меня не работает при закрытии проги вываливаюсь в VA...


type
 TForm1 = class(TForm)
   Timer: TTimer;
   ComPort: TComPort;
...

var
FBreak : boolean; //флаг окончания посылки
len: integer; //счетчик размера посылки
buff: array [1..1024] of byte; //буфер под посылку

implementation

procedure TForm1.TimerTimer(Sender: TObject);
begin
 Timer.Enabled := False;
 FBreak := False;
end;

procedure TForm1.ComPortRxChar(Sender: TObject);
var
Text: String;
begin
 len := 0
 Timer.Enabled := True;
 FBreak := True;
 while (FBreak) do
 begin
   inc(len);
   buff[len] := ComPort.ReadByte;    
//Если получили маркер конца посылки и посылка не обрезанная
   if (buff[len]=$d) and (len>5) then FBreak := False;
 end;
 Timer.Enabled := False;
//Дальше идет подсчет CRC и т.д.
...

end;


 
Kolan ©   (2006-11-16 21:03) [1]

> пакетами 5мс.

Не получится точно в Winodws


 
Kolan ©   (2006-11-16 21:05) [2]

> В этом интервале устройство передающие пакеты ждет ответа.

А Этот ответ нужен? Лучьше устройству тупо отвечать..


 
Ingwar ©   (2006-11-16 21:23) [3]

[1]: Уже получилось... Этот компонент позваляет установить рилтаймовый приоритет для своего потока.
[2]: Я бы ему тупо отвечал, если бы не надо было перед ответом CRC проверить =(


 
Ingwar ©   (2006-11-16 22:24) [4]

Нда... Похоже советов больше не будет... А жаль... Наверное, придется про API дальше читать =( Жаль. Хороший компонентик... был...


 
Kolan ©   (2006-11-16 22:50) [5]

> Уже получилось...

А теперь возми машину пхуже и запусти на ней еще что-нибудь... Windows - не риал тиме система. 5мс - очень мало..


> Я бы ему тупо отвечал, если бы не надо было перед ответом
> CRC проверить =(

Дык мастер кто? Тыли или устройство?


 
Kolan ©   (2006-11-16 22:51) [6]

> Наверное, придется про API дальше читать

Прийдется полюбому и много. Удачи :)


 
Ingwar ©   (2006-11-16 23:06) [7]

Инициатор обмена устройство! Поэтому и стоит проблема в том, чтобы при приеме не зависнуть при обрыве передачи... Для чего я поставил таймер, но похоже он либо не запускается из другого потока, либо не срабатывает =(


 
Kolan ©   (2006-11-16 23:25) [8]

> [7] Ingwar ©   (16.11.06 23:06)
> Инициатор обмена устройство! Поэтому и стоит проблема в
> том, чтобы при приеме не зависнуть при обрыве передачи...
> Для чего я поставил таймер, но похоже он либо не запускается
> из другого потока, либо не срабатывает =(


Что-то пока не понял. Ты как только пакет обнаружил - отвечай. Те если тебе пакет прислали порченый(конт. сумма например неверная), то ты молчишь.
Используй доп. поток чтобы анализировать полученные данные.

ЗЫ
 В общем случае за 5 мс не успеешь полюбому.


 
Kolan ©   (2006-11-16 23:26) [9]

> не зависнуть при обрыве передачи

Вот тут не понял что это ты вдруг зависнешь? ТУт что-то с логикой.


 
Kolan ©   (2006-11-16 23:27) [10]

А пакет как устроен?


 
Ingwar ©   (2006-11-16 23:57) [11]

У пакета есть байт - признак конца пакета равный $0d... Вот его я и жду... А если связь прервется (конечно маловероятно, но наигрываются все возможные сбои),  то я зависну ожидая конца посылки.... И поэтому я поставил таймер, который должен спасать в подобной ситуации... Но он у меня не срабатывает =(
И я остаюсь в цикле ожидания конца пакета =(

В пределе, конечно, насчет 5 мс ты прав... Но пока у меня получается (естесно, что пока запущено тока мое приложение)


 
MikePetrichenko ©   (2006-11-17 06:41) [12]

Это что же за устройство такое?
Выставь тайм-аут на прием. Скажем 10 сек. По тайм-ауту и прерывай прием (устройство зависло).
А вообще успеешь, если будешь считать в томже потоке по факту прихода данных и СРАЗУ отвечать. Поток и все приложение - приоритет Real Time. Тогда шансы есть.


 
medved_68 ©   (2006-11-17 09:02) [13]


> Есть задача получать по Com порту пакеты данных на скорости
> 115200 с интервалом между пакетами 5мс. В этом интервале
> устройство передающие пакеты ждет ответа.

Ingwar Сдается мне что мануал по устройству понят неверно. Хотя может и ошибаюсь. А ты не пробовал после приема и проверки Контрольной суммы пакета дать подтверждение приема пакета??? И не в промежутке 5 мс. А позже. Просто многие устройства передают тупо пакет до тех пор пока не придет подтверждение, причем с интервалом 5-60 мс. Но это не значит что подтверждение необходимо послать именно в интервале между пакетами. :))) Как только получено подтверждение передачи и CRC подтверждения совпала идет дальнейшая работа по протоколу, а именно либо девайс ждет ответа на запрос, причем терпеливо, либо следующий пакет. А чтобы разделить данные что пришли до подтверждения и новые - протокол должен предусматривать маркер начала пакета. Это есть???


 
Ingwar ©   (2006-11-17 14:03) [14]

[13] Есть маркер конца - байт $d.
И посылки реально шлются с интервалом не менее 5мс... Иногда несколько подряд, а иногда затишье.


 
Ingwar ©   (2006-11-17 14:05) [15]

[12]
ТО MikePetrichenko: Я успеваю принимать и отвечать... А вот с таймером ерунда какая-то =( Не проходит событие...


 
Kolan ©   (2006-11-17 14:16) [16]

> то я зависну ожидая конца посылки

Ну и вынеси это в отдельный поток. и пусть он сит сколько влезит... Если нужно сообшить что мол связь прервана - про WaitForSingleObject итд прочти


 
Kolan ©   (2006-11-17 14:16) [17]

> он сит сколько

он спит сколько


 
MikePetrichenko ©   (2006-11-17 15:14) [18]


> А вот с таймером ерунда какая-то =( Не проходит событие.
> ..

И не будет. Ты же поток блокируешь одиданием.


 
Ingwar ©   (2006-11-18 12:18) [19]

Всем спасибо!!!.. ушел читать про WaitForSingleObject =)



Страницы: 1 вся ветка

Форум: "Начинающим";
Текущий архив: 2006.12.03;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.5 MB
Время: 0.042 c
15-1163694687
Ringo
2006-11-16 19:31
2006.12.03
Бог есть. Вероятно. А как думают остальные?


2-1163712915
DoktorX
2006-11-17 00:35
2006.12.03
Помогите с Memo!


15-1163501877
Chainichek
2006-11-14 13:57
2006.12.03
Помогите настроить доступ к компьютеру по локалке


15-1163149860
Jolik
2006-11-10 12:11
2006.12.03
Стоит ли переходить на Delphi 2005?


2-1163634950
Wadim
2006-11-16 02:55
2006.12.03
Тут был вопрос по поводу как словить клавиши в винде. А если..





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский