我必须通过串口进行通信。我现在正尝试通过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进行开发
答案 0 :(得分:5)
默认情况下,ReadLine方法会 阻止直到收到一行。如果 这种行为是不可取的,设置了 ReadTimeout属性为任何非零值 强制ReadLine方法的值 如果一行是抛出一个TimeoutException 在港口没有。
...所以,如果你想避免它挂起,那就去做吧。
反正:
SerialPort
属性(例如BaudRate
等)?ReadLine
还是WriteLine
?
而不是打开/写入/关闭和打开/读取/关闭,而不是做开放/打开/读取/写入/关闭/关闭?BytesToRead
后,接收者WriteLine
属性返回了什么?如果他们的SDK确实有示例程序,那么我建议您在更改示例程序之前和/或测试之前使用它(未更改)来验证您的测试设置(例如,验证您的设备是否正确连接)您自己的软件(使用您已使用其示例软件测试过的相同设备/测试设置)。