无法从Xamarin.Android

时间:2017-07-30 13:25:13

标签: c# xamarin xamarin.android

我知道之前有人问过类似的问题,但我找不到任何对我有用的东西,所以我很绝望。

我从蓝牙接收了许多值,用逗号分隔,我收到它们作为字符串。它们可以是正十进制数或负十进制数。例如: 0,1.11,2.22,-3.33,-4.44,55.55,66.66,-77.77,8.88,0

然而,我无法提取所有数字。我已经尝试过Regex,我尝试过拆分和解析,我尝试过解析为十进制,双倍,但是我每次都得到Parse函数的未处理异常。

对于最终解决方案的任何帮助表示赞赏。

编辑: 这是我尝试解析的代码部分:

    public static void AddToGraphs(string list) {
    try
    {
        var data = list.Split(',').Select(x => double.Parse(x, NumberStyles.AllowDecimalPoint, CultureInfo.InvariantCulture));
        double[] dataArray = data.ToArray();
    }
    catch (Java.IO.IOException e)
    {
        Log.WriteLine(LogPriority.Error, e.Source, e.Message);
    }
}

这是应用程序崩溃时的调用堆栈:

        0xFFFFFFFFFFFFFFFF in 
    System.Diagnostics.Debugger.Mono_UnhandledException_internal    C#
            0x1 in System.Diagnostics.Debugger.Mono_UnhandledException  C#
            0x26 in object.6f90deee-2618-4e76-9135-3c21efb2de46 C#


    0x96 in System.Number.ParseDouble   C#
        0x3 in double.Parse C#
        0xE in double.Parse C#
        0x8 in Namespace.<>c.<AddToGraphs>b__38_0   C#
        0x26 in System.Linq.Enumerable.SelectArrayIterator<string,double>.ToArray  C#
        0x20 in System.Linq.Enumerable.ToArray<double>  C#
        0x37 in Namespace.Page3Fragment.AddToGraphs C#
        0x5A in Namespace.Page1Fragment.MyHandler.HandleMessage C#
        0x11 in Android.OS.Handler.n_HandleMessage_Landroid_os_Message_ C#
        0x17 in object.6f90deee-2618-4e76-9135-3c21efb2de46 C#

编辑: 这是logcat,带有&#39;列表&#39;变量记录,就在应用程序崩溃之前:

Time    Device Name Type    PID Tag Message
07-31 00:55:30.097  Samsung SM-G610F    Info    32398   Test    0
07-31 00:55:30.157  Samsung SM-G610F    Info    32398   Test    , 1.11, 2.

编辑: 这是将接收到的数据发送给处理程序的蓝牙服务:

byte[] buffer = new byte[8192];
int bytes;
while (true)
{
    bytes = ipStream.Read(buffer, 0, buffer.Length);
    try
    {
        myService.myHandler.ObtainMessage(Page1Fragment.DATA_READ, bytes, -1, buffer).SendToTarget();
    }
    catch (Java.IO.IOException e)
    {
        throw e;
    }
}

这是处理程序的片段,它接收并传递给AddToGraphs函数:

private class MyHandler : Handler
{
    Page1Fragment page1;
    public MyHandler(Page1Fragment _page1)
    {
        page1 = _page1;
    }
    public override void HandleMessage(Message msg) 
    {
        byte[] readBuf = (byte[])msg.Obj;
        string inData = Encoding.ASCII.GetString(readBuf, 0, msg.Arg1);
        Page3Fragment.AddToGraphs(inData);
    }
}

2 个答案:

答案 0 :(得分:2)

这应该可以解决问题:

<link href="{{ asset('css/bootstrap.min.css') }}" rel="stylesheet">

答案 1 :(得分:1)

解析real numbers时应该使用正确的文化。见thread

关于你的任务,我会这样做:

var numbers = "0, 1.11, 2.22, -3.33, -4.44, 55.55, 66.66, -77.77, 8.88, 0"
            .Split(new char [] { ',' }, StringSplitOptions.RemoveEmptyEntries)
            .Select(x => double.Parse(x, CultureInfo.InvariantCulture)).ToArray();

编辑:

事情就是这个消息不会一下子传出来。因此,您需要创建一个缓冲区来存储数据,直到您拥有整个消息。

此外,如果您事先不知道消息的长度,则应将其作为消息的一部分发送,例如前4个字节(Int32)。