Модераторы: Snowy, bartram, MetalFan, bems, Poseidon, Riply
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> непонятная проблема с инициализацией COM портов 
V
    Опции темы
Albinos_x
Дата 19.1.2011, 16:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Evil Skynet
****


Профиль
Группа: Комодератор
Сообщений: 3288
Регистрация: 28.5.2004
Где: X-6120400 Y-1 4624650

Репутация: 3
Всего: 108



Доброго вермени суток.

Суть проблемы.

имеется 2 устройства, которые подключены к компу, одно на com1, другое USB на COM5 (к  примеру)

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

function OpenCommPort(var CommHandle: THandle; Com:String): Boolean; StdCall;
begin
  CommHandle := CreateFile(PChar('\\.\'+com),
                             GENERIC_READ or GENERIC_WRITE,
                             0,
                             nil,
                             OPEN_EXISTING,
                             0,
                             0);
  Result := not (CommHandle = INVALID_HANDLE_VALUE);
end;


function WritePort(CommHandle: THandle; Command: string): Boolean;
var
  OutBuffLen, WritedCount: DWORD;
  Buff: array [0..255] of Char;
begin
  WritedCount := 0;
  FillChar(Buff, SizeOf(Buff), #0);
  StrPCopy(Buff, Command);
  OutBuffLen := Length(Command);
  WriteFile(CommHandle, Buff[0], OutBuffLen, WritedCount, nil);
  Result := WritedCount = OutBuffLen;
end;

function ReadPort(CommHandle: THandle): String;
var
  Resive: array [0..255] of Char;
  Kols, Errs: DWORD;
  Stat: TComStat;
  Str: String;
begin
  FillChar(Resive, SizeOf(Resive), #0);
  ClearCommError(CommHandle,Errs,@Stat);//сброс флага
  Kols := Stat.cbInQue;
  ReadFile(CommHandle, Resive[0], Kols, Kols, nil);
  if Kols > 0 then //что-то пришло
    Result := String(Resive)
  else
    Result := '';
end;

procedure CloseCommPort(var CommHandle: THandle); StdCall;
begin
  PurgeComm(CommHandle, PURGE_TXABORT or PURGE_RXABORT or
                        PURGE_TXCLEAR or PURGE_RXCLEAR);
  CloseHandle(CommHandle);
  CommHandle := INVALID_HANDLE_VALUE;
end;


этот код работает только если перед моей программой (например сразу после запуска компьютера) к порту тому и другому подлючиться другим ПО, например, гипертерминалом или специлизированным ПО для настройки одного из устройств, а потом отключить. 
Если после загрузки компа ничем не подключаться, то не выдавая никаких ошибок она подключается к устройствам и даже (согласно мониторам) что-то пытается в них записать, но устройства не получают команд и не выдают их обратно.

Предпологаю, что проблема в инициализации портов. Но пока ошибку не нашел. 

Прошу помоч найти ошибку

Заранее спасибо.

Это сообщение отредактировал(а) Albinos_x - 19.1.2011, 16:56


--------------------
"Кто владеет информацией, тот владеет миром"    
Уинстон Черчилль
PM MAIL ICQ   Вверх
Albinos_x
Дата 19.1.2011, 18:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Evil Skynet
****


Профиль
Группа: Комодератор
Сообщений: 3288
Регистрация: 28.5.2004
Где: X-6120400 Y-1 4624650

Репутация: 3
Всего: 108



Извините за беспокойство, проблема решена:

Код

function OpenCommPort(var CommHandle: THandle; Com:String): Boolean; StdCall;
var dbc:TDCB;
begin
  CommHandle := CreateFile(PChar('\\.\'+com),
                             GENERIC_READ or GENERIC_WRITE,
                             0,
                             nil,
                             OPEN_EXISTING,
                             0,
                             0);
  Result := not (CommHandle = INVALID_HANDLE_VALUE);
  if Result then
     begin
     Windows.GetCommState(CommHandle, dbc);
     dbc.BaudRate:=CBR_9600;
     dbc.StopBits:=ONESTOPBIT;
     dbc.Parity:=NOPARITY;
     dbc.ByteSize:=8;
     Windows.SetCommState(CommHandle, dbc);
     Windows.SetCommMask(CommHandle, EV_RING+EV_RXCHAR+EV_RXFLAG+EV_TXEMPTY);
     end;
end;



--------------------
"Кто владеет информацией, тот владеет миром"    
Уинстон Черчилль
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: WinAPI и системное программирование"
Snowybartram
MetalFanbems
PoseidonRrader
Riply

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Delphi обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • 99% ответов по WinAPI можно найти в MSDN Library, оставшиеся 1% здесь

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, bartram, MetalFan, bems, Poseidon, Rrader, Riply.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: WinAPI и системное программирование | Следующая тема »


 




[ Время генерации скрипта: 0.0564 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.