ios获取蓝牙串口数据

2016-12-28  本文已影响350人  plu

最近在项目中连接蓝牙设备,发现读取到的数据是这种格式

这些数据是空间位置坐标,也就是想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的数据了

最后附上截图,希望能帮到小伙伴

上一篇下一篇

猜你喜欢

热点阅读