數(shù)組越界真可怕,莫名就闖到了別人家
第一步,打開冰箱,即計(jì)算出該數(shù)據(jù)位的字節(jié)位置和位位置,如前所述,第n+1個(gè)數(shù)據(jù)位的字節(jié)位置為(n>>3),位位置為(n & 0x07),這是通過下面這個(gè)函數(shù)實(shí)現(xiàn)的,
本文引用地址:http://www.ex-cimer.com/article/201811/395096.htmvoid SetByteBitIdx(void)
{
uint16_t idx;
idx = Rf_bit_count;
Rf_rawbyte_idx = idx >> 3;
Rf_rawbit_idx = idx & 0x07;
Rf_bit_count++;
}
第二步,把數(shù)據(jù)位0或1這個(gè)‘大象’放到前面打開的‘冰箱’里,這是通過下面這個(gè)函數(shù)實(shí)現(xiàn)的。
void StoreRfBit (bool data)
{
SetByteBitIdx();
if(1 == data){
Rx_rawbit[Rf_rawbyte_idx] |= 1 << Rf_rawbit_idx;
}else{
Rx_rawbit[Rf_rawbyte_idx] &= ~(1 << Rf_rawbit_idx);
}
}
乍看下來,設(shè)計(jì)方案構(gòu)思縝密,程序代碼實(shí)現(xiàn)巧妙,設(shè)計(jì)和實(shí)現(xiàn)都堪稱天衣無縫。按下遙控器,射頻信號在空間汩汩流動(dòng),遙控接收板有序地把數(shù)據(jù)整齊碼好,踏著相同的節(jié)拍,大家一起嗨起來。
3
但是,理想是美好的,現(xiàn)實(shí)永遠(yuǎn)是骨感的。
小心翼翼地把代碼寫好,反復(fù)檢查了幾遍,水平有限,著實(shí)檢查不出來任何毛病,那就是騾子是馬,拉出來溜溜吧。結(jié)果,一通測試下來,興奮勁還沒過去,一頭冷水便照頭潑了下來。按了遙控鍵,十次中倒有個(gè)兩三次不好使,“永不消逝的電波”就好像泥牛入海,轉(zhuǎn)眼間便走散了消息,不見了蹤跡。
被風(fēng)撕碎的一片片白云在遼闊高遠(yuǎn)的天空中肆意飄蕩著,火紅的太陽炙烤著滾燙的大地。灑家背靠窗臺,一面感受著頑強(qiáng)得透過隔溫玻璃的陽光灑在脊背上的暖意,一邊在空調(diào)房中體味著心中的陣陣寒意。電波到底去哪兒了?
灑家搜索的目光在電腦屏幕上不斷游離,心中條分縷析,早把各行代碼都當(dāng)成了嫌疑,最后,目光定格在判斷接收到一幀完整的報(bào)文的語句那里:
if(Rf_bit_count >= RF_RAWBIT_LEN){
SetRfFrameComplete();
}
基本上,鑰匙每短按一次,就會(huì)發(fā)送三幀報(bào)文,既然遙控不好使,大抵可以確認(rèn)中間存在漏報(bào)文的情形,為了驗(yàn)證這種猜測,灑家加了一條測試語句:
if(Rf_bit_count >= RF_RAWBIT_LEN){
Rf_frame_times++;
SetRfFrameComplete();
}
顯然,短按一次,Rf_frame_times應(yīng)該為3,短按n次,Rf_frame_times應(yīng)該為(n*3)。
馬不停蹄地測試下來,果不其然,短按過十次后,Rf_frame_times的值不到30。難道是報(bào)文解析程序出了問題?
評論