我再次告訴自己,下一份工作一定不能和硬件相關了。
現在有個需求:串口發送數據格式 , 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;
}