美文网首页
笔记79 | CanBus升级程序指南

笔记79 | CanBus升级程序指南

作者: 项勇 | 来源:发表于2018-08-25 16:21 被阅读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指令后,机器会进入升级模式,有的协议公司需要在

    相关文章

      网友评论

          本文标题:笔记79 | CanBus升级程序指南

          本文链接:https://www.haomeiwen.com/subject/lzvwiftx.html