我正在开发一个从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命令完成?
意味着解析数据的逻辑是什么。
答案 0 :(得分:0)
据我所知,AT MA命令将ELM-327置于总线监控模式,以便它监听总线上所有与OBD-II相关的消息,然后重新发送它们。但它不允许您重复发送OBD-II命令。此外,AT MA命令关闭当前的ECU协议会话以开始监视。在您请求OBD-II命令之前,将再次建立通信。
查看ELM-327手册中的更多详细信息:
答案 1 :(得分:0)
一旦发送ATMA命令,您应首先获得“等待......”响应(取决于ELM327的实现)。
然后,您将通过所选协议(使用ATSPx)从线路获取帧
对于完整帧,首先发送ATH1(我看到你的示例代码中有这个)。
解析帧数据取决于您使用的协议。从广义上讲,您将在以下协议类型上执行3种类型的解析:
1)CAN 11位
2)CAN 29位
3)ISO(9141/14230)和SAE(J1850)序列