Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Не могу получить нули через COM-порт [D7, WinXP]


oleg_p ©   (2004-11-10 16:30:00) 

Работаю в Delphi. Нужно получить двоичные данные с устройства через com-порт. Заполняю TDCB, признак dcb_NullStrip(fNull) стоит в 0. При чтении из порта получаю все данные, кроме символа NUL (эти символы просто пропускаются). Точно знаю, что внешнее устройство их передаёт. Облазил разные форумы-ничего конкретного на эту тему. Помогите !!!

Так я заполняю DCB:

 FillChar(dcb,sizeOf(dcb),0);
 dcb.DCBlength := sizeOf(dcb);

 dcb.Flags := dcb_Binary or dcb_RtsControlEnable;
 dcb.BaudRate := Win32BaudRates[FComPortBaudRate];

 case FComportHwHandshaking  of
   hhNONE  : ;
   hhRTSCTS:
     dcb.Flags := dcb.Flags or dcb_OutxCtsFlow or dcb_RtsControlHandshake;
 end;

 case FComportSwHandshaking of
   shNONE   : ;
   shXONXOFF:
     dcb.Flags := dcb.Flags or dcb_OutX or dcb_Inx;
 end;

 dcb.XonLim   := FComportInputBufferSize div 4;
 dcb.XoffLim  := 1;
 dcb.ByteSize := 5 + ord(FComportDataBits);
 dcb.Parity   := ord(FComportParity);
 dcb.StopBits := ord(FComportStopBits);
 dcb.XonChar  := #17;
 dcb.XoffChar := #19;


oleg_p   (2004-11-11 11:21:00) [1]

Как не стыдно признать, но ты прав - компонент, который я использовал (скачал из сети) читал полученные символы так:

ReadFile(.....);
temp := temp + PChar(Buffer);-здесь символ #0 и пропадал

а я так надеялся на его надёжность...

Спасибо тебе Reinder Moss Eater !!!


Reindeer Moss Eater   (2004-11-11 09:45:00) [2]

Значит либо девайс нули не шлет, либо тебе только кажется, что ты не получаешь нули из порта.


oleg_p   (2004-11-11 09:12:00) [3]

DCB.Flags and $00000800 = 0
Я работаю с Flags = 4097($1001). SetCommState возвращает True в LongBool, то есть 1 в DWORD.


Reindeer Moss Eater   (2004-11-11 08:43:00) [4]

Ничем они не отличаются.
Надо внимательно рассматривать описание структуры в SDK.


Reindeer Moss Eater   (2004-11-11 08:43:00) [5]

Чему равно выражение DCB.Flags and $00000800 ?
Что возвращает SetCommState ?


oleg_p   (2004-11-11 08:37:00) [6]

...и ещё вопрос: Почему описание DCB в Windows SDK help и в файле windows.pas различаются; как SetCommState понимает какую структуру ей дают на вход ?


oleg_p   (2004-11-11 08:22:00) [7]

После SetCommState сделал GetCommState - DCB именно такой, какой я установил (fNull сброшен). Константы для флагов проверял. Результат SetCommState - True. Проблема остается...


Reindeer Moss Eater   (2004-11-10 16:56:00) [8]

В "родном" windows.pas нет многих констант для установки флагов в DCB.

Значит они объявлены в пользовательских модулях и могут иметь ошибки.

Да и результат SetCommState может быть False.


wal   (2004-11-10 16:42:00) [9]

В флагах есть такая штука, как
DWORD fNull: 1;            // enable null stripping
Проверь на всякий случай.

С уважением.


Reindeer Moss Eater   (2004-11-10 16:41:00) [10]

Дампануть DCB после заполнения на диск и убедиться что флаг действительно сброшен.


Наверх

Титульная страница Поиск, карта сайта Написать письмо