Сил больше нет бороться сэтими синхронно-асинхронными портами.
(«Телесистемы»: Конференция «Микроконтроллеры и их применение»)

миниатюрный аудио-видеорекордер mAVR

Отправлено whale 10 ноября 2004 г. 20:58

Короче, надо принимать 7 байт каждые 100мс и скоростью 1200бит/с
Написана нижеприведенная прога.
Глюки - теряются данные,
по моему ощущению, если происходит сбой в одном из 7 байт, прога пытается
присоеденить недостающий байт из следующего пакета... если ставить таймауты,
прога не виснет, но выдает много неправильных данных.

Вопрос
1. Как организовать цикл опроса приема данных ?
У меня цикл - опрос по таймеру 50 мс с командами

Сначало инициализируем событие и структуру синхронизации
SetCommMask(port,EV_RXCHAR); // уст маски флага - принят бит

memset(&ovr,0,sizeof(ovr)); // сброс структуры синхронизации
ovr.hEvent=CreateEvent(NULL,TRUE,FALSE,NULL); // создание события получения пакета
ReadFile(port,buf_in,7,&bc,&ovr); // запуск чтения порта в асинхронном режиме

Timer1->Enabled=true;


//----------------------таймер ---------------------
void __fastcall TForm1::Timer1Timer(TObject *Sender)
{

if(WaitForSingleObject(ovr.hEvent,10)==WAIT_OBJECT_0)
{
// тут идет обработка данных и отсев по crc

}

ReadFile(port,buf_in,7,&bc,&ovr); // чтение следующего пакета
}

Правильно или организован цикл опроса или чего-нить нехватает внутри ?
Нужно ли закрывать событие каждый раз, сбрасывать, устанавливать структуру или
открывать ?
Например
CloseHandle(ovr.hEvent);
memset(&ovr,0,sizeof(ovr));
ovr.hEvent=CreateEvent(NULL,FALSE,FALSE,NULL);
ResetEvent(ovr.hEvent); и тд ?

Спасибо за ответ.

PS в синхронном работает, но тогда ничего сделать нельзя, например dsp ;)))

Составить ответ  |||  Конференция  |||  Архив

Ответы



Перейти к списку ответов  |||  Конференция  |||  Архив  |||  Главная страница  |||  Содержание  |||  Без кадра

E-mail: info@telesys.ru