Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.12.26;
Скачать: CL | DM;

Вниз

Не могу получить нули через COM-порт   Найти похожие ветки 

 
oleg_p   (2004-11-10 16:30) [0]

Работаю в 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;


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

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


 
wal ©   (2004-11-10 16:42) [2]

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

С уважением.


 
Reindeer Moss Eater ©   (2004-11-10 16:56) [3]

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

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

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


 
oleg_p   (2004-11-11 08:22) [4]

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


 
oleg_p   (2004-11-11 08:37) [5]

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


 
Reindeer Moss Eater ©   (2004-11-11 08:43) [6]

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


 
Reindeer Moss Eater ©   (2004-11-11 08:43) [7]

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


 
oleg_p   (2004-11-11 09:12) [8]

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


 
Reindeer Moss Eater ©   (2004-11-11 09:45) [9]

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


 
oleg_p   (2004-11-11 11:21) [10]

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

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

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

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



Страницы: 1 вся ветка

Текущий архив: 2004.12.26;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.025 c
8-1096355911
X-Disa
2004-09-28 11:18
2004.12.26
Печать изображений


1-1103013273
paule
2004-12-14 11:34
2004.12.26
перекодировка текста


1-1102717713
Bobby Digital
2004-12-11 01:28
2004.12.26
Memo


14-1102066006
Ega23
2004-12-03 12:26
2004.12.26
"Баллада о борьбе" Высоцкого


3-1101297075
Irina :)
2004-11-24 14:51
2004.12.26
InterBase