Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: WinAPI и системное программирование > непонятная проблема с инициализацией COM портов


Автор: Albinos_x 19.1.2011, 16:54
Доброго вермени суток.

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

имеется 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, 18:11
Извините за беспокойство, проблема решена:

Код

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;

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)