Я работаю над считывателем OBD-ii.OBD-ii Замораживание считывателя, а не в режиме реального времени
Я использую базовый Bluetooth-чат для связи с устройством OBD-ii, регулярными выражениями для захвата ответов и отображения их в текстовых представлениях.
Это где я отправить PID код, чтобы запросить данные:
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: ;
}
}
Затем забрать данные здесь:
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.
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. Мой журнал, однако, выходит с некоторыми вещами, которые я не понимаю. Я также замечаю, что textView, который показывает мне, что dataRecieved содержит неизвестные символы и говорит STOPPED, затем замерзает и запускается снова через некоторое время. Вот некоторые из бревна ...
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
My [объяснить инструмент] (http://www.regexdoc.com/re/explain.pl) разбивает его для лучшего понимания. Первое [regex] (http://regexdoc.com/re/explain.pl?re=%5Cs*%5B0-9A-Fa-f%5D%7B2%7D+%5B0-9A-Fa-f%5D%7B2 % 7D% 5Cs *% 5Cr% 3F% 5Cn% 3F & .submit = Объяснение% 21 & mode = SO & .cgifields = mode), второе [regex] (http://regexdoc.com/re/explain.pl?re=%5Cs *% 5B + .A-Za-z0-9% 5C% 5C% 3F *% 3E% 5cr% 5Cn% 5D *% 5cs *% 3E% 5cs *% 5cr *% 5Cn * &. подать = Объяснение% 21 & режим = SO & .cgifields = mode) – hwnd
Спасибо за это, помогли много :) – user3010383
FYI, вы можете игнорировать предупреждения о кеше, которые были удалены. См. Мой ответ на [этот вопрос] (http://stackoverflow.com/questions/17449835/tag-textlayoutcache-text-cache-value-deleted/22267989). –