关于怎么打开串口,请参考 点击打开链接

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的数据帧的获取和初始解析相关推荐

  1. python向kafka发送json数据_python3实现从kafka获取数据,并解析为json格式,写入到mysql中...

    项目需求:将kafka解析来的日志获取到数据库的变更记录,按照订单的级别和订单明细级别写入数据库,一条订单的所有信息包括各种维度信息均保存在一条json中,写入mysql5.7中. 配置信息: [Gl ...

  2. pythonrequests解析_Python requests获取网页常用方法解析

    这篇文章主要介绍了Python requests获取网页常用方法解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 主要记录使用 requests ...

  3. 网络爬虫模拟登陆获取数据并解析实战(二)

    本文为原创博客,仅供学习使用.未经本人允许禁止复制下来,上传到百度文库等平台. 目录 分析要获取的数据 程序的结构 构建封装数据的model 模拟登陆程序并解析数据 结果展示 分析要获取的数据 下面继 ...

  4. python requests.get无法取出网页_Python requests获取网页常用方法解析

    这篇文章主要介绍了Python requests获取网页常用方法解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 主要记录使用 requests ...

  5. 获取并显示服务器数据,客户端获取服务器数据解析

    客户端获取服务器数据解析 内容精选 换一换 VR云渲游平台提供了设备的实时监控功能,您可以通过监控大屏,查看指定设备在云上运行时的实时监控数据.当设备处于"运行中"状态时,才可以查 ...

  6. SpringBoot获取Ip并解析地址,Docker部署 (ip2region.xdb)

    这里写自定义目录标题 SpringBoot获取Ip并解析地址,Docker部署 (ip2region.xdb) 流程 1. 引入依赖 2.获取IP工具类 3.解析IP地址工具类 SpringBoot获 ...

  7. python给pdf加图片签名_Python生成个性签名图片获取GUI过程解析

    这篇文章主要介绍了Python生成个性签名图片获取GUI过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 先来看看程序运行的样子: 所以,程序 ...

  8. Kettle+WebService+自动获取日期+xml解析并存入Oracle数据库

    于2022年3月8日优化,操作更简单 新文章地址,可互应参考https://blog.csdn.net/RatherI/article/details/123350552https://blog.cs ...

  9. FFMPEG之H264获取NALU并且解析其RBSP类型03

    FFMPEG之H264获取NALU并且解析其RBSP类型03 前言 FFMPEG之H264理论篇. 理论的就不多讲了,可以参考上面那篇文章,下面将给出两种版本,一种是我自己的,用C++方法实现,另一种 ...

  10. bos 获取数据库连接_java解析数据接口获取json对象

    最近小编在做项目的时候,需要解析一个url以获取其数据,开始我为简便,使用了Postman这个工具来解析,也获取了json对象. 但后也发现,它没法直接连接数据库,也就是说这些数据不能直接存入数据库, ...

最新文章

  1. 对FCKEditor = 2.6.4 通杀 exploit 的分析
  2. html5支持原生js,HTML5怎么学原生的js?让你对前端有了新的认识
  3. Python脚本打包成exe文件
  4. python脚本:判断字符是否为中文
  5. Fedora17下Firefox安装flashplayer
  6. Java集合里的一些“坑”
  7. android逆向工程dex2jar使用
  8. 深度操作系统20.2.2 发布(国产系统也可以安装安卓应用了)
  9. win10系统优化计算机,win10系统必做优化,让你的电脑告别卡顿,运行速度至少提升20%...
  10. 盘姬工具箱v1.10最新版 非常实用的工具箱软件
  11. win10开始菜单 此计算机,如何将win10电脑中的开始菜单设置成智能版
  12. 殷书数据结构5.8——堆
  13. 开机后显示服务器正在启动,电脑开机后卡在Windows正在启动界面上怎么办?
  14. 删除电脑上重复备份的图片
  15. 设计模式-七大原则(图解一目了然)
  16. 测试pok_如何使用PokémonGO的新评估系统计算您的Pokémon的精确IV
  17. 【民间文学论文】《苗族古歌》中的浪漫主义和物我互渗艺术思想(节选)
  18. 包装类详解(装箱(包)、拆箱(包)、Integer类型缓存)
  19. sublime下载安装教程
  20. AutoCAD2006激活方法

热门文章

  1. 常用贴片电阻、电容、电感封装
  2. StretchDIBits函数隐含的图像坐标系设置
  3. 组态软件及其应用方式
  4. win10 下 acdsee7 在普通账户下无法运行并崩溃的 BUG
  5. 时间序列平稳性的判断
  6. MCTS人工智能围棋
  7. 面试经历记录——东方海外OOCL上海软件开发中心实习生
  8. 县级智慧城市建设方案_智慧城市建设项目实施方案
  9. 元素出现>强调>再消失的动画制作【PPT动画】
  10. CDlinux如何制作U盘启动(附带Minidwep-gtk工具)