Android 串口数据处理

private void getSerialPort() {        if (mReceiveThread == null) {            mReceiveThread = new ReceiveThread();        }        mReceiveThread.start();    }    //开始处理数据    private void startDecodeData() {        new Thread(new Runnable() {            @Override            public void run() {                while (true) {                    if (mIsAnalyticalData) {                        //解析数据                        decodeData();                        mIsAnalyticalData = !mIsAnalyticalData;                    }                }            }        }).start();    }    //解析数据    private void decodeData() {        if (mIsHaveLeft) {            //添加数据 剩下的数据后移            for (int i = mBufferDataLength - 1; i >= 0; i--) {                mBuffer[i + mLeftLength] = mBuffer[i];            }            for (int i = 0; i < mLeftLength; i++) {                mBuffer[i] = mLeftBuffer[i];            }            mBufferDataLength += mLeftLength;            mIsHaveLeft = !mIsHaveLeft;            mLeftLength = 0;        }        String[] HexArr = DataUtils.ByteArr2HexArr(mBuffer, 0, mBufferDataLength);        int endIndex = 0;        for (int i = 0; i < HexArr.length; i++) {            if ((i < HexArr.length)                    && (i + 1 < HexArr.length)                    && (i + Integer.valueOf(HexArr[i + 1], 16) < HexArr.length)                    && (i + 1 + Integer.valueOf(HexArr[i + 1], 16) < HexArr.length)                    && HexArr[i].equals("5A") && HexArr[i + Integer.valueOf(HexArr[i + 1], 16)].equals("0D")                    && HexArr[i + 1 + Integer.valueOf(HexArr[i + 1], 16)].equals("0A")) {                endIndex = i + 1 + Integer.valueOf(HexArr[i + 1], 16);                StringBuffer stringBuffer = new StringBuffer();                for (int j = i + 4, k = 0; k < ((Integer.valueOf(HexArr[i + 1], 16)) - 4); j++, k++) {                    stringBuffer.append(HexArr[j]);                }                DataBean dataBean = new DataBean(HexArr[i + 2], HexArr[i + 3], stringBuffer.toString());                decodeDataBean(dataBean);                i += Integer.valueOf(HexArr[i + 1], 16) + 1;            }        }        //有剩余的数据        if (endIndex != mBufferDataLength - 1) {            int j = 0;            for (int i = endIndex + 1; i < mBufferDataLength; i++, j++) {                mLeftBuffer[j] = mBuffer[i];            }            mLeftLength = j;            mIsHaveLeft = true;        }    }    //接收串口数据的线程    private class ReceiveThread extends Thread {        @Override        public void run() {            super.run();            //条件判断,只要条件为true,则一直执行这个线程            while (isStart) {                if (inputStream == null) {                    return;                }                byte[] readData = new byte[8192];                try {                    int size = inputStream.read(readData);                    if (size > 0) {                        String readString = DataUtils.ByteArrToHex(readData, 0, size);                        for (int i = 0, j = mTempBufferStartPosition; i < size; i++, j++) {                            mTempBuffer[j] = readData[i];                        }                        mTempBufferStartPosition += size;                        mTempAddCount++;                        //Log.e("LOG_TAG", "" + mTempAddCount);                        if (mTempAddCount >= mReceiveMinAmount && (!mIsAnalyticalData)) {                            //可以将临时缓冲区的数据copy到处理缓冲区                            for (int i = 0; i < mTempBufferStartPosition; i++) {                                mBuffer[i] = mTempBuffer[i];                            }                            mBufferDataLength = mTempBufferStartPosition;                            mIsAnalyticalData = !mIsAnalyticalData;                            //各种counter归零                            mTempAddCount = 0;                            mTempBufferStartPosition = 0;                        }                    }                } catch (IOException e) {                    e.printStackTrace();                }            }        }    }

更多相关文章

  1. Android 数据存储与读取:文件
  2. Android 关于 如何使用外界导入的数据库文件
  3. Android 打造任意层级树形控件 考验你的数据结构和设计
  4. Android - 利用Android studio + Android Killer工具在手机未ROO
  5. 曝Android机冷冻后变"傻" 加密数据随意访问
  6. Android入门篇二:使用意图在Activity之间传递数据
  7. Android使用JNI实现Java与C之间传递数据

随机推荐

  1. Android应用程序资源——Animation动画资
  2. Android.mk——makefile分析
  3. Android中invalidate()和postInvalidate(
  4. QQ音乐Android客户端Web页面通用性能优化
  5. 【Android】自定义FlowLayout,支持多种布
  6. Android中水波纹使用之自定义视图实现
  7. Android(安卓)studio 单元测试初探
  8. 初学Android,使用自定义的XML资源(十八)
  9. 基于ARM Cortex-A8和Android 4.x的联动报
  10. Android进程管理及静态变量垃圾回收