Найдите настройки последовательного порта в Delphi - PullRequest
0 голосов
/ 13 июля 2009

Привет! Мне нужно найти скорость передачи в бодах и другие настройки для последовательного порта. Глядя в Интернете, похоже, что я должен использовать GetCommConfig , Это возвращает запись TCommConfig с тем, что я Предположим, это данные, которые мне нужны. Проблема в том, что функция, которую я использую, возвращает неправильные значения.

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

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

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

первые 4 действительны, но возвращают 1200, а 5-й недействителен и возвращает 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;

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

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

Кто-нибудь знает, где я иду не так?

Ответы [ 2 ]

3 голосов
/ 14 июля 2009

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

Посмотрите, если это так, и, пожалуйста, исправьте меня, если я ошибаюсь, GetDefaultCommConfig возвращает настройки из окон, а GetCommConfig возвращает настройки открытого соединения с портом, writefile открывает порт так, как считает нужным (игнорируя значение по умолчанию настройки), откуда исходила скорость 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 голосов
/ 13 июля 2009

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

...