我再次告诉自己,下一份工作一定不能和硬件相关了。
现在有个需求:串口发送数据格式 , 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;
}