笔记79 | CanBus升级程序指南

2018-08-25  本文已影响29人  项勇

最近有负责canbus程序项目,现在来总结一下 总的来说升级就是将数据发送给can盒子的一个过程,目前已经有调试好欣扑,比纳瑞,威驰,福嘉太四个公司的升级程序,总结来说就分以下几步:
0,扫描本地内存目录,找升级文件
1,进入RESET模式
2,校验一些数据密码等
3,发送数据
4,接受是否升级成功

0,扫描本地内存目录,找升级文件

为方便客户升级,我们定了将升级文件拷至U盘根目录,插到机器USB接口,点击我们的升级程序就可以进行升级

第一步就是要将升级文件找到

private void getUSBFilePath() {
        try {
            // 各个平台之间路径不一样
            if(files == null){
                files = new File("/storage").listFiles();
            }
            
            if(files == null || files.length ==0){
                files = new File("/mnt/usbhost").listFiles();
            }
            
            if(files == null || files.length ==0){
                files = new File("/mnt/storage").listFiles();
            }
            
            for (final File file : files) {
                String ss = file.getName();
                Log.i(TAG, "name:"+ss);
                boolean     isUsb = file.getName().startsWith("usb");
                boolean isStorage = file.getName().startsWith("Storage");
                if (file.canRead() && file.isDirectory() && isUsb) {
                    //满足该条件的文件夹就是u盘在手机上的目录 返回抽象路径名的绝对路径名字符串
                    path = file.getAbsolutePath();
                    Log.i(TAG, "usb升级文件路径:"+path);
                }
                if (file.canRead() && file.isDirectory() && isStorage) {
                    //满足该条件的文件夹就是u盘在手机上的目录 返回抽象路径名的绝对路径名字符串
                    path = file.getAbsolutePath();
                    Log.i(TAG, "storage升级文件路径:"+path);
                }
            }
            File[] fileUSB = new File(path).listFiles(new FileFilter() {
    
                @Override
                public boolean accept(File f) {
                    String n = f.getName();
                    if(n.endsWith(".hex") || n.endsWith(".UPDE") || n.endsWith(".iap") || n.endsWith(".bin")) {
                        return true;
                    }
                    return false;
                }
                
            });
            if(fileUSB != null) {
                for(File f : fileUSB) {
                    path = f.getAbsolutePath();
                     if(path.contains(".hex") && path.contains("BNR")){ //比纳瑞
                        Intent mIntent =  new Intent(this,BNRActivity.class);
                        mIntent.putExtra("PATH", path);
                        startActivity(mIntent);
                        finish();
                        return;
                    }else if(path.contains(".UPDE")){//欣扑
                        Intent mIntent =  new Intent(this,XPActivity.class);
                        mIntent.putExtra("PATH", path);
                        startActivity(mIntent);
                        finish();
                        return;
                    }else if(path.contains(".iap")){//威驰
                        Intent mIntent =  new Intent(this,WCActivity.class);
                        mIntent.putExtra("PATH", path);
                        startActivity(mIntent);
                        finish();
                        return;
                    }else if(path.contains(".bin")&& path.contains("FJT")){//FJT
                        Intent mIntent =  new Intent(this,JFTActivity.class);
                        mIntent.putExtra("PATH", path);
                        startActivity(mIntent);
                        finish();
                        return;
                    }
                }
            }else{
                Toast.makeText(CanUpdateMainActivity.this, getResources().getString(R.string.no_upgrade_files), Toast.LENGTH_SHORT).show();
                return;
            }
        } catch (Exception e) {
            Log.e(TAG, Log.getStackTraceString(e));
        }
    ```
不同的协议公司升级文件后缀不一样,`path.contains(".bin")`,有的升级文件由于担心后缀太常见容易混淆,我们甚至加上前缀判断 `path.contains("FJT")`,一切只为确保升级程序的指向精确,拿到相关路径后,进入不同的`Activity`

2,进入RESET模式
不同的车型进入的界面不同,除增加我们公司一些自带的通讯框架之外,逻辑基本相同,先显示从上个界面收到的路径内容:
`
private void getUSBFilePath() {
        try {

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

            path = (String) getIntent().getExtra("PATH", "");
            if(path != null && !path.equals("")){

                Log.i(TAG, path);

                File f = new File(path);
                fileByteLength = f.length();
                Log.i(TAG, "升级文件路径:"+path+"\n 文件字节大小:"+fileByteLength);
                ((TextView)findViewById(R.id.tv_file_path)).setText(getResources().getString(R.string.update_file_path)+path);

            }
        } catch (Exception e) {
            Log.e(TAG, Log.getStackTraceString(e));
        }
    }
`
这样做是方便顾客确认升级文件等信息,然后发送RESET指令:
`
mTWCS.ssWrite3(STATUS_OVER,0x00,0x00);
`
不同的协议公司,升级的指令不同,甚至发送的格式也不同,这样拿威驰的做示例
`STATUS_OVER`是一个全局变量,用于更新当前升级步骤

3,一般发生RESET指令后,机器会进入升级模式,有的协议公司需要在
上一篇下一篇

猜你喜欢

热点阅读