2009-07-13 3 views
0

Привет, мне нужно найти скорость передачи и другие настройки для последовательного порта. Оглядываясь на веб-интерфейс, похоже, что я должен использовать GetCommConfig. Это возвращает запись TCommConfig с тем, что Я предполагаю, что мне нужны данные. Проблема в том, что функция I wote возвращает неправильные значения.Найдите настройки последовательного порта в Delphi

Код выглядит так, как будто он работает, но скорость в бодах всегда равна 1200, что выглядит в диспетчере устройств Windows (и изменении настроек порта).

Я попытался назвать его так:

ComPort('com1'); 
ComPort('COM1'); 
ComPort('COM1:'); 
ComPort('COM4'); 
ComPort('COM9'); 

первый 4 действительны, но вернуть 1200 и пятый является недействительным и возвращает 0

function ComPort(l_port:String):TCommConfig; 
{Gets the comm port settings} 
    var 
    ComFile: THandle; 
    PortName: array[0..80] of Char; 
    size: cardinal; 
    CommConfig:TCommConfig; 
begin 
    FillChar(Result, SizeOf(TCommConfig), 0);//blank return value 

    try 
     StrPCopy(PortName,l_port); 
     ComFile := CreateFile(PortName,GENERIC_READ or GENERIC_WRITE,0,nil,OPEN_EXISTING,0{ FILE_ATTRIBUTE_NORMAL},0); 
     try 
      if (ComFile <> INVALID_HANDLE_VALUE) then 
      begin 
       FillChar(CommConfig, SizeOf(TCommConfig), 0);//blank record 
       CommConfig.dwSize := sizeof(TCommConfig);//set size 
       //CommConfig.dcb.DCBlength := SizeOf(_dcb); 
       size := sizeof(TCommConfig); 

       if (GetCommConfig(ComFile,CommConfig,size)) then 
       begin 
        Result := CommConfig; 
       end; 
      end; 
     finally 
      CloseHandle(ComFile); 
     end; 
    except 
     Showmessage('Unable to open port ' + l_port); 
    end; 
end; 

Stepping через код, первый 4 всегда попадает в строку Результат: = CommConfig;, поэтому GetCommConfig перенастраивает действительный код, поэтому мне что-то не хватает.

Я судимое Verious другие вещи, такие как настройка длины записи ДСВ, но все они имеют один и тот же результат, как и в бодах 1200.

Кто-нибудь знает, где я неправильно?

+0

Вы пробовали GetCommState? http://msdn.microsoft.com/en-us/library/aa363260%28VS.85%29.aspx – stukelly

+0

Да, тот же результат, насколько я могу судить, GetCommConfig использует GetCommState для заполнения записи DCB. – Re0sless

ответ

3

Оказалось, что я использую неправильную функцию, я должен был использовать GetDefaultCommConfig, а не GetCommConfig, который я использовал.

Посмотрите, если это так, и, пожалуйста, исправьте меня, если я ошибаюсь, GetDefaultCommConfig возвращает настройки из окон, а GetCommConfig возвращает настройки открытого подключения к порту, файл записи открывает порт по мере его соответствия (игнорируя настройки по умолчанию), из которых исходит 1200 бод.

Если это поможет кому-либо в будущем, вот функция, с которой я пришел.

function ComPort(l_port:String):TCommConfig; 
{Gets the comm port settings (use '\\.\' for com 10..99) } 
    var 
    size: cardinal; 
    CommConfig:TCommConfig; 
begin 
    FillChar(Result, SizeOf(TCommConfig), 0); 

    //strip trailing : as it does not work with it 
    if (RightStr(l_port,1) = ':') then l_port := LeftStr(l_port,Length(l_port)-1); 

    try 
     FillChar(CommConfig, SizeOf(TCommConfig), 0); 
     CommConfig.dwSize := sizeof(TCommConfig); 

     size := sizeof(TCommConfig); 

     if (GetDefaultCommConfig(PChar(l_port),CommConfig,size)) then 
     begin 
      Result := CommConfig; 
     end 
     //if port is not found add unc path and check again 
     else if (GetDefaultCommConfig(PChar('\\.\' + l_port),CommConfig,size)) then 
     begin 
      Result := CommConfig; 
     end 
    except 
     Showmessage('Unable to open port ' + l_port); 
    end; 
end; 
3

Скорость передачи данных и другие настройки для последовательного порта устанавливаются при открытии последовательного порта. Я думаю, что вы читаете значения по умолчанию.

+0

Я думал, что это делал CreateFile, открывая соединение с портом? – Re0sless

Смежные вопросы