Скорость Com-порта.
Требуемая скорость - 12500 бод. Помогите пожалуйста кто чем может. Очень нужно (я бы сказал дело жизни и смерти :()!
Не забывай, что оборудование последовательного порта не всякую скорость сможет установить. Если порт у тебя стандартный, то, скорее всего, получишь не точно 12500, а что-нибудь из ближайших возможных значений. Если порт на плате расширения (индустриальный мультипорт какой-нибудь), то, может быть, и удастся.
А как сейчас устанавливаешь?
Да в том то и дело, что пока никак. А порт у меня самый обычный - узкий на материнке.
Задача состоит в том, что бы подключить самодельную плату с микроконтроллером Siemens, частота тактового генератора которого составляет 12 МГц и соответственно последовательный канал может работать только на близких к этому частотах. Вообще это все успешно работало на 9х/DOS, а мне нужно переложить на NT (интерфейс как пользователя, так и программный). Исходники есть, но в них настройки порта производятся на асме (паскалевские вставки). В 9х все это работало замечательно, а вот серия NT, что вполне естественно с ее стороны, не пропускает эти вставки. Не возникает ошибок, никаких сообщений, просто теряется связь с контроллером.
Ладно - попробую на ближайшей стандартной (14400 бод).
Если кому интересно, то на скорости 12800 бод.
Всем спасибо за внимание, отбой. Присоединился!
Если кому интересно, то на скорости 12800 бод.
Интересно. Если можно опиши как.
Интересно. Если можно опиши как.
DCB *dcb;//указатель на структуру для конфигурирования СОМ порта
OVERLAPPED ovr;//структура для чтения/записи из/в порт
COMMTIMEOUTS ct;//структура для установки таймаутов чтения/записи порта
HANDLE port;//дескриптор порта
DWORD bc;//переменная указывающая количество считываемых/записываемых байт
HANDLE COM2=CreateFile("COM2",GENERIC_READ,0,NULL,OPEN_EXISTING,FILE_FLAG_OVERLAPPED,NULL);//открытие "файла" порта
И функция (вызвается с дескриптором порта, например COM2):
void WritePort(HANDLE port,char comand)
{
dcb=(DCB*)HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(DCB));//выделение памяти под структуру dcb служащей для настройки так сказать за один раз
//занесение данных в структуру dcb
dcb->DCBlength=sizeof(DCB);
BuildCommDCB("baud=12800 parity=N data=8 stop=1",dcb);
dcb->fNull=FALSE;
//установка временных интервалов ожидания чтения из порта и записи в порт
ct.ReadIntervalTimeout=100;
ct.WriteTotalTimeoutMultiplier=ct.WriteTotalTimeoutConstant=0;
//конфигурирование порта
if(!SetCommState(port,dcb))ShowMessage("Сконфигурировать не удалось");
if(!SetCommTimeouts(port,&ct))ShowMessage("Не удалось установить таймауты");
PurgeComm(port,PURGE_TXCLEAR|PURGE_RXCLEAR);//"сброс" порта
memset(&ovr,0,sizeof(ovr));//обнуление структуры ovr
ovr.hEvent=CreateEvent(NULL,FALSE,FALSE,NULL);//корректное создание дескриптора события порта
if(WaitForSingleObject(ovr.hEvent,-1)==WAIT_OBJECT_0)//ожидаем события в порту бесконечно
{
GetOverlappedResult( port,&ovr,&bc,FALSE);//записываем принятый байт если событие наступило в течение указанного времени ("-1" - бесконечность)
}
CloseHandle(ovr.hEvent);
}
Функция конечно жутко недоработанная - чето не получается разделить конфигурирование и собственно запись: не дожидается события, вернее ждет до бесконечности, хотя они (события) идут чередой. Думаем-с...
Теперь мучаюсь с записью. Если получится (а оно должно, иначе - фатал) могу выложить.
cPort->Connect("COM2",9200,8,'N',0,false,false);
в методе выполнения:
while(true){
do{}while(!cPort->WaitingDataEx());
Recvs = cPort->Recvstring(60);
//Здесь выполняются необходимые действия и при завершении потока удаляется объект TBlockSerial. Recvs открытая переменная имеющая тип AnsiString.
События отлавливались нормально. Вобщем то, нужно при создании потока настраивать его, указывать порт и прочее - но мне для задачи в этом не было необходимости.
На счет записи наверно сейчас ничего подсказать не смогу - я при чтении делал следующее...
За это спасибо, если найдешь что нибудь про запись, покажи. Я пока еще ничерта не могу в него записать (или могу, да вот только последовательный порт контроллера этого в упор не видит).
З.Ы. Нужен асинхронный режим считывания.
З.Ы.З.Ы. Че то я не понял ни фига в твоем примере при ближайщем рассмотрении: что за cPort и TBlockSerial? Объясни бревну если не лень.
За это спасибо, если найдешь что нибудь про запись, покажи. Я пока еще ничерта не могу в него записать (или могу, да вот только последовательный порт контроллера этого в упор не видит).
З.Ы. Нужен асинхронный режим считывания.
З.Ы.З.Ы. Че то я не понял ни фига в твоем примере при ближайщем рассмотрении: что за cPort и TBlockSerial? Объясни бревну если не лень.
Прошу прощения - это я торопился. TBlockSerial - классс-компонент для работы с портом, cPort - указатель на объект этого класса. Прикрепленный файл скинь в папку VCL и поменяй расширение на .hpp. Компонент сам называется SynaSer, я его закачал давненько уже не помню где - толи на королевстве, то ли на торинете. Помоему это единственный файл из которого он состоит.