2

我必须通过串行端口进行通信。我现在正在尝试允许通过 2 个设备进行蓝牙通信,但无处可去。

我在设备上有一个应用程序(称为蓝牙资源管理器),它允许我进行串行通信,它将通过蓝牙发送,使用 Stonestreet One 堆栈以防您想知道:(

在设置中,我可以创建一个定义了 COM 端口的“服务”。

所以我然后尝试运行以下代码(我在一个设备上调用 Write 并在另一台设备上调用 Read)。BTExplorer 在执行时启动配对应用程序serialPort.Open()。在那里我选择了我想使用的“服务”(串行端口 1)。

但是serialPort.ReadLine()挂起并且永远不会返回。(我的意思是真的挂了。我必须热启动设备才能杀死我的应用程序。结束进程/终止进程不起作用。)

这是供参考的代码:

public void WriteSerial()
{
    SerialPort serialPort = new SerialPort("COM4");
    serialPort.Open();
    serialPort.WriteLine("Hello To The Other Side");
    serialPort.Close();
}

public void ReadSerial()
{
    SerialPort serialPort = new SerialPort("COM4");
    serialPort.Open();
    string output = serialPort.ReadLine();
    serialPort.Close();
    MessageBox.Show(output);
}

private void btnWrite_Click(object sender, EventArgs e)
{
    WriteSerial();
}

private void btnRead_Click(object sender, EventArgs e)
{
    ReadSerial();
}

如何让这个工作?

我正在使用带有 MC70 设备的 Windows Mobile 5。蓝牙堆栈是 Stonestreet One(可悲的是无法改变)。在 C# Compact Framework .NET 3.5 中开发

4

1 回答 1

5

API帮助说,

默认情况下,ReadLine 方法将阻塞,直到收到一行。如果不希望出现这种行为,请将 ReadTimeout 属性设置为任何非零值,以强制 ReadLine 方法在端口上没有可用行时抛出 TimeoutException。

...所以,如果你想避免它挂起,就这样做。

反正:

  • 你怎么知道这两个设备/端口相互连接(通过蓝牙)?
  • 您是否在调用 Open 方法之前设置SerialPort属性(例如等)?BaudRate
  • 您首先调用 theReadLine或 the 有什么不同WriteLine吗?与其做 open/write/close 和 open/read/close,不如做 open/open/read/write/close/close?
  • BytesToRead发送者调用后接收者属性返回什么WriteLine
  • 你有没有看过串口示例代码,它存在(根据Stonestreet One 蓝牙 SDK 常见问题解答

如果他们的 SDK 确实有示例程序,那么我建议您在更改示例程序和/或测试您自己的软件之前使用它(未更改)来验证您的测试设置(例如,验证您的设备是否正确连接) (使用您已经用他们的示例软件测试过的相同设备/测试设置)。

于 2009-10-07T22:38:58.150 回答