美文网首页
ios获取蓝牙串口数据

ios获取蓝牙串口数据

作者: plu | 来源:发表于2016-12-28 14:47 被阅读350次

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

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

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

    相关文章

      网友评论

          本文标题:ios获取蓝牙串口数据

          本文链接:https://www.haomeiwen.com/subject/mjuyvttx.html