思路
在接收串口数据时启动倒计时,由于数据时片段的,一帧数据会收到多次,每次收到数据都重新启动倒计时,将收到的数据缓存入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 清零
}
}
可能你们也看出来了,这是单片机的思维,在下从单片机转初学安卓,如果这种方式不合适,恳请赐教。