【iOS】“位”级别的串口发送数据格式代码

我再次告诉自己,下一份工作一定不能和硬件相关了。

现在有个需求:串口发送数据格式 , APP每隔一定时间发送一个数据包,每个包为8个字节,无回复命令。

BYTE[0] BYTE[1] BYTE[2] BYTE[3] BYTE[4] 不同数值代表不同的功能,但最令我头疼的就是第五个字节了BYTE[5] ,他每个位代表不一样的功能 bit0 bit1 bit2 bit3 bit4 bit5 bit6 bit7 ,每个bit位改变后该字节改变,同时发送的8个字节也跟着动态改变。

protocol.h

/**
*  串口发送数据格式
*
*  @param result     要发过去的协议
*  @param bitData    要更改的位的数值
*  @param startIndex 开始下标(0到7)
*  @param endIndex   结束下标(0到7)
*
*  @return result
*/
+ (int)setupSendDataBitWithResult:(int)result BitData:(int)bitData startIndex:(int)startIndex endIndex:(int)endIndex;

protocol.m

/**
 *  串口发送数据格式
 *
 *  @param result     要发过去的协议
 *  @param bitData    要更改的位的数值
 *  @param startIndex 开始下标(0到7)
 *  @param endIndex   结束下标(0到7)
 *
 *  @return result
 */
+ (int)setupSendDataBitWithResult:(int)result BitData:(int)bitData startIndex:(int)startIndex endIndex:(int)endIndex
{
    
    if (startIndex > endIndex || startIndex < 0 || endIndex > 7)
    {
        DLog(@"输入数值有误:开始与结束下标取值范围0到7");
    }
    
    if (bitData >= 1 << (endIndex - startIndex + 1))
    {
        DLog(@"输入数值有误:bitData的大小不能超过的设置的位数所支持的最大数");
    }
    
    int unChangeHigh = result >> (endIndex + 1) << (endIndex + 1);//把后边的位都清零
    
    bitData = bitData << startIndex;
    
    int unChangeLow = result & ((1 << startIndex) - 1);//把前边的位清零(跟result做与操作,只保留后面的位)
    
    result = unChangeHigh | bitData | unChangeLow;
    
    return result;
}

你可能感兴趣的:(【iOS】“位”级别的串口发送数据格式代码)