Форум: "Начинающим";
Текущий архив: 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.073 c