最近有负责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指令后,机器会进入升级模式,有的协议公司需要在
网友评论