不是null的字节数组正在抛出System.NullReferenceException?

时间:2015-11-02 10:54:26

标签: c# bluetooth

在我的基于C#Xamarin的移动应用程序中,我通过蓝牙链接收到一些数据。然后我打电话给DecodeHeartRateCharacteristicValue (Characteristic.Value)。您可以在下面看到此例程。

但是,其中的第一行if会引发以下错误:

  

System.NullReferenceException:未将对象引用设置为对象的实例
    at Gas_Sense.HomePage.DecodeHeartRateCharacteristicValue(System.Byte [] data)[0x00003]

我试着把这一行:

Debug.WriteLineIf (data[0]!=null, data [0].ToString());

在要调试的例程中,但它会发出警告,表示data[0]!=null将始终返回true。但是,当我尝试将characteristic.value的值打印到屏幕时,它是空白的(但它不等于null)。

所以这可能是我的印刷筛选错误的值类型等错误。

此代码基于经过测试且有效的sample,在我更改与之通信的BLE服务之前,该代码正在运行。因此,收到的数据格式可能会有所不同,但在这种情况下,调试它并计算出它想要的格式可能会更容易。

string DecodeHeartRateCharacteristicValue(byte[] data) {
    if (data == null || data.Length < 2)
        return null;

    ushort bpm = 0;
    if ((data [0] & 0x01) == 0) {
        bpm = data [1];
    } else {
        bpm = (ushort)data [1];
        bpm = (ushort)(((bpm >> 8) & 0xFF) | ((bpm << 8) & 0xFF00));
    }
}

我正在使用Xamarin的Monkey.Robotics模块。我尝试输出两个不同的characteristic属性。 Char.Value.ToString()System.Byte[]输出到屏幕。 Char.StringValue什么都不打印。不确定这说明数据的类型以及可能导致此错误的原因?

我收到了这个输出

  

2015-11-05 12:02:13.721 ProjectiOS [365:143055] System.Byte []

     

2015-11-05 12:02:13.798 ProjectiOS [365:143055]更新百分比

     

2015-11-05 12:02:13.805 ProjectiOS [365:143055]更新替换

     

2015-11-05 12:02:13.810 ProjectiOS [365:143055] System.Byte []

     

2015-11-05 12:02:13.819 ProjectiOS [365:143055]更新百分比

     

2015-11-05 12:02:13.826 ProjectiOS [365:143055]更新替换

从这段代码调用上面的Decode函数:

    Debug.WriteLineIf(PercentageCharacteristic.CanUpdate, "CanUpdate");
    if (PercentageCharacteristic!=null && PercentageCharacteristic.CanUpdate) {
        PercentageCharacteristic.ValueUpdated += (s, ess) => {
            Debug.WriteLine (PercentageCharacteristic.Value.ToString());
            PercentageFill.Text = DecodeHeartRateCharacteristicValue (PercentageCharacteristic.Value);
            Debug.WriteLine("Update Percentage");
    };
    PercentageCharacteristic.StartUpdates();
    TimeCharacteristic.StartUpdates();

    }

    if (ReplacementDueCharacteristic!=null && ReplacementDueCharacteristic.CanUpdate) {
        PercentageCharacteristic.ValueUpdated += (s, ess) => {
            ReplacementDue.Text = DecodeHeartRateCharacteristicValue (ReplacementDueCharacteristic.Value);
            Debug.WriteLine("Update Replacement");
    };
    ReplacementDueCharacteristic.StartUpdates();
    }

所以代码在遇到问题之前似乎已经运行了两次?这仍然发生在以下答案的反馈中。或者条件在每个循环中显然都是活动的,但我每次都可以添加长度检查?任何想法都非常赞赏。

完整错误跟踪是here作为要点。

1 个答案:

答案 0 :(得分:0)

使用data[0]检查数组中的第一个字节,由于byte是基本类型,因此它不能是null

您必须检查data null。由于您使用data.Length > 1,我还会对data[1]进行检查(这会阻止ArgumentException

string DecodeHeartRateCharacteristicValue(byte[] data) {
    if (data == null || data.Length < 2)
        return null;

    ushort bpm = 0;
    if ((data [0] & 0x01) == 0) {
        bpm = data [1];
    } else {
        bpm = (ushort)data [1];
        bpm = (ushort)(((bpm >> 8) & 0xFF) | ((bpm << 8) & 0xFF00));
    }
}