Android 使用继承 CountDownTimer完整接收串口数据

    xiaoxiao2022-07-12  146

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

    可能你们也看出来了,这是单片机的思维,在下从单片机转初学安卓,如果这种方式不合适,恳请赐教。

    最新回复(0)