Android串口开发与硬件利用1K Xmodem协议远程升级

本文介绍了如何在Android系统中进行串口开发,使用1K Xmodem协议进行远程固件升级。详细讲解了1K Xmodem协议的工作流程,包括轮询字符、数据包结构、传输过程中的错误处理机制。同时,提供了源码链接供读者参考。
摘要由CSDN通过智能技术生成

1.首先说明一下Android里面请单文件的权限

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

2.串口的设置

/**
 * 初始化设备列表
 */
private void initDevice() {

    SerialPortFinder serialPortFinder = new SerialPortFinder();

    // 设备
    mDevices = serialPortFinder.getAllDevicesPath();
    if (mDevices.length == 0) {
        mDevices = new String[] {
            getString(R.string.no_serial_device)
        };
    }
    // 波特率
    mBaudrates = getResources().getStringArray(baudrates);

    mDeviceIndex = PrefHelper.getDefault().getInt(PreferenceKeys.SERIAL_PORT_DEVICES, 0);
    mDeviceIndex = mDeviceIndex >= mDevices.length ? mDevices.length - 1 : mDeviceIndex;
    mBaudrateIndex = PrefHelper.getDefault().getInt(PreferenceKeys.BAUD_RATE, 0);

    mDevice = new Device("/dev/ttyS4", "115200");
}

2.数据的传输通讯

/**
 * 打开串口
 *
 * @param device
 * @return
 */
public SerialPort open(Device device) {
    return open(device.getPath(), device.getBaudrate());
}

/**
 * 打开串口
 *
 * @param devicePath
 * @param baudrateString
 * @return
 */
public SerialPort open(String devicePath, String baudrateString) {
    if (mSerialPort != null) {
        close();
    }

    try {
        File device = new File(devicePath);
        int baurate = Integer.parseInt(baudrateString);
        mSerialPort = new SerialPort(device, baurate, 0);

        mReadThread = new SerialReadThread(mSerialPort.getInputStream());
        mReadThread.start();

        mOutputStream = mSerialPort.getOutputStream();

        mWriteThread = new HandlerThread("write-thread");
        mWriteThread.start();
        mSendScheduler = AndroidSchedulers.from(mWriteThread.getLooper());

        return mSerialPort;
    } catch (Throwable tr) {
        LogPlus.e(TAG, "打开串口失败", tr);
        close();
        return null;
    }
}

/**
 * 关闭串口
 */
public void close() {
    if (mReadThread != null) {
        mReadThread.close();
    }
    if (mOutputStream != null) {
        try {
            mOutputStream.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    if (mWriteThread != null) {
        mWriteThread.quit();
    }

    if (mSerialPort != null) {
        mSerialPort.close();
        mSerialPort = null;
    }
}


/**
 * 发送数据
 *
 * @param datas
 * @return
 */
private void sendData(byte[] datas) throws Exception {
    Log.e("正常发送数据","//.///"+new String(datas));
    mOutputStream.write(datas);

}

/**
 * (rx包裹)发送数据
 *
 * @param datas
 * @return
 */
private Observable<Object> rxSendData(final byte[] datas) {

    return Observable.create(new ObservableOnSubscribe<Object>() {
        @Override
        public void subscribe(ObservableEmitter<Object> emitter) throws Exception {
            try {
     
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值