c# - 蓝牙读取线程抛出异常
问题描述
我正在创建一个通过蓝牙 HC-05 模块与我的 Arduino Mega 2560 通信的应用程序。
我有一个在我的 2560 上编写的回声程序,它只是发送它接收到的任何内容,并且我已经用其他蓝牙程序测试了这个草图。
所以我现在的目标是编写一个 Xamarin Android 蓝牙应用程序,它将在我的平板电脑上运行,发送数据并读回。我正在创建一个服务,完成后我可以在我的真实应用程序中重用它。
该服务创建一个读取线程,如下所示:
ReadThread = new Thread(new ThreadStart(this.ReadData));
ReadThread.IsBackground = true;
ReadThread.Start();
这是 ReadData()
private void ReadData()
{
bool done = false;
const int bufferLength = 256;
byte[] data = new byte[bufferLength];
while (!done)
{
if (ServiceSocket == null)
{
ReadShutdown();
done = true;
} else if (ServiceSocket.InputStream.CanRead)
{
int dataLength = ServiceSocket.InputStream.Read(data, 0, bufferLength); // This is the line that errors
if (dataLength > 0)
{
PublishData(data);
}
Thread.Sleep(100);
}
}
}
当我运行我的应用程序时,在我发送数据之前,读取端没有任何反应,这是正确的。当我发送数据时,出现以下异常:
[mono-rt] [ERROR] FATAL UNHANDLED EXCEPTION: Java.IO.IOException: bt socket closed, read return: -1
[mono-rt] at Java.Interop.JniEnvironment+InstanceMethods.CallIntMethod (Java.Interop.JniObjectReference instance, Java.Interop.JniMethodInfo method, Java.Interop.JniArgumentValue* args) [0x0006e] in <24e422c426e0468ca1fd74b59870ff08>:0
[mono-rt] at Java.Interop.JniPeerMembers+JniInstanceMethods.InvokeVirtualInt32Method (System.String encodedMember, Java.Interop.IJavaPeerable self, Java.Interop.JniArgumentValue* parameters) [0x0002a] in <24e422c426e0468ca1fd74b59870ff08>:0
[mono-rt] at Java.IO.InputStream.Read (System.Byte[] b, System.Int32 off, System.Int32 len) [0x00048] in /Users/builder/azdo/_work/278/s/xamarin-android/src/Mono.Android/obj/Release/monoandroid10/android-30/mcw/Java.IO.InputStream.cs:269
[mono-rt] at Android.Runtime.InputStreamInvoker.Read (System.Byte[] buffer, System.Int32 offset, System.Int32 count) [0x00000] in /Users/builder/azdo/_work/278/s/xamarin-android/src/Mono.Android/Android.Runtime/InputStreamInvoker.cs:89
[mono-rt] at ArduinoSerial.AndroidBluetoothService.ReadData () [0x00040] in C:\Users\ThomH\source\repos\ArduinoSerial\ArduinoSerial\AndroidBluetoothService.cs:130
[mono-rt] at System.Threading.ThreadHelper.ThreadStart_Context (System.Object state) [0x00014] in /Users/builder/jenkins/workspace/archive-mono/2020-02/android/release/mcs/class/referencesource/mscorlib/system/threading/thread.cs:74
[mono-rt] at System.Threading.ExecutionContext.RunInternal (System.Threading.ExecutionContext executionContext, System.Threading.ContextCallback callback, System.Object state, System.Boolean preserveSyncCtx) [0x00071] in /Users/builder/jenkins/workspace/archive-mono/2020-02/android/release/mcs/class/referencesource/mscorlib/system/threading/executioncontext.cs:968
[mono-rt] at System.Threading.ExecutionContext.Run (System.Threading.ExecutionContext executionContext, System.Threading.ContextCallback callback, System.Object state, System.Boolean preserveSyncCtx) [0x00000] in /Users/builder/jenkins/workspace/archive-mono/2020-02/android/release/mcs/class/referencesource/mscorlib/system/threading/executioncontext.cs:910
[mono-rt] at System.Threading.ExecutionContext.Run (System.Threading.ExecutionContext executionContext, System.Threading.ContextCallback callback, System.Object state) [0x0002b] in /Users/builder/jenkins/workspace/archive-mono/2020-02/android/release/mcs/class/referencesource/mscorlib/system/threading/executioncontext.cs:899
[mono-rt] at System.Threading.ThreadHelper.ThreadStart () [0x00008] in /Users/builder/jenkins/workspace/archive-mono/2020-02/android/release/mcs/class/referencesource/mscorlib/system/threading/thread.cs:111
[mono-r07-06 12:15:09.059 E] at Android.Runtime.InputStreamInvoker.Read (Systt (15503): --- End of managed Java.IO.IOException stack trace ---
[mono-rt] java.io.IOException: bt socket closed, read return: -1
[mono-rt] at android.bluetooth.BluetoothSocket.read(BluetoothSocket.java:558)
[mono-rt] at android.bluetooth.BluetoothInputStream.read(BluetoothInputStream.java:88)
[mono-rt]
该行:
[mono-rt] at ArduinoSerial.AndroidBluetoothService.ReadData () [0x00040] in C:\Users\ThomH\source\repos\ArduinoSerial\ArduinoSerial\AndroidBluetoothService.cs:130
指向上面 ReadData 函数中的标记线。
有人可以告诉我该怎么做吗?
编辑:当我在 android/java 中做一些非常相似的事情时,它工作得很好......
解决方案
推荐阅读
- eclipse - 带有图标“m”和感叹号的Eclipse项目是什么意思?
- python - 将文件保存在 S3 子文件夹中
- php - 如何从图像路径中删除特定单词
- jquery-isotope - 使用 CSS 网格实现 metafizzy 同位素
- c# - 如何在没有 SetLeft 的情况下以编程方式更改图像位置?
- reactjs - 链接到不再渲染组件
- javascript - Same content on many different Websites
- objective-c - VLCKit无法在objective-c的可可编程中播放视频?
- mysql - Error in inserting comparison 'last modifed date' record between 2 tables into another table
- c - LuaSockets library will not correctly load