C#应用程序不会接收串行数据流

时间:2017-02-24 14:12:03

标签: c# bluetooth serial-port

我正在开发一个C#Windows窗体应用程序,通过蓝牙连接与Raspberry Pi Model 3进行通信。此连接通过客户端计算机上的虚拟串行端口进行模拟。我能够在C#程序中启动蓝牙连接,但我无法从程序中接收任何数据。当我使用Putty程序时,我可以看到数据在COM端口上以我希望的方式传输。

我还发现了一个奇怪的C#程序故障。如果我在Putty上打开COM端口然后启动C#程序,则port.open()命令将发生错误,因为端口是保留的。那么如果我关闭Putty并继续使用C#应用程序,数据将完美地传输到程序。有没有人遇到过这个问题?我现在已经有点亏了几天了。我的计划中的代码如下所示:

setcookie('Cookiename', sha1($_POST['keypass'].$salted));

更新:我刚刚发现声明我的蓝牙终端,客户端和设备正在干扰我的串口读取。由于蓝牙连接之前已经初始化,我能够在端口上看到数据。现在为什么要这样做?

1 个答案:

答案 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引用的所有交互。这样,您可以确保是否要在端口上发送/接收,您将始终拥有所有权。