Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.12.03;
Скачать: CL | DM;

Вниз

Как прервать цикл ожидания посылки (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;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.06 c
8-1145596218
Niko
2006-04-21 09:10
2006.12.03
Фоновая загрузка изображений


3-1159717928
bugorik
2006-10-01 19:52
2006.12.03
Как поместить результат SQL запроса в Combobox ?


1-1161766957
rif
2006-10-25 13:02
2006.12.03
Выпадение приложения


15-1163485995
alex_drob
2006-11-14 09:33
2006.12.03
Лицензионный WinXP и новый HDD


2-1163577126
DragonIG
2006-11-15 10:52
2006.12.03
Как можно из-под программы переписать строковые ресурсы в DLL