我再次告訴自己踢俄,下一份工作一定不能和硬件相關(guān)了咪橙。
現(xiàn)在有個(gè)需求:串口發(fā)送數(shù)據(jù)格式 , APP每隔一定時(shí)間發(fā)送一個(gè)數(shù)據(jù)包聂宾,每個(gè)包為8個(gè)字節(jié)果善,無回復(fù)命令。
BYTE[0] BYTE[1] BYTE[2] BYTE[3] BYTE[4] 不同數(shù)值代表不同的功能系谐,但最令我頭疼的就是第五個(gè)字節(jié)了BYTE[5] 巾陕,他每個(gè)位代表不一樣的功能 bit0 bit1 bit2 bit3 bit4 bit5 bit6 bit7 讨跟,每個(gè)bit位改變后該字節(jié)改變,同時(shí)發(fā)送的8個(gè)字節(jié)也跟著動(dòng)態(tài)改變鄙煤。
protocol.h
/**
* 串口發(fā)送數(shù)據(jù)格式
*
* @param result 要發(fā)過去的協(xié)議
* @param bitData 要更改的位的數(shù)值
* @param startIndex 開始下標(biāo)(0到7)
* @param endIndex 結(jié)束下標(biāo)(0到7)
*
* @return result
*/
+ (int)setupSendDataBitWithResult:(int)result BitData:(int)bitData startIndex:(int)startIndex endIndex:(int)endIndex;
protocol.m
/**
* 串口發(fā)送數(shù)據(jù)格式
*
* @param result 要發(fā)過去的協(xié)議
* @param bitData 要更改的位的數(shù)值
* @param startIndex 開始下標(biāo)(0到7)
* @param endIndex 結(jié)束下標(biāo)(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(@"輸入數(shù)值有誤:開始與結(jié)束下標(biāo)取值范圍0到7");
}
if (bitData >= 1 << (endIndex - startIndex + 1))
{
DLog(@"輸入數(shù)值有誤:bitData的大小不能超過的設(shè)置的位數(shù)所支持的最大數(shù)");
}
int unChangeHigh = result >> (endIndex + 1) << (endIndex + 1);//把后邊的位都清零
bitData = bitData << startIndex;
int unChangeLow = result & ((1 << startIndex) - 1);//把前邊的位清零(跟result做與操作晾匠,只保留后面的位)
result = unChangeHigh | bitData | unChangeLow;
return result;
}