0

嗨,我需要找到串行端口的波特率和其他设置,在网上查看,看起来我应该使用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

串口的波特率和其他设置是在串口打开时设置的。我认为您正在阅读默认值。

于 2009-07-13T15:29:00.197 回答
3

事实证明我使用了错误的函数,我应该使用GetDefaultCommConfig而不是我正在使用的GetCommConfig

看一下,如果我错了,请纠正我,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 回答