我正在尝试使用 SerialPort 在 c# 中执行请求-响应通信模块。这是一个非常简单的实现,只是为了证明它有点工作(SerialPort 不能正常工作(它是一个 USB 虚拟 COM 端口),有时会吃几个字符,可能是一些 Windows 驱动程序错误)。
但是演示不起作用:-/
当在表单上使用 propertygrid 时,它读取对象的属性,然后发送从远程设备读取属性的请求,会发生非常奇怪的事情:一次同时调用多个 SendCommand。
我尝试使用 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=
注意到两个 ENTER-s,它们之间没有 EXIT 吗?这怎么可能?