首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >OBD-ii阅读器冻结而非实时

OBD-ii阅读器冻结而非实时
EN

Stack Overflow用户
提问于 2014-11-11 18:50:10
回答 1查看 289关注 0票数 1

我在研究OBD-ii阅读器。

我正在使用一个基本的蓝牙聊天与OBD-ii设备通信,正则表达式捕获答复并在文本视图中显示它们。

这就是我发送PID代码请求数据的地方:

代码语言:javascript
复制
public void getData(int messagenumber) {

    final TextView TX = (TextView) findViewById(R.id.TXView2); 

    switch(messagenumber) {

        case 1:
            sendMessage("01 2F" + '\r'); //get Fuel %
            TX.setText("01 2F");
            Log.d("Case1: ", String.valueOf(messagenumber));    
            messagenumber++;
            Log.d("Case1: ", String.valueOf(messagenumber));    
            break;
        case 2:
            sendMessage("01 31" + '\r'); //get Mileage
            TX.setText("01 31");
            Log.d("Case2: ", String.valueOf(messagenumber));    
            messagenumber++;
            Log.d("Case2: ", String.valueOf(messagenumber));    
            break;
        case 3:
            sendMessage("01 0C" + '\r'); //get RPM
            TX.setText("01 0C");
            Log.d("Case3: ", String.valueOf(messagenumber));    
            messagenumber++;
            Log.d("Case3: ", String.valueOf(messagenumber));    
            break;

        default: ;       
    }
}

然后在这里获取数据:

