Проблемы с COM-портом в Buildere (несколько офф, но с МКК связано напрямую)
(«Телесистемы»: Конференция «Микроконтроллеры и их применение»)

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

Отправлено arreg 22 ноября 2003 г. 16:30

Помогите, пожалуйста, решить проблему.
Я хочу обмениваться с ATmega128 по COM-порту 9-битными посылками. 1-й байт - команда (9й бит = 1), 2й и 3й биты - данные (9й бит = 0) - т.е. использую как бы мультипроцессорный режим меги. Задачу решаю так:

SetCommMask(port,EV_TXEMPTY);

GetCommState(port,&ComType);
ComType.Parity=MARKPARITY; // Установить 9й бит равным 1 для передачи команды
SetCommState(port,&ComType);

nCharWait=0;
WriteFile(port,&command,1,&nCharWait,NULL);
WaitCommEvent(port,NULL,NULL);

GetCommState(port,&ComType);
ComType.Parity=SPACEPARITY; // Установить 9й бит равным 0 для передачи данных
SetCommState(port,&ComType);

nCharWait=0;
WriteFile(port,&data,2,&nCharWait,NULL);
WaitCommEvent(port,NULL,NULL);

Проблема в том, что WaitCommEvent выдаёт ошибку (GetLastError выдаёт код 998). Если WaitCommEvent не использовать, то, по видимому, смена флага ComType.Parity на SPACEPARITY происходит быстрее, чем отсылается первый байт из буфера Com-порта, что, естественно, не правильно. Кстати, при установке задержки между отсылкой команды и данных всё работает, но, разумеется, это замедляет процесс передачи.

Хотелось бы узнать, как корректно решить эту задачу. И не делаю ли я лишних операций?
Для информации: пишу в Builder 6, WinXP, не использую Overlapped структуру, обмен с портом реализован в отдельном потоке.

С уважением, Андрей.

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

Ответы



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

E-mail: info@telesys.ru