Android 使用繼承 CountDownTimer完整接收序列槽資料
- 思路
- 主要代碼
思路
在接收序列槽資料時啟動倒計時,由于資料時片段的,一幀資料會收到多次,每次收到資料都重新啟動倒計時,将收到的資料緩存入RxdData [100],并累加每次收到的位元組數 RxdTotal += size,倒計時結束或收到完整資料後将RxdTotal 清0。倒計時的作用是在接收不到完整資料時,丢次本幀資料。
主要代碼
import android.os.CountDownTimer;
public class MainActivity extends AppCompatActivity {
private short Counter;
private short RxdTotal = 0;
private byte[] RxdData = new byte[100];
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
class SerialWaitingTimer extends CountDownTimer {
public SerialWaitingTimer(long millisInFuture, long countDownInterval) {
super(millisInFuture, countDownInterval);
}
@Override
public void onTick(long millisUntilFinished) {
}
@Override
public void onFinish() {
///倒計時結束,判斷資料是否完成,否則丢棄,比如長度是否足夠,資料是否合法
RxdTotal = 0; //收到位元組數清零
}
}
final SerialWaitingTimer SerialTimer = new SerialWaitingTimer(200,200);//此處的值可根據實際設定
serialPortUtils.setOnDataReceiveListener(new SerialPortUtils.OnDataReceiveListener() {
@Override
public void onDataReceive(byte[] buffer, int size) {
if(RxdTotal == 0){ //收到第一幀,以下幾行可要可不要
SerialTimer.start();
for(Counter = 0;Counter < 100;Counter ++)
RxdData[Counter] = 0;
}
else{ ///重置倒計時,作用是每次收到資料都給下一段資料留出時間
if(SerialTimer != null){
SerialTimer.cancel();
}
SerialTimer.start();
}
if((RxdTotal + size)<100)
{
System.arraycopy(buffer,0,RxdData,RxdTotal,size);//将每次收到資料緩存如 RxdData
}
RxdTotal += size; //累加每次收到的位元組數
///可在此判斷長度是否足夠,及資料是否合法,如果完整,處理後,将 RxdTotal 清零
}
}
可能你們也看出來了,這是單片機的思維,在下從單片機轉初學安卓,如果這種方式不合适,懇請賜教。