代码语言:javascript
复制
        switch (msg.what) {
        case MESSAGE_STATE_CHANGE:
            if(D) Log.i(TAG, "MESSAGE_STATE_CHANGE: " + msg.arg1);
            switch (msg.arg1) {
            case BluetoothChatService.STATE_CONNECTED:
                setStatus(getString(R.string.title_connected_to, mConnectedDeviceName));
                mConversationArrayAdapter.clear();
                break;
            case BluetoothChatService.STATE_CONNECTING:
                setStatus(R.string.title_connecting);
                break;
            case BluetoothChatService.STATE_LISTEN:
            case BluetoothChatService.STATE_NONE:
                setStatus(R.string.title_not_connected);
                break;
            }
            break;
        case MESSAGE_WRITE:
            byte[] writeBuf = (byte[]) msg.obj;
            // construct a string from the buffer
            String writeMessage = new String(writeBuf);

            mConversationArrayAdapter.add("Me:  " + writeMessage);
            break;
        case MESSAGE_READ:
            byte[] readBuf = (byte[]) msg.obj;
            // construct a string from the valid bytes in the buffer               
            String readMessage = new String(readBuf, 0, msg.arg1);
            Log.d("BYTES: ", readMessage);

            // ------- ADDED CODE FOR OBD -------- //      
            dataRecieved = readMessage;
            RX.setText(dataRecieved);



           if((dataRecieved != null) && (dataRecieved.matches("\\s*[0-9A-Fa-f]{2} [0-9A-Fa-f]{2}\\s*\r?\n?" ))) {

                    dataRecieved = dataRecieved.trim();
                    String[] bytes = dataRecieved.split(" ");
                    Log.d("DR 1val: ",dataRecieved + "--!");


                    if((bytes[0] != null)&&(bytes[1] != null)) {

                         PID = Integer.parseInt(bytes[0].trim(), 16);
                         value = Integer.parseInt(bytes[1].trim(), 16); 
                        }


             if (PID == 47) {

            /*case 47: //PID(2F): Fuel % */

                int fuelValue = ((value*100)/255);

                String displayFuel = String.valueOf("PID: " + PID + "Val: " + value + "fuel: " + fuelValue + " %");
                Fuel.setText(displayFuel);
                /*break;
            default: ;*/
             }

        }
        else if((dataRecieved != null) && (dataRecieved.matches("\\s*[0-9A-Fa-f]{2} [0-9A-Fa-f]{2} [0-9A-Fa-f]{2}\\s*\r?\n?" ))) {

            dataRecieved = dataRecieved.trim();
            String[] bytes = dataRecieved.split(" ");
            Log.d("DR 2vals: ",dataRecieved + "--!");



            if((bytes[0] != null)&&(bytes[1] != null)&&(bytes[2] != null)) {

                PID = Integer.parseInt(bytes[0].trim(), 16);
                //if (PID == 12){
                value1 = Integer.parseInt(bytes[1].trim(), 16);
                value2 = Integer.parseInt(bytes[2].trim(), 16);
                /*}
                else if (PID == 49){
                //mileVal = Integer.parseInt(bytes[1].trim(), 16);
                }*/
            }   

                //PID(0C): RPM
            if (PID == 12) { 

                    int RPM_value = ((value1*256)+value2)/4;


                    String displayRPM = String.valueOf("PID: " + PID + "A: " + value1 + " B: " + value2 + "RPM: " + RPM_value);
                    Throttle.setText(displayRPM);

            }
            else if (PID == 49) {


                //PID(31): Distance Travelled   (A*256)+B 

                        int miles = (int) (((value1*256)+value2)*0.62137);

                        //String displayDistance = String.valueOf(miles + " miles");
                        String displayDistance = String.valueOf("PID: " + PID + "A: " + value1 + " B: " + value2 + "Miles: " + miles);
                        Distance.setText(displayDistance);

        }
        }

然后,我使用这个正则表达式侦听>,这意味着OBD已经完成了对命令的处理,然后应该返回开始,再次请求PID代码。

代码语言:javascript
复制
   else if((dataRecieved != null) && (dataRecieved.matches("\\s*[ .A-Za-z0-9\\?*>\r\n]*\\s*>\\s*\r*\n*" ))) {

            if(message_number == 4){
                message_number = 1;
            }
            getData(message_number++);
        }

当我运行应用程序时,需要很长时间才能开始给出任何值,但是它们是准确的。我有一份从OBD收到的数据日志。不过,我的日志里有一些我不明白的东西。我还注意到,向我显示dataRecieved的那个dataRecieved会出现一些未知的字符,并说“停止”,然后在一段时间后冻结并再次启动。这是一些木头..。

代码语言:javascript
复制
   D/TextLayoutCache(5146): Cache value 0x520da3b8 deleted, size = 136
   V/BluetoothSocket.cpp(5146): readNative
   D/TextLayoutCache(5146): Cache value 0x4dbd5e00 deleted, size = 176
   V/BluetoothSocket.cpp(5146): readNative
   V/BluetoothSocket.cpp(5146): readNative
   D/TextLayoutCache(5146): Cache value 0x4dfead50 deleted, size = 240
    D/TextLayoutCache(5146): Cache value 0x520dcb10 deleted, size = 240
   V/BluetoothSocket.cpp(5146): readNative
  D/BYTES:(5146): C 
  D/BYTES:(5146): 4 
  D/BYTES:(5146): 4 
  D/BYTES:(5146): 4 
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-11-11 18:53:27

这些站点将帮助您开始使用正则表达式:

http://www.rexegg.com/regex-quickstart.html

http://www.cheatography.com/davechild/cheat-sheets/regular-expressions/

当试图理解任何代码时,将其分解为更小的步骤:

dataRecieved = readMessage;

这只是将dataRecieved设置为readMessage

\s代表空白,是“字符类”。

0-9是一个范围,a也是.请注意,它们使它既匹配小写也匹配大写。

当查看这个\s*[ .A-Za-z0-9\ \注意\正则表达式之间是如何\某样东西时,通常有这个区域作为搜索术语和范围。

代码语言:javascript
复制
if((dataRecieved != null) && (dataRecieved.matches("\\s*[0-9A-Fa-f]{2} [0-9A-Fa-f]{2}\\s*\r?\n?" ))) {

这一行要求一个条件'if‘&&所以,对于整个条件,两者都必须为true,否则返回false。

还有更多,但在我继续之前:

我建议在这一点上编辑您的问题,澄清您所理解的内容,然后就代码的特定部分提出问题。在您的问题中,我没有听到您究竟对代码的哪一部分感到困惑,因此,在这一点上不解释整个问题是很难回答您的问题的。

我希望这个答案能帮助你开始工作

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26872255

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档