首页 > 解决方案 > 蓝牙读取线程抛出异常

问题描述

我正在创建一个通过蓝牙 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 中做一些非常相似的事情时,它工作得很好......

标签: c#androidxamarinxamarin.androidbluetooth

解决方案


推荐阅读