ios获取蓝牙串口数据
最近在项目中连接蓝牙设备,发现读取到的数据是这种格式
这些数据是空间位置坐标,也就是想x,y,z轴的数据,根据所给文档,A0 A0 0C是数据头,AE AE是数据尾,也就是中间的12个数字是想要的部分,我们可以在-(void) peripheral:(CBPeripheral *)peripheral didUpdateValueForCharacteristic:(CBCharacteristic *)characteristic error:(NSError *)error这个方法中读取到数据,但是怎么才能分别得到x,y,z轴的数据呢?
1.首先是截取中间部分的字符串
//切割字符串
NSRange startRange = [hexValue rangeOfString:@"0C "];
NSRange endRange = [hexValue rangeOfString:@" AE"];
NSRange range = NSMakeRange(startRange.location + startRange.length, endRange.location - startRange.location - startRange.length);
NSString *result = [hexValue substringWithRange:range];
2.将16进制的字符串转化为NSNumber类型
NSMutableArray *coordinateArr = [NSMutableArray array];
NSArray *array = [result componentsSeparatedByString:@" "]; //从字符A中分隔成2个元素的数组
for (NSString *str in array) {
NSString *newStr = [NSString stringWithFormat:@"0x%@",str];
unsigned long red = strtoul([newStr UTF8String],0,16);
NSNumber *number = [NSNumber numberWithLong:red];
[coordinateArr addObject:number];
}
3.判断自己这端是什么模式(分为大端模式和小端模式),这个是c的方法判断的
short int a = 0x1122;//十六进制,一个数值占4位
char b = *(char *)&a; //通过将short(2字节)强制类型转换成char单字节,b指向a的起始字节(低字节)
if( b == 0x11)//低字节存的是数据的高字节数据
{
NSLog(@"是大端模式");
}
else
{
NSLog(@"是小端模式");
}
4.再根据union联合体去获取到坐标轴数据:
union {
float a;
char b[4];
}packet;
float position[3];
for(int i = 0; i < 3; i++)//此段是小端模式,若为大端,则数组顺序恰好相反
{
packet.b[0]=arr[4*i ;
packet.b[1]=arr[4*i+1];
packet.b[2]=arr[4*i+2];
packet.b[3]=arr[4*i+3] ;
position[i]=packet.a;
}
则position[0]),position[1]),position[2])分别就是x,y,z的数据了
最后附上截图,希望能帮到小伙伴