C# 可靠地读取蓝牙流 (InTheHand 32feet)
C# read bluetooth stream reliably (InTheHand 32feet)
我无法可靠地读取蓝牙流。
这是我第一次使用蓝牙连接。
该应用程序通过蓝牙模块与 Arduino 通信。
它会发送命令并得到响应。
例如,响应应如下所示:
100,200,300,400
这是我得到的:
1
如果我收到另一个回复(如果它看起来应该完全不同),我会收到之前请求的其余回复:
00,200,300,400
有时我什至得到一个空洞的回应。
这是我用来读取和写入流的代码:
void BluetoothClientConnectCallback(IAsyncResult result)
{
try
{
BluetoothClient client = (BluetoothClient)result.AsyncState;
client.EndConnect(result);
NetworkStream stream = client.GetStream();
stream.ReadTimeout = 1000;
_frm.printMsg("Connected!", false);
byte[] receive = new byte[1024];
while (true)
{
while (!ready) ;
if (stopConnection == true)
{
return;
}
try
{
stream.Write(message, 0, message.Length);
}
catch
{
_frm.printMsg("Error occurred while writing stream.", true);
}
try
{
if (Commands.awaitresponse == true)
{
Array.Clear(receive, 0, receive.Length);
readMessage = "";
do
{
stream.Read(receive, 0, receive.Length);
readMessage += Encoding.ASCII.GetString(receive);
}
while (stream.DataAvailable);
_frm.printMsg("Received: " + readMessage, false);
Commands.awaitresponse = false;
}
}
catch
{
_frm.printMsg("Error occurred while receiving stream.", true);
}
ready = false;
}
}
catch
{
_frm.printMsg("Error occurred while connecting.", true);
}
}
我研究了一段时间,但无法找到解决方案。
经过多次调试和测试,我自己找到了解决方案。
我在读取流之前添加了 1 秒的延迟 Thread.Sleep(1000);
。
所有包现在都正确显示为红色。
我无法可靠地读取蓝牙流。
这是我第一次使用蓝牙连接。
该应用程序通过蓝牙模块与 Arduino 通信。
它会发送命令并得到响应。
例如,响应应如下所示:
100,200,300,400
这是我得到的:
1
如果我收到另一个回复(如果它看起来应该完全不同),我会收到之前请求的其余回复:
00,200,300,400
有时我什至得到一个空洞的回应。
这是我用来读取和写入流的代码:
void BluetoothClientConnectCallback(IAsyncResult result)
{
try
{
BluetoothClient client = (BluetoothClient)result.AsyncState;
client.EndConnect(result);
NetworkStream stream = client.GetStream();
stream.ReadTimeout = 1000;
_frm.printMsg("Connected!", false);
byte[] receive = new byte[1024];
while (true)
{
while (!ready) ;
if (stopConnection == true)
{
return;
}
try
{
stream.Write(message, 0, message.Length);
}
catch
{
_frm.printMsg("Error occurred while writing stream.", true);
}
try
{
if (Commands.awaitresponse == true)
{
Array.Clear(receive, 0, receive.Length);
readMessage = "";
do
{
stream.Read(receive, 0, receive.Length);
readMessage += Encoding.ASCII.GetString(receive);
}
while (stream.DataAvailable);
_frm.printMsg("Received: " + readMessage, false);
Commands.awaitresponse = false;
}
}
catch
{
_frm.printMsg("Error occurred while receiving stream.", true);
}
ready = false;
}
}
catch
{
_frm.printMsg("Error occurred while connecting.", true);
}
}
我研究了一段时间,但无法找到解决方案。
经过多次调试和测试,我自己找到了解决方案。
我在读取流之前添加了 1 秒的延迟 Thread.Sleep(1000);
。
所有包现在都正确显示为红色。