我必须通过串行端口进行通信。我现在正在尝试允许通过 2 个设备进行蓝牙通信,但一无所获。
我在设备上有一个应用程序(称为蓝牙浏览器),它允许我进行串行通信,并且如果您想知道的话,它将使用 Stonestreet One 堆栈通过蓝牙发送:(
在设置中,我可以创建一个定义了 COM 端口的“服务”。
然后我尝试运行以下代码(我在一个设备上调用 Write 并在另一设备上调用 Read)。执行 serialPort.Open()
时,BTExplorer 会启动配对应用程序。我选择要使用的“服务”(串行端口 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();
}
如何让它工作?
我正在使用 Windows Mobile 5 和 MC70 设备。蓝牙堆栈是 Stonestreet One(遗憾的是无法更改)。使用 C# Compact Framework .NET 3.5 进行开发
最佳答案
By default, the ReadLine method will block until a line is received. If this behavior is undesirable, set the ReadTimeout property to any non-zero value to force the ReadLine method to throw a TimeoutException if a line is not available on the port.
...所以,如果你想避免它挂起,就这样做。
无论如何:
- 您如何知道两个设备/端口已相互连接(通过蓝牙)?
- 在调用 Open 方法之前,您是否设置了
SerialPort
属性(例如BaudRate
等)? - 首先调用
ReadLine
还是WriteLine
有什么区别吗? 与其执行打开/写入/关闭和打开/读取/关闭操作,不如执行打开/打开/读取/写入/关闭/关闭操作如何? - 发送方调用
WriteLine
后,接收方BytesToRead
属性返回什么? - 您是否看过现有的串口示例代码(根据 Stonestreet One Bluetooth SDK FAQ )
如果他们的 SDK 确实有示例程序,那么我建议您在更改示例程序和/或测试之前使用它(未更改)来验证您的测试设置(例如验证您的设备是否正确连接)您自己的软件(使用您已经使用其示例软件测试过的相同设备/测试设置)。
关于c# - Windows Mobile - 串行端口通信,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1534552/