天天看點

Android 使用繼承 CountDownTimer完整接收序列槽資料思路主要代碼

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 清零
                
            }
}
           

可能你們也看出來了,這是單片機的思維,在下從單片機轉初學安卓,如果這種方式不合适,懇請賜教。