こんにちは、シリアル ポートのボー レートとその他の設定を見つける必要があります。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 ボーという同じ結果になりました。
誰かが私がどこで間違っているのか知っていますか?