![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Не могу получить нули через 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 после заполнения на диск и убедиться что флаг действительно сброшен.