![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как прервать цикл ожидания посылки (ComPort 3.1 от WinSoft'a) [D7, XP]
Ingwar © (2006-11-16 21:01:00)Есть задача получать по 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;
Ingwar (2006-11-18 12:18:00) [1]Всем спасибо!!!.. ушел читать про WaitForSingleObject =)
MikePetrichenko (2006-11-17 15:14:00) [2]
> А вот с таймером ерунда какая-то =( Не проходит событие.
> ..
И не будет. Ты же поток блокируешь одиданием.
Kolan (2006-11-17 14:16:00) [3]> он сит сколько
он спитсколько
Kolan (2006-11-17 14:16:00) [4]> то я зависну ожидая конца посылки
Ну и вынеси это в отдельный поток. и пусть он сит сколько влезит... Если нужно сообшить что мол связь прервана - про WaitForSingleObject итд прочти
Ingwar (2006-11-17 14:05:00) [5][12]
ТО MikePetrichenko: Я успеваю принимать и отвечать... А вот с таймером ерунда какая-то =( Не проходит событие...
Ingwar (2006-11-17 14:03:00) [6][13] Есть маркер конца - байт $d.
И посылки реально шлются с интервалом не менее 5мс... Иногда несколько подряд, а иногда затишье.
medved_68 (2006-11-17 09:02:00) [7]
> Есть задача получать по Com порту пакеты данных на скорости
> 115200 с интервалом между пакетами 5мс. В этом интервале
> устройство передающие пакеты ждет ответа.
IngwarСдается мне что мануал по устройству понят неверно. Хотя может и ошибаюсь. А ты не пробовал после приема и проверки Контрольной суммы пакета дать подтверждение приема пакета??? И не в промежутке 5 мс. А позже. Просто многие устройства передают тупо пакет до тех пор пока не придет подтверждение, причем с интервалом 5-60 мс. Но это не значит что подтверждение необходимо послать именно в интервале между пакетами. :))) Как только получено подтверждение передачи и CRC подтверждения совпала идет дальнейшая работа по протоколу, а именно либо девайс ждет ответа на запрос, причем терпеливо, либо следующий пакет. А чтобы разделить данные что пришли до подтверждения и новые - протокол должен предусматривать маркер начала пакета. Это есть???
MikePetrichenko (2006-11-17 06:41:00) [8]Это что же за устройство такое?
Выставь тайм-аут на прием. Скажем 10 сек. По тайм-ауту и прерывай прием (устройство зависло).
А вообще успеешь, если будешь считать в томже потоке по факту прихода данных и СРАЗУ отвечать. Поток и все приложение - приоритет Real Time. Тогда шансы есть.
Ingwar (2006-11-16 23:57:00) [9]У пакета есть байт - признак конца пакета равный $0d... Вот его я и жду... А если связь прервется (конечно маловероятно, но наигрываются все возможные сбои), то я зависну ожидая конца посылки.... И поэтому я поставил таймер, который должен спасать в подобной ситуации... Но он у меня не срабатывает =(
И я остаюсь в цикле ожидания конца пакета =(
В пределе, конечно, насчет 5 мс ты прав... Но пока у меня получается (естесно, что пока запущено тока мое приложение)
Kolan (2006-11-16 23:27:00) [10]А пакет как устроен?
Kolan (2006-11-16 23:26:00) [11]> не зависнуть при обрыве передачи
Вот тут не понял что это ты вдруг зависнешь? ТУт что-то с логикой.
Kolan (2006-11-16 23:25:00) [12]> [7] Ingwar © (16.11.06 23:06)
> Инициатор обмена устройство! Поэтому и стоит проблема в
> том, чтобы при приеме не зависнуть при обрыве передачи...
> Для чего я поставил таймер, но похоже он либо не запускается
> из другого потока, либо не срабатывает =(
Что-то пока не понял. Ты как только пакет обнаружил - отвечай. Те если тебе пакет прислали порченый(конт. сумма например неверная), то ты молчишь.
Используй доп. поток чтобы анализировать полученные данные.
ЗЫ
В общем случае за 5 мс не успеешь полюбому.
Ingwar (2006-11-16 23:06:00) [13]Инициатор обмена устройство! Поэтому и стоит проблема в том, чтобы при приеме не зависнуть при обрыве передачи... Для чего я поставил таймер, но похоже он либо не запускается из другого потока, либо не срабатывает =(
Kolan (2006-11-16 22:51:00) [14]> Наверное, придется про API дальше читать
Прийдется полюбому и много. Удачи :)
Kolan (2006-11-16 22:50:00) [15]> Уже получилось...
А теперь возми машину пхуже и запусти на ней еще что-нибудь... Windows - не риал тиме система. 5мс - очень мало..
> Я бы ему тупо отвечал, если бы не надо было перед ответом
> CRC проверить =(
Дык мастер кто? Тыли или устройство?
Ingwar (2006-11-16 22:24:00) [16]Нда... Похоже советов больше не будет... А жаль... Наверное, придется про API дальше читать =( Жаль. Хороший компонентик... был...
Ingwar (2006-11-16 21:23:00) [17][1]: Уже получилось... Этот компонент позваляет установить рилтаймовый приоритет для своего потока.
[2]: Я бы ему тупо отвечал, если бы не надо было перед ответом CRC проверить =(
Kolan (2006-11-16 21:05:00) [18]> В этом интервале устройство передающие пакеты ждет ответа.
А Этот ответ нужен? Лучьше устройству тупо отвечать..
Kolan (2006-11-16 21:03:00) [19]> пакетами 5мс.
Не получится точно в Winodws