使用蓝牙在Android应用程序中解析ELM-327设备数据?

时间:2014-01-02 06:44:21

标签: android c bluetooth android-ui

我正在开发一个从ELM-327 OBD设备接收数据的Android应用程序。并解析它                        有两种方法可以从ELM-327接收数据: -                    1)使用扫描工具服务                    2)使用ATMA命令。

这是扫描工具服务的代码。

                 public void parser(String msg) 
                 {
                  Parameter parameter= new Parameter();
              String [] strdata=null;
              String init="18 DA F1 10 03 41 1F";
                String erpm="0C";
                        String vspeed="0D";
                      int rpm=0;
                       int speed=0;
                      String init_frm_msg=null;
                      int length=9;
               if(msg!=null)
                       {
                    strdata=msg.split(" ");
                        if(length<8)
                    {
               for(int i=0;i<length;i++){
                if(strdata[i]!=null)
                strdata[i]="00";

            }
        }
        init_frm_msg=strdata[0]+strdata[1]+strdata[2]+strdata[3]+strdata[4]+strdata[5];
        Toast.makeText(getApplicationContext(), init_frm_msg, Toast.LENGTH_SHORT).show();
        if(init.equals(init_frm_msg)){
            if(strdata[6].equals(erpm)){
                rpm = Integer.parseInt(strdata[7]+strdata[8],16);
                Toast.makeText(getApplicationContext(), rpm, Toast.LENGTH_SHORT).show();
                parameter.setRpm(rpm);
                mGaugeView1.setTargetValue(rpm);
            }
            if(strdata[7].equals(vspeed)){
                speed = Integer.parseInt(strdata[7]+strdata[8],16);
                Toast.makeText(getApplicationContext(), speed, Toast.LENGTH_SHORT).show();
                parameter.setSpeed(speed);
                mGaugeView2.setTargetValue(rpm);
            }
        }
        else
        {

        }
    }
    Toast.makeText(getApplicationContext(), msg + "   ", Toast.LENGTH_SHORT)
            .show();
}

            Here is the code which communicated with the device:-
            protected void onResume() {
                  // TODO Auto-generated method stub
    super.onResume();
    if (D)
        Log.e(TAG, "+ ON RESUME +");
    final String init = "ATI";
    final String init2 = "ATS1";
    final String init3 = "ATH1";
    final String init4 = "ATAL";
    final String cmd_erpm = "010C";
    final String cmd_vspeed = "010D";
    runnable = new Runnable() {
        @Override
        public void run() {
            // TODO Auto-generated method stub
            if (connected) {
                if (config) {
                    sendMessage(init);
                    sendMessage(init2);
                    sendMessage(init3);
                    sendMessage(init4);
                    config=false;
                }
                sendMessage(cmd_erpm);
                sendMessage(cmd_vspeed);
                Toast.makeText(getApplicationContext(), "sent",
                        Toast.LENGTH_SHORT).show();
            }
            handler.postDelayed(this, 10000);
        }
    };
    runnable.run();


}

这是通过发送命令并接收数据并解析它来完成的。 在这项服务中,我们需要继续发送命令。

如何使用ATMA命令完成?

意味着解析数据的逻辑是什么。

2 个答案:

答案 0 :(得分:0)

据我所知,AT MA命令将ELM-327置于总线监控模式,以便它监听总线上所有与OBD-II相关的消息,然后重新发送它们。但它不允许您重复发送OBD-II命令。此外,AT MA命令关闭当前的ECU协议会话以开始监视。在您请求OBD-II命令之前,将再次建立通信。

查看ELM-327手册中的更多详细信息:

http://elmelectronics.com/DSheets/ELM327DS.pdf

答案 1 :(得分:0)

一旦发送ATMA命令,您应首先获得“等待......”响应(取决于ELM327的实现)。

然后,您将通过所选协议(使用ATSPx)从线路获取帧

对于完整帧,首先发送ATH1(我看到你的示例代码中有这个)。

解析帧数据取决于您使用的协议。从广义上讲,您将在以下协议类型上执行3种类型的解析:

1)CAN 11位

2)CAN 29位

3)ISO(9141/14230)和SAE(J1850)序列