0

こんにちは、シリアル ポートのボー レートとその他の設定を見つける必要があります。Web で調べてみると、 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 つの行は常にResult := CommConfig;にヒットします。、そのため、GetCommConfig は有効なコードを返しているので、何か不足しているに違いありません。

dcb レコードの長さを設定するなど、他にもさまざまなことを試しましたが、1200 ボーという同じ結果になりました。

誰かが私がどこで間違っているのか知っていますか?

4

2 に答える 2

3

間違った関数を使用していたことが判明しました。使用していたGetCommConfig ではなく、GetDefaultCommConfigを使用する必要がありました。

GetDefaultCommConfig は Windows からの設定を返し、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;
于 2009-07-14T10:17:42.840 に答える