我正在开发一个C#Windows窗体应用程序,通过蓝牙连接与Raspberry Pi Model 3进行通信。此连接通过客户端计算机上的虚拟串行端口进行模拟。我能够在C#程序中启动蓝牙连接,但我无法从程序中接收任何数据。当我使用Putty程序时,我可以看到数据在COM端口上以我希望的方式传输。
我还发现了一个奇怪的C#程序故障。如果我在Putty上打开COM端口然后启动C#程序,则port.open()命令将发生错误,因为端口是保留的。那么如果我关闭Putty并继续使用C#应用程序,数据将完美地传输到程序。有没有人遇到过这个问题?我现在已经有点亏了几天了。我的计划中的代码如下所示:
setcookie('Cookiename', sha1($_POST['keypass'].$salted));
更新:我刚刚发现声明我的蓝牙终端,客户端和设备正在干扰我的串口读取。由于蓝牙连接之前已经初始化,我能够在端口上看到数据。现在为什么要这样做?
答案 0 :(得分:0)
好吧,看来你没有做错什么。固有的.NET无法处理同一端口的多个所有权。当您声明SerialPort
实例并连接说... COM11 时...您已将 COM11 的所有权仅限于您的SerialPort
实例。为了能够访问 COM11 ,您现在需要提供对具有 COM11 所有权的特定SerialPort
对象的引用。
在您的情况下,您正在打开PuTTY,然后运行您的程序。一旦PuTTY获得对端口的访问权限,您的程序将无法执行此操作。这在.NET框架中是完全标准的。现在,还有其他方法可以获得对COM端口的多次访问,但我认为这不在本问题的范围之内。这是一个允许您同时运行应用程序并通过端口嗅探流量的软件...... Free Serial Port Monitor。你可以免费获得这个,并且有一个更好的购买版本,可以做各种魔术。
这是一个确保您的端口正确打开的小算法,您可能想要这个......稍微修改一下......并将其用作Connect
方法BluetoothClient
} class。
SerialPort port = null;
string error = string.Empty;
bool success = false;
int tries = 5;
foreach(var name in System.IO.Ports.SerialPort.GetPortNames())
{
// try each port until you find an open one
port.Name = name;
// there is always a chance that the port is open
// if trying some operations back-to-back
// give it a few extra tries if necessary
for (int i = tries; i > 0; --i)
{
try
{
// avoid the exception by testing if open first
if (!port.IsOpen)
{
port.Open();
success = true;
return;
}
}
catch (UnauthorizedAccessException e)
{
// sometimes the exception happens anyway, especially
// if you have multiple threads/processes banging on the
// ports
error += e.Message;
}
}
}
除了所有这些之外,您可能还希望观察到Bluetooth
类在您需要阅读时未声明对该端口的所有权。这可能是干扰阅读端口的原因。你真的应该创建一个单独的类并称之为BluetoothClient
或类似的东西,并让该单个类负责与SerialPort
引用的所有交互。这样,您可以确保是否要在端口上发送/接收,您将始终拥有所有权。