我正在创建一个应用程序,通过蓝牙 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 中做一些非常相似的事情时,它完美地工作......