Главная страница
    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.064 c
6-1152965383
ntsec
2006-07-15 16:09
2006.12.03
DCC


2-1163666710
Megabyte
2006-11-16 11:45
2006.12.03
Снова про Трей, какие модули подключать, в факе не указано?


2-1163537269
Kostafey
2006-11-14 23:47
2006.12.03
Сложный SQL запрос к БД


2-1163495203
MishaLukash
2006-11-14 12:06
2006.12.03
DBGrid.Columns.Width не отображает поле во всю длинну


15-1163178255
Ne-Ld
2006-11-10 20:04
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
Английский Французский Немецкий Итальянский Португальский Русский Испанский