在我的基于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作为要点。
答案 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));
}
}