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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值