CanBus的数据帧的获取和初始解析
关于怎么打开串口,请参考 点击打开链接
1,开线程监听串口数据
package com.android.server;import android.util.Log;
import java.io.File;public class ProcessCanBusThread extends Thread{private static final String TAG = "ProcessCanBusThread";private boolean flag = false;ICanBusDataCallBack mICanBusDataCallBack; //数据上报应用层的interfacepublic ProcessCanBusThread(ICanBusDataCallBack mICanBusDataCallBack){this.mICanBusDataCallBack = mICanBusDataCallBack;this.start();}@Overridepublic void run() {super.run();while (!isInterrupted()) {byte[] result = SystemParse.readCanBus();//数据过多,可以适当延时if(result!=null){if(null != mICanBusDataCallBack){mICanBusDataCallBack.processReceiveBusData(result ,result.length);//数据上报}}}}
}
2,跟踪readCanBus方法
private static byte[] g_mcucom_bakdata = new byte[256];private static int g_cancom_baklen;private static byte[] g_cancom_bakdata = new byte[256];public static boolean flag;public static byte[] readCanBus(){int size = 0;byte[] buffer = new byte[1024];if(mCanInputStream!=null){try {size = mCanInputStream.read(buffer);if (size > 0) {if(g_cancom_baklen>0){size += g_cancom_baklen; byte[] tempbuffer = new byte[size];for(int i=0;i<g_cancom_baklen;i++){tempbuffer[i] = g_cancom_bakdata[i];}for(int i=g_cancom_baklen;i<size;i++){tempbuffer[i] = buffer[i-g_cancom_baklen];}g_cancom_baklen = 0;return onCanDataReceived(tempbuffer, size);}else{return onCanDataReceived(buffer, size);}}} catch (IOException e) {e.printStackTrace();}}else{Log.e(TAG, "=====the canbus port is error====");}return null;}
3,跟踪onCanDataReceived方法
// 2E 21 02 Data0 Data1 DataN CheckSum//HeadCode DataType Length Data0 Data1 DataN CheckSum//Length =Data0+ Data1+ DataN//ChechSum =(DataType+ Length+ Data0+ Data1+ DataN)^0xFFprivate static byte[] onCanDataReceived(final byte[] buffer ,final int size){byte[] datacheck = new byte[4];int starti;for(int i=0;i<size;i++){datacheck[0] = buffer[i];starti = i; if(datacheck[0]==(byte)0x2e){i++;if(i>=size){for(int k=starti;k<size;k++){g_cancom_bakdata[k-starti] = buffer[k];g_cancom_baklen++;}return null;}if(i>=size-1){for(int k=starti;k<size;k++){g_cancom_bakdata[k-starti] = buffer[k];g_cancom_baklen++;}return null;}datacheck[1] = buffer[i+1];//lenif(datacheck[1]>0){if((starti+datacheck[1]+4)<=size){//i++;byte[] tempdata = new byte[datacheck[1]+2];for(int j=0;j<(datacheck[1]+2);j++){tempdata[j] = buffer[i++];datacheck[2] += (byte) tempdata[j]; }datacheck[2] ^= 0xFF;if(datacheck[2]==buffer[i]){g_cancom_baklen = 0;response((int)0xff);//给canbus回0xff表示该帧数据正确return tempdata;}else{}}else{for(int k=starti;k<size;k++){g_cancom_bakdata[k-starti] = buffer[k];g_cancom_baklen++;}}}}}return null;}
public static void response(int hex){if (mOutputStream != null){try{mCanOutputStream.write(hex);} catch (IOException e) {Log.e(TAG, "SendCanCommand IOException occurred: " + e);}}}
到这里,基本上canbus发过来的每帧数据都能接收到,现在就是上报到应用层,通过ICanBusDataCallBack
Android系统中services中的数据怎么通过jni或者外部提供的接口(Manger class)上报的,这里就不过多解释了。
下面看应用层收到数据后的处理(譬如空调的显示,车门信息,车辆状态等)
请先下载该apk 点击打开链接(关于数据解析apk)
找到CanBusService.java类
package com.md.zcanbus.stack;import android.app.Service;
import android.commcu.CanComDataPtr;
import android.commcu.McuSerialManager;
import android.content.Intent;
import android.os.Handler;
import android.os.IBinder;
import android.os.Message;
import android.os.RemoteCallbackList;
import android.os.RemoteException;
import android.util.Log;import com.md.CUtils;
import com.md.CanBusImpl;
import com.md.source.SystemFreq;
import com.md.source.SystemModel;
import com.md.source.SystemTime;
import com.md.source.SystemVox;
/*** modify 20170503 for CanBus* @author md*/
public class CanBusService extends Service {private static McuSerialManager gMCM = McuSerialManager.getInstance();private static RemoteCallbackList<ICanBusService> callbacks;private ICanBusService cb;public static CanBusService reference = new CanBusService();public CanBusService() {}public static CanBusService getReference(){synchronized (reference) {if(reference==null){reference = new CanBusService();}}return reference;}public void registerCallback(ICanBusService canllImpl) {callbacks = new RemoteCallbackList<ICanBusService>();if(callbacks!=null) callbacks.register(canllImpl);Log.d("md", "registerCallback :"+ callbacks);}public void unregisterCallback() {if(callbacks!=null && cb!=null) callbacks.unregister(cb);}@Overridepublic void onDestroy() {unregisterCallback();super.onDestroy();}public void requestCanData(){CUtils.init();gMCM.sendCanBusMultiData(0x90, (byte)0x24);gMCM.sendCanBusMultiData(0x90, (byte)0x41);}@Overridepublic IBinder onBind(Intent intent) {return null;}@Overridepublic void onCreate() {super.onCreate();}@Overridepublic int onStartCommand(Intent intent, int flags, int startId) {
// CanBusService busService = CanBusService.getReference();registerCallback(CanBusImpl.getInstance().getCallBack(getApplicationContext()));onActionListener();requestCanData();return super.onStartCommand(intent, flags, startId);}public void onActionListener(){if(null==gMCM){gMCM = McuSerialManager.getInstance();}gMCM.setCanbusDataListener(onActionListener,1);}McuSerialManager.CanbusDataListener onActionListener = new McuSerialManager.CanbusDataListener() {@Overridepublic int onAction(int arg0, byte[] arg1) {Message message = new Message();message.what = arg0;message.obj = arg1;handler.sendMessage(message);return 0;}};Handler handler = new Handler(){@Overridepublic void handleMessage(Message msg) {int ptr = msg.what;byte[] result = (byte[]) msg.obj;if(callbacks!=null) {int i = callbacks.beginBroadcast();while(i > 0){i--;cb = callbacks.getBroadcastItem(i);}}try {switch (ptr) {case CanComDataPtr.CANBUS_PTR_0X00:Config.bs00 = bytes(result, Config.bs00);if(cb!=null) cb.notify_CANBUS_PTR_0X00();break;case CanComDataPtr.CANBUS_PTR_0X01:Config.bs01 = bytes(result, Config.bs01);if(cb!=null) cb.notify_CANBUS_PTR_0X01();break;case CanComDataPtr.CANBUS_PTR_0X02:Config.bs02 = bytes(result, Config.bs02);if(cb!=null) cb.notify_CANBUS_PTR_0X02();break;..代码过多省略.break;default:break;}} catch (RemoteException e) {e.printStackTrace();}if(callbacks!=null) callbacks.finishBroadcast();}};private void startDelay(){Log.d("md", "==startDelay==");Thread thread =new Thread(new Runnable() {@Overridepublic void run() {try {Thread.sleep(100);} catch (InterruptedException e) {e.printStackTrace();}requestCanData();}});try {thread.start();} catch (Exception e) {e.printStackTrace();}}public byte[] bytes(byte[] bs,byte[] result){result = new byte[bs.length-2];for (int i = 2; i < bs.length; i++) {result[i-2] = bs[i];}return result;}
}
其中重要的是handler,handler中message包含canbus给过来的每一帧数据,ptr是该帧的data[0],自己在services那层处理好
McuSerialManager.CanbusDataListener的public int onAction(int ptr, byte[] others)
到此,数据就获取完全
详情如下
里面的详细方法说明就略过了。
资料下载点击打开链接
备注: 以上的串口通信可以直接写在apk中,不用在services层处理,也可以根据自己的实际情况,如果services层用到CanBus中的数据,最好写在services层,方便全局控制。
更详细的demo,后续有需要的话,再传上来。
希望能帮到各位。。。
CanBus的数据帧的获取和初始解析相关推荐
- python向kafka发送json数据_python3实现从kafka获取数据,并解析为json格式,写入到mysql中...
项目需求:将kafka解析来的日志获取到数据库的变更记录,按照订单的级别和订单明细级别写入数据库,一条订单的所有信息包括各种维度信息均保存在一条json中,写入mysql5.7中. 配置信息: [Gl ...
- pythonrequests解析_Python requests获取网页常用方法解析
这篇文章主要介绍了Python requests获取网页常用方法解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 主要记录使用 requests ...
- 网络爬虫模拟登陆获取数据并解析实战(二)
本文为原创博客,仅供学习使用.未经本人允许禁止复制下来,上传到百度文库等平台. 目录 分析要获取的数据 程序的结构 构建封装数据的model 模拟登陆程序并解析数据 结果展示 分析要获取的数据 下面继 ...
- python requests.get无法取出网页_Python requests获取网页常用方法解析
这篇文章主要介绍了Python requests获取网页常用方法解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 主要记录使用 requests ...
- 获取并显示服务器数据,客户端获取服务器数据解析
客户端获取服务器数据解析 内容精选 换一换 VR云渲游平台提供了设备的实时监控功能,您可以通过监控大屏,查看指定设备在云上运行时的实时监控数据.当设备处于"运行中"状态时,才可以查 ...
- SpringBoot获取Ip并解析地址,Docker部署 (ip2region.xdb)
这里写自定义目录标题 SpringBoot获取Ip并解析地址,Docker部署 (ip2region.xdb) 流程 1. 引入依赖 2.获取IP工具类 3.解析IP地址工具类 SpringBoot获 ...
- python给pdf加图片签名_Python生成个性签名图片获取GUI过程解析
这篇文章主要介绍了Python生成个性签名图片获取GUI过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 先来看看程序运行的样子: 所以,程序 ...
- Kettle+WebService+自动获取日期+xml解析并存入Oracle数据库
于2022年3月8日优化,操作更简单 新文章地址,可互应参考https://blog.csdn.net/RatherI/article/details/123350552https://blog.cs ...
- FFMPEG之H264获取NALU并且解析其RBSP类型03
FFMPEG之H264获取NALU并且解析其RBSP类型03 前言 FFMPEG之H264理论篇. 理论的就不多讲了,可以参考上面那篇文章,下面将给出两种版本,一种是我自己的,用C++方法实现,另一种 ...
- bos 获取数据库连接_java解析数据接口获取json对象
最近小编在做项目的时候,需要解析一个url以获取其数据,开始我为简便,使用了Postman这个工具来解析,也获取了json对象. 但后也发现,它没法直接连接数据库,也就是说这些数据不能直接存入数据库, ...
最新文章
- 对FCKEditor = 2.6.4 通杀 exploit 的分析
- html5支持原生js,HTML5怎么学原生的js?让你对前端有了新的认识
- Python脚本打包成exe文件
- python脚本:判断字符是否为中文
- Fedora17下Firefox安装flashplayer
- Java集合里的一些“坑”
- android逆向工程dex2jar使用
- 深度操作系统20.2.2 发布(国产系统也可以安装安卓应用了)
- win10系统优化计算机,win10系统必做优化,让你的电脑告别卡顿,运行速度至少提升20%...
- 盘姬工具箱v1.10最新版 非常实用的工具箱软件
- win10开始菜单 此计算机,如何将win10电脑中的开始菜单设置成智能版
- 殷书数据结构5.8——堆
- 开机后显示服务器正在启动,电脑开机后卡在Windows正在启动界面上怎么办?
- 删除电脑上重复备份的图片
- 设计模式-七大原则(图解一目了然)
- 测试pok_如何使用PokémonGO的新评估系统计算您的Pokémon的精确IV
- 【民间文学论文】《苗族古歌》中的浪漫主义和物我互渗艺术思想(节选)
- 包装类详解(装箱(包)、拆箱(包)、Integer类型缓存)
- sublime下载安装教程
- AutoCAD2006激活方法