SerialPort を使用して、C# で要求応答通信モジュールを実行しようとしています。これは非常に単純な実装で、動作することを示すためのものです (SerialPort が適切に動作せず (USB 仮想 COM ポート)、いくつかの文字を消費することがあります。おそらく Windows ドライバーのバグです)。
ただし、デモは機能しません:-/
オブジェクトのプロパティを読み取るフォームでプロパティ グリッドを使用し、リモート デバイスからプロパティを読み取る要求を送信すると、非常に奇妙なことが起こります。
lock{} ブロックを使用して呼び出しをシーケンシャルにしようとしましたが、うまくいきません。ロックしても、複数の通話が保護エリアに入ります。
私が間違っていることを教えてください。
私のコード:
SerialPort sp;
public byte[] SendCommand(byte[] command)
{
//System.Threading.Thread.Sleep(100);
lock (sp)
{
Console.Out.WriteLine("ENTER");
try
{
string base64 = Convert.ToBase64String(command);
string request = String.Format("{0}{1}\r", target_UID, base64);
Console.Out.Write("Sending request... {0}", request);
sp.Write(request);
string response;
do
{
response = sp.ReadLine();
} while (response.Contains("QQ=="));
Console.Out.Write("Response is: {0}", response);
return Convert.FromBase64String(response.Substring(target_UID.Length));
}
catch (Exception e)
{
Console.WriteLine("ERROR!");
throw e;
}
finally
{
Console.Out.WriteLine("EXIT");
}
}
}
出力:
ENTER
Sending request... C02UgAABAA=
Response is: cgAABAAARwAAAA==
EXIT
ENTER
Sending request... C02UgQARwA=
ENTER
Sending request... C02UgAABAA=
Response is: gQARwAAPHhtbD48bWVzc2FnZT5IZWxsbyBYWDIhPC9tZXNzYWdlPjxkZXN0aW5haXRvbj5NaXNpPC9kZXN0aW5hdGlvbj48L3htbD4=
間に EXIT がない 2 つの ENTER-s に注意してください。そんなことがあるものか?