В вашем сниффе немного неправильно скомпанованы кадры, поэтому затруднительно понимать что к чему. Сначала пытаемся увидеть зависмости и выловить начала и концы кадров, у меня получилось так:
81 11 F1 3E C1 // запрос поддержания связи (присутствия)
81 F1 11 7E 1
81 11 F1 3E C1 // запрос поддержания связи (присутствия)
81 F1 11 7E 1
81 11 F1 3E C1 // запрос поддержания связи (присутствия)
81 F1 11 7E 1
81 11 F1 81 4 // запрос Keyword - ов
83 F1 11 C1 EF 8F C4
82 11 F1 1A 81 1F // запрос IDENT_1
A2 F1 11 5A 81 4 90 6F 62 3 98 6A 3 99 44 3 92 44 3 91 6B 3 94 64 3 95 2 3 96 66 3 97 66 3 9A 2 FF D3
82 11 F1 1A 80 1E // запрос IDENT_2
80 F1 11 44 5A 80 57 30 4C 30 30 30 30 33 36 56 31 31 36 36 37 37 32 53 30 30 31 30 30 34 39 32 34 19 98 12 14 16 20 22 80 31 36 32 30 32 33 31 39 20 4E 4C 43 4D 58 4A 0 8 44 39 36 30 30 33 58 31 36 58 45 4C 1 2 A3
82 11 F1 21 1 A6 // запрос параметров
B0 F1 11 61 1 1 1 70 22 0 0 0 FA 79 33 78 51 C0 8A 12 34 0 0 0 0 0 1E 0 0 0 8B 26 0 0 56 80 12 74 0 FF 7B 0 0 0 84 8 27 34 0 0 0 33
81 11 F1 3E C1 // запрос поддержания связи (присутствия)
81 F1 11 7E 1
81 11 F1 3E C1
81 F1 11 7E 1
объясню смысл сообщений (кадров) в таких протоколах. Скажу сразу что эта инфа не является истиной, а лишь мои догадки.
Первый байт (а правильнее нулевой) содержит информацию о длине посылки. Длина это количество байт за исключением самого байта длины, байтов адреса и контрольной суммы. У байта длины нужно убрать старший бит (самый левый) тогда получим правильную длину. Это можно сделать в виндовом калькуляторе. после чего можно перевести в удобный для нас DEC в том же калькуляторе.
например, разберём сообщение 82 11 F1 21 01 A6 . Берём виндовый калькулятор
82 - переводим в BIN 10000010 убираем левую единицу получаем в BIN 00000010 или просто 10 т.е. 2 в DEC (это длина кадра - два байта, забегая вперёд: 21 01 )
11 - адрес получателя кадра (в данном случае сообщение адресовано на PCM автомобиля, адрес 11)
F1 - адрес отправителя кадра (F1 - надо полагать это адрес диагностики)
21 01 - команда или полезная информация сообщения (вот это и есть функциональная тобишь смысловая нагрузка сообщения, длину которой и показывает нулевой байт в сообщении). Все остальные байты в сообшении служебные (поэтому основные байты выделил жирным).
A6 - контрольная сумма (CRC) всех предыдущих байт кадра. Просто сложение, если сумма всех байт будет больше чем один байт (255 или тоже самое 0xFF) то берётся самый младший (правый байт). На примере нашего кадра CRC получается в HEX 1A6 соответсвенно берётся A6
Есть один нюанс с нулевым байтом кадра, который показывает длину. Если старший (левый) полубайт (ниббл) равен 8, а младший (правый) равен 0 , (т.е. байт такой: 0x80) соответствено если убрать старший бит получим в итоге длину 0. Такие сообщения есть - обычно это длинные сообщения. В таком случае длина кадра указывается дополнительным байтом, вставленным после байт адресов оправителя и получателя. Пример:
вот смотрите после 80 F1 11 стоит 44 в DEC это 68. Не поленитесь, посчитайте количество байт после 44 - будет 68 байт и ещё один байт контрольной суммы (как мы помним - он не входит в длину).
А вот ответ вашего PCM на запрос параметров (82 11 F1 21 01 A6):
смотрим, B0 без старшего бита это в DEC 48 считайте количество байт после B0 F1 11 - всё сходится. Можете сложить всё байты младший (правый) байт результата будет равен 33 в HEX.
Спасибо за науку... Вы то уже глаз наметали, а я б из этой мешанины вовек не выдрал правильных строк. Остается вопрос - почему сместились кадры? Может в коде снифера что-то доработать? И почему у меня не видно запроса инициализации от ОП-ком, как у ТС (81 11 F1 81 04 запрос инициализации).
Упс, сам спросил, сам увидел про задержку. Завтра буду играться. Может поэтому и пропускаю запрос инициализации...
вот вам эмулятор с данными вашей машины. Проверил PID ы также себя ведут, как я чуть выше приводил. такчто теперь вы знаете что и как в ответе на запрос параметров 21 01
int bytenumber = 6;
///////////////////////////////////////////////////////////////////////
#include <SoftwareSerial.h>
SoftwareSerial mySerial(7, 8); //R,T
unsigned long prevTimedelay = 0;
byte MessageRx[110] = {0}; // массив байтов принимаемого сообщения
byte messageCOMUN[] = {0x83, 0xF1, 0x11, 0xC1, 0xEF, 0x8F, 0xC4};
byte messagePRES[] = {0x81, 0xF1, 0x11, 0x7E, 0x01};
byte messageIDEN1[] = {0xA2, 0xF1, 0x11, 0x5A, 0x81, 0x04, 0x90, 0x6F, 0x62, 0x03, 0x98, 0x6A, 0x03, 0x99,
0x44,0x03, 0x92, 0x44, 0x03, 0x91, 0x6B, 0x03, 0x94, 0x64, 0x03, 0x95, 0x02, 0x03, 0x96, 0x66, 0x03, 0x97,
0x66,0x03, 0x9A, 0x02, 0xFF, 0xD3};
byte messageIDEN2[] = {0x80, 0xF1, 0x11, 0x44, 0x5A, 0x80, 0x57, 0x30, 0x4C, 0x30, 0x30, 0x30, 0x30, 0x33, 0x36 ,0x56 ,0x31 ,0x31 ,0x36 ,0x36 ,
0x37 ,0x37 ,0x32 ,0x53 ,0x30 ,0x30 ,0x31 ,0x30 ,0x30 ,0x34 ,0x39 ,0x32 ,0x34 ,0x19 ,0x98 ,0x12 ,0x14 ,0x16 ,0x20 ,0x22 ,0x80 ,0x31 ,0x36 ,0x32 ,
0x30 ,0x32 ,0x33 ,0x31 ,0x39 ,0x20 ,0x4E ,0x4C ,0x43 ,0x4D ,0x58 ,0x4A ,0x00 ,0x08 ,0x44 ,0x39 ,0x36 ,0x30 ,0x30 ,0x33 ,0x58 ,0x31 ,0x36 ,0x58,
0x45 ,0x4C ,0x01 ,0x02 ,0xA3};
byte messagePIDS[] = {0x80, 0xF1, 0x11, 0x30, 0x61, 0x01, 0x01, 0x01, 0x70, 0x22, 0x00, 0x00, 0x00, 0xFA, 0x79, 0x33, 0x78, 0x51, 0xC0,
0x8A, 0x12, 0x34, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x00, 0x8B ,0x26, 0x00, 0x00, 0x56, 0x80, 0x12, 0x74, 0x00,
0xFF, 0x7B, 0x00, 0x00, 0x00, 0x84, 0x08, 0x27, 0x34, 0x00, 0x00, 0x00, 0x33};
bool debug = 0; // выставив этот бит в единицу будем видеть все сообщения в терминале
bool f =0;
void setup() {
byte CRC = 0;
for (byte i=0; i<sizeof(messageIDEN1); i++){if (i!=sizeof(messageIDEN1)-1) CRC+=messageIDEN1[i]; else messageIDEN1[i]=CRC;}
CRC = 0;
for (byte i=0; i<sizeof(messageIDEN2); i++){if (i!=sizeof(messageIDEN2)-1) CRC+=messageIDEN2[i]; else messageIDEN2[i]=CRC;}
CRC = 0;
messagePIDS[3]=sizeof(messagePIDS)-5;
for (byte i=0; i<sizeof(messagePIDS); i++){if (i!=sizeof(messagePIDS)-1) CRC+=messagePIDS[i]; else messagePIDS[i]=CRC;}
Serial.begin (115200);
mySerial.begin (10400);
pinMode (10, OUTPUT);
digitalWrite (10,0);
Serial.print ("Tekuchiy Nomer Byte dlya izmeneniya: "); Serial.println (bytenumber); Serial.println ("");
}
void loop() {
if (Serial.available()) {
byte inbyte=0;
inbyte = Serial.read(); delay(2);
if (inbyte == '-') {bytenumber --; Serial.print (" bytenumber: "); Serial.println (bytenumber);}
if (inbyte == '+') {bytenumber ++; Serial.print (" bytenumber: "); Serial.println (bytenumber);}
if (inbyte == '.') {messagePIDS[bytenumber]++;Serial.print ("byte value: "); Serial.println (messagePIDS[bytenumber]);
byte CRC = 0; for (byte i=0; i<sizeof(messagePIDS); i++){if (i!=sizeof(messagePIDS)-1) CRC+=messagePIDS[i]; else messagePIDS[i]=CRC;}}
if (inbyte == 'm') {if (f)messagePIDS[bytenumber]=255;else messagePIDS[bytenumber]=0; f=!f; Serial.print ("byte value: "); Serial.println (messagePIDS[bytenumber]);
byte CRC = 0; for (byte i=0; i<sizeof(messagePIDS); i++){if (i!=sizeof(messagePIDS)-1) CRC+=messagePIDS[i]; else messagePIDS[i]=CRC;}}
if (inbyte == ',') {messagePIDS[bytenumber]--;Serial.print ("byte value: "); Serial.println (messagePIDS[bytenumber]);
byte CRC = 0; for (byte i=0; i<sizeof(messagePIDS); i++){if (i!=sizeof(messagePIDS)-1) CRC+=messagePIDS[i]; else messagePIDS[i]=CRC;}}
if (inbyte == 'p') debug=!debug;
Serial.flush();
return;}
if (mySerial.available()) {
// delay(100);
int k=0;
byte inbyte=0;
while( mySerial.available() && k < 100) {
inbyte = mySerial.read(); delay (7);
MessageRx[k] = inbyte;
k++; }
if (debug) Serial.print ("Recieve: ");
for (int i = 0; i < k; i++) {
if (debug){Serial.print(MessageRx[i],HEX); Serial.print (" ");} }
if (debug) Serial.println ("");
if ((MessageRx[1]==0x81 && MessageRx[2]==0x11 && MessageRx[3]==0xF1 && MessageRx[4]==0x81 && MessageRx[5]==0x04)|| (MessageRx[0]==0x81 && MessageRx[1]==0x11 && MessageRx[2]==0xF1 && MessageRx[3]==0x81 && MessageRx[4]==0x04)) {
if (debug){ Serial.println ("Prinyat zapros init! "); Serial.println ("");
Serial.print ("Otvechayu: ");}
for (int i = 0; i <sizeof(messageCOMUN); i++) {
mySerial.write(messageCOMUN[i]);
if (debug){Serial.print(messageCOMUN[i],HEX); Serial.print (" ");}
}
if (debug) {Serial.println("");}
}
if (MessageRx[0]==0x80 && MessageRx[1]==0x11 && MessageRx[2]==0xF1 && MessageRx[3]==0x01 && MessageRx[4]==0x3E && MessageRx[5]==0xC1) {
if (debug){ Serial.println ("Prinyat zapros prisutstvia! "); Serial.println ("");
// Serial.print ("Tekuchiy Nomer Byte dlya izmeneniya: "); Serial.println (bytenumber); Serial.println ("");
Serial.print ("Otvechayu: ");}
for (int i = 0; i < sizeof(messagePRES); i++) {
mySerial.write(messagePRES[i]);delay(1);
if (debug) {Serial.print(messagePRES[i],HEX); Serial.print (" ");}}
if (debug) Serial.println("");
}
if (MessageRx[0]==0x80 && MessageRx[1]==0x11 && MessageRx[2]==0xF1 && MessageRx[3]==0x02 && MessageRx[4]==0x1A && MessageRx[5]==0x81 && MessageRx[6]==0x1F) {
if (debug){ Serial.println ("Prinyat zapros identificacion 1! "); Serial.println ("");
Serial.print("Otvechayu: ");}
for (int i = 0; i < sizeof(messageIDEN1); i++) {
mySerial.write(messageIDEN1[i]);delay(1);
if (debug) {Serial.print(messageIDEN1[i],HEX); Serial.print (" ");}
}
if (debug){Serial.println("");
Serial.print ("Otvechayu DEC: ");}
for (int i = 0; i < sizeof(messageIDEN1); i++) {
if (debug) {Serial.print(messageIDEN1[i]); Serial.print (" ");}
}
if (debug) Serial.println("");
}
if (MessageRx[0]==0x80 && MessageRx[1]==0x11 && MessageRx[2]==0xF1 && MessageRx[3]==0x02 && MessageRx[4]==0x1A && MessageRx[5]==0x80 && MessageRx[6]==0x1E) {
if (debug){ Serial.println ("Prinyat zapros identificacion 2! "); Serial.println ("");
Serial.print("Otvechayu: ");}
for (int i = 0; i < sizeof(messageIDEN2); i++) {
mySerial.write(messageIDEN2[i]); delay(1);
if (debug) {Serial.print(messageIDEN2[i],HEX); Serial.print (" ");}
}
if (debug) {Serial.println("");
Serial.print ("Otvechayu DEC: ");}
for (int i = 0; i < sizeof(messageIDEN2); i++) {
if (debug) {Serial.print(messageIDEN2[i]); Serial.print (" ");}
}
if (debug) Serial.println("");
}
if (MessageRx[0]==0x80 && MessageRx[1]==0x11 && MessageRx[2]==0xF1 && MessageRx[3]==0x02 && MessageRx[4]==0x21 && MessageRx[5]==0x01 && MessageRx[6]==0xA6) {
if (debug){ Serial.println ("Prinyat zapros datos! "); Serial.println ("");
Serial.print ("Otvechayu: ");}
for (int i = 0; i < sizeof(messagePIDS); i++) {
mySerial.write(messagePIDS[i]);delay(1);
if (debug) {Serial.print(messagePIDS[i],HEX); Serial.print (" ");}
}
if (debug) Serial.println("");
}
}
}
интересен один момент корявости моей программы OPCOM k-line. Чуть выше я говорил про байт длины, что может по разному длину показывать, (либо просто байт либо при помощи дополнительного байта), дак вот ваша машина отвечает длиной без дополнительного байта :
Вот более совершенный алгоритм получения-парсинга сообщений с проверкой CRC на примере всё того же эмулятора. (Этот алгоритм потом и в скетче итоговом можно использовать).
В эмуляторе ошибки DTC можно читать стирать. Если опять нажать стереть - они снова появляются, так для прикола сделал.
#define MY_ADDRESS 0x11 // адрес ЭБУ в HEX
#define DIAG_ADDRESS 0xF1 // адрес диагностики в HEX
int bytenumber = 6;
///////////////////////////////////////////////////////////////////////
#include <SoftwareSerial.h>
SoftwareSerial mySerial(7, 8); //R,T
unsigned long prevTimedelay = 0;
byte head[4] = {0};
byte head_count = 0;
byte messageCOMUN[] = {0x83, 0xF1, 0x11, 0xC1, 0xEF, 0x8F, 0xC4};
byte messagePRES[] = {0x81, 0xF1, 0x11, 0x7E, 0x01};
byte messageIDEN1[] = {0xA2, 0xF1, 0x11, 0x5A, 0x81, 0x04, 0x90, 0x6F, 0x62, 0x03, 0x98, 0x6A, 0x03, 0x99,
0x44,0x03, 0x92, 0x44, 0x03, 0x91, 0x6B, 0x03, 0x94, 0x64, 0x03, 0x95, 0x02, 0x03, 0x96, 0x66, 0x03, 0x97,
0x66,0x03, 0x9A, 0x02, 0xFF, 0xD3};
byte messageIDEN2[] = {0x80, 0xF1, 0x11, 0x44, 0x5A, 0x80, 0x57, 0x30, 0x4C, 0x30, 0x30, 0x30, 0x30, 0x33, 0x36 ,0x56 ,0x31 ,0x31 ,0x36 ,0x36 ,
0x37 ,0x37 ,0x32 ,0x53 ,0x30 ,0x30 ,0x31 ,0x30 ,0x30 ,0x34 ,0x39 ,0x32 ,0x34 ,0x19 ,0x98 ,0x12 ,0x14 ,0x16 ,0x20 ,0x22 ,0x80 ,0x31 ,0x36 ,0x32 ,
0x30 ,0x32 ,0x33 ,0x31 ,0x39 ,0x20 ,0x4E ,0x4C ,0x43 ,0x4D ,0x58 ,0x4A ,0x00 ,0x08 ,0x44 ,0x39 ,0x36 ,0x30 ,0x30 ,0x33 ,0x58 ,0x31 ,0x36 ,0x58,
0x45 ,0x4C ,0x01 ,0x02 ,0xA3};
byte messagePIDS[] = {0x80, 0xF1, 0x11, 0x30, 0x61, 0x01, 0x01, 0x01, 0x70, 0x22, 0x00, 0x00, 0x00, 0xFA, 0x79, 0x33, 0x78, 0x51, 0xC0,
0x8A, 0x12, 0x34, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x00, 0x8B ,0x26, 0x00, 0x00, 0x56, 0x80, 0x12, 0x74, 0x00,
0xFF, 0x7B, 0x00, 0x00, 0x00, 0x84, 0x08, 0x27, 0x34, 0x00, 0x00, 0x00, 0x33};
byte answerNODTC[] = { 0x82, 0xF1, 0x11, 0x58, 0x00, 0xDC}; // раскоментировать и не будет DTC
byte answerDTC[] = {0x8B ,0xF1, 0x11, 0x58, 0x03, 0x01, 0x15, 0xE1, 0x11, 0x10, 0xE4, 0x04, 0x00, 0xE4, 0xCC}; // сообщение с наличиями DTC
byte ERASE_DTC[] = {0x83, 0xF1, 0x11, 0x54, 0xFF, 0x00, 0xD8};
bool NODTC = 0;
bool debug = 0; // выставив этот бит в единицу будем видеть все сообщения в терминале
bool f =0;
byte StartByte = 0;
bool _StartByte = 0;
void setup() {
byte CRC = 0;
for (byte i=0; i<sizeof(messageIDEN1); i++){if (i!=sizeof(messageIDEN1)-1) CRC+=messageIDEN1[i]; else messageIDEN1[i]=CRC;}
CRC = 0;
for (byte i=0; i<sizeof(messageIDEN2); i++){if (i!=sizeof(messageIDEN2)-1) CRC+=messageIDEN2[i]; else messageIDEN2[i]=CRC;}
CRC = 0;
messagePIDS[3]=sizeof(messagePIDS)-5;
for (byte i=0; i<sizeof(messagePIDS); i++){if (i!=sizeof(messagePIDS)-1) CRC+=messagePIDS[i]; else messagePIDS[i]=CRC;}
Serial.begin (115200);
mySerial.begin (10400);
pinMode (10, OUTPUT);
digitalWrite (10,0);
Serial.print ("Tekuchiy Nomer Byte dlya izmeneniya: "); Serial.println (bytenumber); Serial.println ("");
}
void loop() {
//ниже опрос данных из терминала (нажатий нами "+", "-", ".", ",", "p" для изменения байтов сообщения с параметрами)
if (Serial.available()) {
byte inbyte=0;
inbyte = Serial.read(); delay(2);
if (inbyte == '-') {bytenumber --; if (bytenumber< StartByte) bytenumber = StartByte; Serial.print (" bytenumber: "); Serial.println (bytenumber);}
if (inbyte == '+') {bytenumber ++; if (bytenumber> sizeof(messagePIDS)-1) bytenumber = StartByte; Serial.print (" bytenumber: "); Serial.println (bytenumber);}
if (inbyte == '.') {messagePIDS[bytenumber]++;Serial.print ("byte value: "); Serial.println (messagePIDS[bytenumber]);
byte CRC = 0; for (byte i=0; i<sizeof(messagePIDS); i++){if (i!=sizeof(messagePIDS)-1) CRC+=messagePIDS[i]; else messagePIDS[i]=CRC;}}
if (inbyte == 'm') {if (f)messagePIDS[bytenumber]=255;else messagePIDS[bytenumber]=0; f=!f; Serial.print ("byte value: "); Serial.println (messagePIDS[bytenumber]);
byte CRC = 0; for (byte i=0; i<sizeof(messagePIDS); i++){if (i!=sizeof(messagePIDS)-1) CRC+=messagePIDS[i]; else messagePIDS[i]=CRC;}}
if (inbyte == ',') {messagePIDS[bytenumber]--;Serial.print ("byte value: "); Serial.println (messagePIDS[bytenumber]);
byte CRC = 0; for (byte i=0; i<sizeof(messagePIDS); i++){if (i!=sizeof(messagePIDS)-1) CRC+=messagePIDS[i]; else messagePIDS[i]=CRC;}}
if (inbyte == 'p') debug=!debug;
Serial.flush();
return;}
////////////////////// здесь начинается алгоритм приёма сообщений из K-LINE
if (mySerial.available()) {
// ниже ищем шапку кадра
byte inbyte = mySerial.read();
delay (7);
if (bitRead (inbyte,7) && head_count == 0) {head_count = 1; head[0] = inbyte; }
else if (inbyte == MY_ADDRESS && head_count == 1) {head_count = 2; head[1] = inbyte; }
else if (inbyte == DIAG_ADDRESS && head_count == 2) {head_count = 3; head[2] = inbyte; }
else {head_count = 0; for (byte i=0; i<sizeof(head); i++) head[i] = 0;}
// нашли шапку:
if (head_count == 3){
head_count = 0; // очищаем переменную поиска шапки
byte k = 0;
byte Length = 0;
byte plus = 0;
if (head[0] != 0x80) {Length = (head[0]&~0x80); plus=4;} // если длина без доп байта
else {delay (7); Length = mySerial.read(); plus=5; head[3] = Length;} // если длина с доп байтом
k = Length + plus;
if (k>100) k=100;
const byte sizeMes = k;
byte MessageRx [sizeMes] = {0};
byte crc = 0;
for (byte i=0; i<plus-1; i++){MessageRx[i]= head[i]; crc += MessageRx[i]; head[i] = 0;} // очищаем переменные поиска шапки
bool CRC_OK = 0;
// ниже пишем сообщение в буфер и считаем КС
for (byte i = plus-1; i < sizeMes; i++) { MessageRx[i] = mySerial.read(); if (i!=sizeMes-1) crc += MessageRx[i]; else if (crc == MessageRx[i]) CRC_OK = 1; delay (7);}
if (CRC_OK){
// ниже распечатаем в отладку принятое сообщение
if (debug) {Serial.println (); Serial.print ("Recieve: ");}
for (int i = 0; i < k; i++) {
if (debug){if (MessageRx[i]<=0x0F) Serial.print ("0"); Serial.print(MessageRx[i],HEX); Serial.print (" ");} }
if (debug) Serial.println ("");
if (Length==1 && MessageRx[plus-1]==0x81) {
if (debug){ Serial.println ("Prinyat zapros init! "); Serial.println ("");
Serial.print ("Otvechayu: ");}
for (int i = 0; i <sizeof(messageCOMUN); i++) {
mySerial.write(messageCOMUN[i]);
if (debug){if (messageCOMUN[i]<=0x0F) Serial.print ("0"); Serial.print(messageCOMUN[i],HEX); Serial.print (" ");}
}
if (debug) {Serial.println("");}
}
if (Length == 1 && MessageRx[plus-1]==0x3E ) {
if (debug){ Serial.println ("Prinyat zapros prisutstvia! "); Serial.println ("");
// Serial.print ("Tekuchiy Nomer Byte dlya izmeneniya: "); Serial.println (bytenumber); Serial.println ("");
Serial.print ("Otvechayu: ");}
for (int i = 0; i < sizeof(messagePRES); i++) {
mySerial.write(messagePRES[i]);delay(1);
if (debug) {if (messagePRES[i]<=0x0F) Serial.print ("0"); Serial.print(messagePRES[i],HEX); Serial.print (" ");}}
if (debug) Serial.println("");
}
if (Length == 2 && MessageRx[plus-1]==0x1A && MessageRx[plus]==0x81) {
if (debug){ Serial.println ("Prinyat zapros identificacion 1! "); Serial.println ("");
Serial.print("Otvechayu: ");}
for (int i = 0; i < sizeof(messageIDEN1); i++) {
mySerial.write(messageIDEN1[i]);delay(1);
if (debug) {if (messageIDEN1[i]<=0x0F) Serial.print ("0"); Serial.print(messageIDEN1[i],HEX); Serial.print (" ");}
}
if (debug){Serial.println("");
Serial.print ("Otvechayu DEC: ");}
for (int i = 0; i < sizeof(messageIDEN1); i++) {
if (debug) {Serial.print(messageIDEN1[i]); Serial.print (" ");}
}
if (debug) Serial.println("");
}
if (Length == 2 && MessageRx[plus-1]==0x1A && MessageRx[plus]==0x80) {
if (debug){ Serial.println ("Prinyat zapros identificacion 2! "); Serial.println ("");
Serial.print("Otvechayu: ");}
for (int i = 0; i < sizeof(messageIDEN2); i++) {
mySerial.write(messageIDEN2[i]); delay(1);
if (debug) {if (messageIDEN2[i]<=0x0F) Serial.print ("0"); Serial.print(messageIDEN2[i],HEX); Serial.print (" ");}
}
if (debug) {Serial.println("");
Serial.print ("Otvechayu DEC: ");}
for (int i = 0; i < sizeof(messageIDEN2); i++) {
if (debug) {Serial.print(messageIDEN2[i]); Serial.print (" ");}
}
if (debug) Serial.println("");
}
if (Length == 2 && MessageRx[plus-1]==0x21 && MessageRx[plus]==0x01) {
if (!_StartByte) {StartByte = plus; _StartByte=1; bytenumber = StartByte;};
if (debug){ Serial.println ("Prinyat zapros datos! "); Serial.println ("");
Serial.print ("Otvechayu: ");}
for (int i = 0; i < sizeof(messagePIDS); i++) {
mySerial.write(messagePIDS[i]);delay(1);
if (debug) {if (messagePIDS[i]<=0x0F) Serial.print ("0"); Serial.print(messagePIDS[i],HEX); Serial.print (" ");}
}
if (debug) Serial.println("");
}
if (Length == 4 && MessageRx[plus-1]==0x18 && MessageRx[plus]==0x00 && MessageRx[plus+1]==0xFF && MessageRx[plus+2]==0x00) {
if (debug){ Serial.println ("Prinyat zapros DTC! "); Serial.println ("");
Serial.print ("Otvechayu: ");}
if (!NODTC) {for (int i = 0; i < sizeof(answerDTC); i++) {
mySerial.write(answerDTC[i]);delay(1);
if (debug) {if (answerDTC[i]<=0x0F) Serial.print ("0"); Serial.print(answerDTC[i],HEX); Serial.print (" ");}
} }
else {for (int i = 0; i < sizeof(answerNODTC); i++) {
mySerial.write(answerNODTC[i]);delay(1);
if (debug) {if (answerNODTC[i]<=0x0F) Serial.print ("0"); Serial.print(answerNODTC[i],HEX); Serial.print (" ");}
}}
if (debug) Serial.println("");
}
if (Length == 3 && MessageRx[plus-1]==0x14 && MessageRx[plus]==0xFF && MessageRx[plus+1]==0x00) {
NODTC = !NODTC;
if (debug){ Serial.println ("Prinyat zapros ERASE_DTC! "); Serial.println ("");
Serial.print ("Otvechayu: ");}
for (int i = 0; i < sizeof(ERASE_DTC); i++) {
mySerial.write(ERASE_DTC[i]);delay(1);
if (debug) {if (ERASE_DTC[i]<=0x0F) Serial.print ("0"); Serial.print(ERASE_DTC[i],HEX); Serial.print (" ");}
}
if (debug) Serial.println("");
}
} // конец ифа с правильной CRC
else if (debug) Serial.println("CRC FAIL!!!");
}
}
}
Адаптер FTD1232, как вы давали ссылку. Сперва пробовал не меняя скорости, потом уже пытался ставить разную Результат одинаков..... Не могу понять что за ерунда. Завтра попробую на другом компе.
error: variable-sized object 'MessageRx' may not be initialized
byte MessageRx [sizeMes] = {0};
^
exit status 1
variable-sized object 'MessageRx' may not be initialized
Ну да ладно, Вроде бы все мало-мальски полезные данные есть. Теперь бы с приборкой разобраться. Но она у меня тоже на PIN7. Это ж постоянно отключаться от одного блока и подключаться к другому нужно, будет же задержка в получении данных?
PS... у ТС за каждый показатель два байта отвечают, у меня один получается?
1.6.8 в более новых ошибки ползут при компилировании из-за TVout. Хотя странно те ошибки вылазят - то все нормально, то ошибка. Не может ли IDE оставлять мусор во временной папке?
PS... у ТС за каждый показатель два байта отвечают, у меня один получается?
да, получается так. PID лист по другому выполнен.
Все же рекомендую разобраться со скетчем, который с CRC, там кроме crc, более правильное считывание сообщений. В конечном устройстве лучше такой алгоритм применять.
и нафиг вам эта тв оут. Поставьте отдельный экран и не мучайтесь. Подозреваю, что через тв оут такое разрешение будет стремное, что текста не видно будет.
Весь смысл сделать так, чтоб было похоже на заводской. Т.е. борткомп должен стоять в штатном месте, управляться штатными кнопками. Разрешение при этом 120х98. Что дает нам 9 строк и 12 столбцов текста. Я ж уже делал часики на нем. Читабельно. Показания все за раз задачи выводить не стоит, будет переключаться экран, как и в родном БК.
Байт Значение Формула Единицы измерения Мин.значение Макс.Значение
13 МАП X*4,97/255 V 0 5
13 МАП X*1,04/255 bar 0 1,04
14 System Voltage X/10 V 0 25,5
15 intake air temperature X*4,97/255 V 0 5
16 intake air temperature X*191/255-40 C -40 151
17 engine coolant temperature X*4,97/255 V 0 5
18 engine coolant temperature X*191/255-40 C -40 151
19 Spark Angle before TDC (Top Dead Centre) X*180/255-90 град -90 90
20 Engine Load X*100/255 % 0 100
22 Knock Cell Number X
23 цил1 уменшение УОЗ для уменьшения детонации X*90/255 град 0 90
24 цил2 уменшение УОЗ для уменьшения детонации X*90/255 град 0 90
25 цил3 уменшение УОЗ для уменьшения детонации X*90/255 град 0 90
26 цил4 уменшение УОЗ для уменьшения детонации X*90/255 град 0 90
27 throttle position X*4,97/255 V 0 5
28 throttle position X*100/255 % 0 100
29 speed X km/h 0 255
30 Engine speed X*6375/255 rpm 0 6375
31 Injection Pulse X*21,8/255 ms 0 21,8
32 Idle Air Control X steps 0 255
35 O2 Sensor X*1127/255 mV 0 1127
36 O2 Integrator X steps 0 255
41 Air/Fuel Ratio x/10 0 25,5
44 Dec. Fuel Cutoff (Deceleration) 32-63; 96-127; 160-191; 224-255 Active
А вот таких PID у меня нет, но можно расчитать (немного другой двигатель):
И вот самое интересное, что по O2 Integrator легко расчитать Short Term Fuel Trim: (O2 Integrator-128)*100/128. Еще как-то бы на долгосрочную коррекцию выйти путем расчетов (Long Term Fuel Trim). Для тех, у кого стоит ГБО - это очень хорошее подспорье при настройке. Показывает обеднение/обогащение смеси в процентах.
бывает на некоторых автомобилях в принципе нет долговременной коррекции. На старых обычно, коим ваш авто и является. Подключитесь к приборке , показывает ли там остаток топлива в баке? и заснифить это нужно
От нормального нужно так же на скорости 9600 и 4800 провертиь, сейчас пойду сниму сниф.
Посмотрел что будет при инициализации скетчем ТС. я так понимаю все нормально, инициализировалось, только при парсинге нужно пропускать некоторые байты.
starting comunication (fastinit)
starting serial comunication
8111F1814
8111F13EC1
waiting for data
FFFF83F111C1EF8FC4FFFF81F1117E1 TIMEOUT
8211F1211A6
8111F13EC1
waiting for data
FFFFFFB0F111611117022000F975A9847F9C8AF3401791902A00658012730FF7A0004827340004D TIMEOUT
8211F1211A6
8111F13EC1
waiting for data
FFFFFFB0F111611117022000F975A9847F1E0011E0008F2A00658012730FF7A0004827340004C TIMEOUT
8211F1211A6
8111F13EC1
waiting for data
FFFFFFB0F111611117022000F975A9847E8A68101E0008F2A00658012730FF7A0004827340004B TIMEOUT
8211F1211A6
8111F13EC1
waiting for data
FFFFFFB0F111611117022000F975A9847E9C8AF001118F2A00658012730FF7A0004827340004B TIMEOUT
Чего его искать? Вот он я :) Только нема там чего снифить. Он сам унутри себя расчитывает по приходящим сигналам, распиновку прилагаю:
Подходят к нему только сигнал с тахометра, скорости, расхода топлива ну и уровня топлива. Вот и все его общение. Подозреваю, сигналы там аналоговые. Пины с 8 по 11 - только для общения со штатной магнитолой.
а какие данные видятся если опком к нему подключить (по 8 пину ОБД получается)? если ваш адаптер Опком только к 7 пину подключается, попробуйте к-лайн опком - вдруг подключится . Косяк с прогой к-лайн опком скорее всего как раз в байте длины.
Да кроме кода прошивки и в некоторых машинах программирования индекса звука ничего там не видно. К моей ничего не подключается, подозреваю, т.к. MID от машины поновее и перепрошит под мой мотор через дилерский TECH2.
1017ms
0
2239ms
66 E6
53ms
18 E6 0
27ms
FE FE
65ms
0 F8 0 FE 0 F8 86 F8 0 F8 66 F8 78 F8 86 F8 7E F8 80 F8 66 F8 0 F8 0 F8 78 F8 86 F8 78 F8 0 F8 0 F8 78 F8 86 F8 78 F8 0 F8 0 F8 7E F8 86 F8 7E F8 0 F8 0 F8 6 F8 18 F8 0 F8 1E F8 78 80 FE 0 F8 0 FE 0 F8 86 F8 0 F8 66 F8 78 F8 86 F8 7E F8 80 F8 66 F8 0 F8 0 F8 78 F8 86 F8 78 F8 0 F8 0 F8 78 F8 86 F8 78 F8 0 F8 0 F8 7E F8 86 F8 7E F8 0 F8 0 F8 6 F8 18 F8 0 F8 1E F8 78 80 FE 18 0 FE 0 18 FE 78 0 98 E6 0 E0 18 F8 0 E0 6 18 78 0 98 E6 0 E0 18 F8 0 E0 6 18 18 6 E0 0 1E E0 6 F8 6 FE 60 0 0 0 0 0 0 0 0 0 0 0 6
618ms
0
4ms
0
5ms
0
5ms
0
5ms
18 FE 6 F8 6 F8 E0 FE 18 F8 7E E0 66 60 F8 18 FE 66 1E FE 78 FE F8 6 78 86 98
105ms
6 F8 6 FE 60 0 0
24ms
0
4ms
0
5ms
0
6ms
0
5ms
0
5ms
0
5ms
0
4ms
0
4ms
0
5ms
6
5ms
0
6ms
0
5ms
0
5ms
0
4ms
18 FE 6 F8 6 F8 E6 FE 18 F8 7E E0 66 60 F8 18 FE 66 1E FE 7E FE F8 6 78 9E 98
104ms
6 F8 6 FE 60 0 0
25ms
0
5ms
0
5ms
0
5ms
0
5ms
0
5ms
0
5ms
0
5ms
0
5ms
0
5ms
6
5ms
0
5ms
0
4ms
0
5ms
0
6ms
6 FE 6 F8 6 F8 E0 FE 18 F8 7E E0 66 60 F8 18 FE 66 1E FE 66 FE F8 6 78 7E FE
104ms
6 F8 6 FE 60 0 0
26ms
0
5ms
0
4ms
0
4ms
0
5ms
0
5ms
0
5ms
0
5ms
0
6ms
0
4ms
6
4ms
0
5ms
0
5ms
0
5ms
0
5ms
6 FE 6 F8 6 F8 E0 FE 18 F8 7E E0 66 60 F8 18 FE 66 60 FE 78 FE F8 6 78 86 98
105ms
6 F8 6 FE 60 0 0
24ms
0
4ms
0
6ms
0
5ms
0
5ms
0
5ms
0
5ms
0
4ms
0
4ms
0
5ms
6
5ms
0
6ms
0
5ms
0
5ms
0
4ms
18 FE 6 F8 6 F8 E6 FE 18 F8 7E E0 66 60 F8 18 FE 66 1E FE 78 FE F8 6 78 98 98
105ms
6 F8 6 FE 60 0 0
25ms
0
5ms
0
5ms
0
5ms
0
4ms
0
5ms
0
5ms
0
5ms
0
5ms
0
5ms
6
5ms
0
4ms
0
4ms
0
5ms
0
6ms
6 FE 6 F8 6 F8 E0 FE 18 F8 7E E0 66 60 F8 18 FE 66 1E FE 66 FE F8 6 78 7E FE
104ms
6 F8 6 FE 60 0 0
25ms
0
5ms
0
4ms
0
4ms
0
5ms
0
5ms
0
5ms
0
5ms
0
6ms
0
4ms
6
4ms
0
5ms
0
5ms
0
5ms
0
5ms
18 FE 6 F8 6 F8 E0 FE 18 F8 7E E0 66 60 F8 18 FE 66 60 FE 78 FE F8 6 78 98 98
105ms
6 F8 6 FE 60 0 0
24ms
0
4ms
0
6ms
0
5ms
0
5ms
0
5ms
0
4ms
0
4ms
0
5ms
0
5ms
6
5ms
0
6ms
0
5ms
0
5ms
0
5ms
18 FE 18 F8 6 F8 E6 FE 18 F8 7E E0 66 60 F8 18 FE 66 1E FE 7E FE F8 6 78 E0 98
104ms
6 F8 6 FE 60 0 0
25ms
0
5ms
0
5ms
0
5ms
0
4ms
0
5ms
0
5ms
0
5ms
0
5ms
0
5ms
6
5ms
0
4ms
0
4ms
0
4ms
0
6ms
6 FE 18 F8 6 F8 E6 FE 18 F8 7E E0 66 60 F8 18 FE 66 1E FE 66 FE F8 6 78 86 98
104ms
6 F8 6 FE 60 0 0
25ms
0
5ms
0
4ms
0
5ms
0
5ms
0
5ms
0
5ms
0
5ms
0
6ms
0
4ms
6
5ms
0
5ms
0
5ms
0
5ms
0
5ms
6 FE 6 F8 6 F8 E6 FE 18 F8 7E E0 66 60 F8 18 FE 66 60 FE 78 FE F8 6 78 98 98
105ms
6 F8 6 FE 60 0 0
24ms
0
5ms
0
6ms
0
5ms
0
5ms
0
5ms
0
4ms
0
4ms
0
5ms
0
5ms
6
5ms
0
6ms
0
5ms
0
5ms
0
4ms
6 FE 18 F8 6 F8 E0 FE 18 F8 7E E0 66 60 F8 18 FE 66 1E FE 7E FE F8 6 78 98 98
104ms
6 F8 6 FE 60 0 0
25ms
0
5ms
0
5ms
0
5ms
0
4ms
0
5ms
0
5ms
0
5ms
0
5ms
0
5ms
6
5ms
0
5ms
0
4ms
0
4ms
0
6ms
6 FE 6 F8 6 F8 E6 FE 18 F8 7E E0 66 60 F8 18 FE 66 1E FE 66 FE F8 6 78 80 98
104ms
6 F8 6 FE 60 0 0
25ms
0
4ms
0
4ms
0
5ms
0
5ms
0
5ms
0
5ms
0
5ms
0
6ms
0
5ms
6
4ms
0
4ms
0
5ms
0
5ms
0
5ms
6 FE 6 F8 6 F8 E0 FE 18 F8 7E E0 66 60 F8 18 FE 66 18 FE 78 FE F8 6 78 7E FE
105ms
6 F8 6 FE 60 0 0
24ms
0
5ms
0
6ms
0
5ms
0
5ms
0
5ms
0
4ms
0
4ms
0
4ms
0
5ms
6
5ms
0
6ms
0
5ms
0
5ms
0
4ms
18 FE 6 F8 6 F8 E6 FE 18 F8 7E E0 66 60 F8 18 FE 66 1E FE 66 FE F8 6 78 86 98
104ms
6 F8 6 FE 60 0 0
25ms
0
5ms
0
5ms
0
4ms
0
4ms
0
6ms
0
5ms
0
5ms
0
5ms
0
5ms
6
5ms
0
5ms
0
4ms
0
5ms
0
5ms
6 FE 6 F8 6 F8 9E FE 18 F8 7E E0 66 60 F8 18 FE 66 1E FE 78 FE F8 6 78 7E FE
104ms
6 F8 6 FE 60 0 0
25ms
0
4ms
0
4ms
0
5ms
0
5ms
0
5ms
0
5ms
0
5ms
0
6ms
0
4ms
6
4ms
0
5ms
0
5ms
0
5ms
0
5ms
18 FE 6 F8 6 F8 E0 FE 18 F8 7E E0 66 60 F8 18 FE 66 1E FE 7E FE F8 6 78 98 98
105ms
6 F8 6 FE 60 0 0
24ms
0
5ms
0
6ms
0
5ms
0
5ms
0
5ms
0
5ms
0
4ms
0
4ms
0
5ms
6
6ms
0
5ms
0
5ms
0
5ms
0
4ms
18 FE 18 F8 6 F8 E6 FE 18 F8 7E E0 66 60 F8 18 FE 66 1E FE 66 FE F8 6 78 98 98
104ms
6 F8 6 FE 60 0 0
25ms
0
5ms
0
5ms
0
5ms
0
5ms
0
5ms
0
4ms
0
5ms
0
5ms
0
5ms
6
5ms
0
5ms
0
4ms
0
6ms
0
5ms
6 FE 6 F8 6 F8 E0 FE 18 F8 7E E0 66 60 F8 18 FE 66 60 FE 78 FE F8 6 78 86 98
104ms
6 F8 6 FE 60 0 0
26ms
0
4ms
0
4ms
0
4ms
0
5ms
0
5ms
0
5ms
0
6ms
0
5ms
0
4ms
6
4ms
0
5ms
0
5ms
0
5ms
0
5ms
18 FE 6 F8 6 F8 E0 FE 18 F8 7E E0 66 60 F8 18 FE 66 1E FE 78 FE F8 6 78 86 98
105ms
6 F8 6 FE 60 0 0
24ms
0
5ms
0
6ms
0
5ms
0
5ms
0
5ms
0
5ms
0
4ms
0
4ms
0
5ms
6
6ms
0
5ms
0
5ms
0
5ms
0
4ms
18 FE 6 F8 6 F8 E6 FE 18 F8 7E E0 66 60 F8 18 FE 66 1E FE 66 FE F8 6 78 86 98
104ms
6 F8 6 FE 60 0 0
25ms
0
5ms
0
5ms
0
5ms
0
4ms
0
4ms
0
5ms
0
5ms
0
5ms
0
5ms
6
5ms
0
4ms
0
4ms
0
6ms
0
5ms
6 FE 6 F8 6 F8 9E FE 18 F8 7E E0 66 60 F8 18 FE 66 1E FE 66 FE F8 6 78 78 FE
104ms
6 F8 6 FE 60 0 0
26ms
0
5ms
0
4ms
0
4ms
0
5ms
0
5ms
0
5ms
0
6ms
0
5ms
0
4ms
6
4ms
0
5ms
0
5ms
0
5ms
0
5ms
18 FE 6 F8 6 F8 E0 FE 18 F8 7E E0 66 60 F8 18 FE 66 1E FE 78 FE F8 6 78 86 98
105ms
6 F8 6 FE 60 0 0
24ms
0
4ms
0
6ms
0
5ms
0
5ms
0
5ms
0
5ms
0
4ms
0
5ms
0
5ms
6
6ms
0
5ms
0
5ms
0
4ms
0
4ms
18 FE 18 F8 6 F8 E6 FE 18 F8 7E E0 66 60 F8 18 FE 66 1E FE 78 FE F8 6 78 9E 98
105ms
6 F8 6 FE 60 0 0
25ms
0
5ms
0
5ms
0
5ms
0
5ms
0
4ms
0
5ms
0
5ms
0
5ms
0
5ms
6
5ms
0
4ms
0
4ms
0
6ms
0
5ms
6 FE 18 F8 6 F8 E0 FE 18 F8 7E E0 66 60 F8 18 FE 66 1E FE 66 FE F8 6 78 80 98
104ms
6 F8 6 FE 60 0 0
26ms
0
5ms
0
4ms
0
5ms
0
5ms
0
5ms
0
5ms
0
6ms
0
5ms
0
4ms
6
4ms
0
5ms
0
5ms
0
5ms
0
5ms
18 FE 6 F8 6 F8 E0 FE 18 F8 7E E0 66 60 F8 18 FE 66 60 FE 78 FE F8 6 78 98 98
105ms
6 F8 6 FE 60 0 0
24ms
0
6ms
0
5ms
0
5ms
0
5ms
0
5ms
0
4ms
0
4ms
0
5ms
0
5ms
6
6ms
0
5ms
0
5ms
0
4ms
0
4ms
18 FE 6 F8 6 F8 E6 FE 18 F8 7E E0 66 60 F8 18 FE 66 1E FE 78 FE F8 6 78 98 98
105ms
6 F8 6 FE 60 0 0
25ms
0
5ms
0
5ms
0
5ms
0
5ms
0
4ms
0
5ms
0
5ms
0
5ms
0
5ms
6
5ms
0
4ms
0
4ms
0
6ms
0
5ms
6 FE 6 F8 6 F8 E0 FE 18 F8 7E E0 66 60 F8 18 FE 66 1E FE 66 FE F8 6 78 7E FE
104ms
6 F8 6 FE 60 0 0
25ms
0
4ms
0
4ms
0
5ms
0
5ms
0
5ms
0
5ms
0
6ms
0
4ms
0
4ms
6
5ms
0
5ms
0
5ms
0
5ms
0
5ms
18 FE 6 F8 6 F8 E6 FE 18 F8 7E E0 66 60 F8 18 FE 66 1E FE 78 FE F8 6 78 98 98
105ms
6 F8 6 FE 60 0 0
24ms
0
6ms
0
5ms
0
5ms
0
5ms
0
5ms
0
4ms
0
4ms
0
5ms
0
5ms
6
6ms
0
5ms
0
5ms
0
5ms
0
4ms
18 FE 18 F8 6 F8 E0 FE 18 F8 7E E0 66 60 F8 18 FE 66 1E FE 78 FE F8 6 78 98 98
105ms
6 F8 6 FE 60 0 0
24ms
0
5ms
0
5ms
0
5ms
0
5ms
0
5ms
0
5ms
0
5ms
0
5ms
0
5ms
6
5ms
0
5ms
0
4ms
0
5ms
0
5ms
6 FE 6 F8 6 F8 E6 FE 18 F8 7E E0 66 60 F8 18 FE 66 1E FE 66 FE F8 6 78 80 98
104ms
6 F8 6 FE 60 0 0
25ms
0
4ms
0
4ms
0
5ms
0
5ms
0
5ms
0
5ms
0
6ms
0
4ms
0
4ms
6
5ms
0
5ms
0
5ms
0
5ms
0
5ms
6 FE 6 F8 6 F8 E6 FE 18 F8 7E E0 66 60 F8 18 FE 66 60 FE 78 FE F8 6 78 98 98
105ms
6 F8 6 FE 60 0 0
24ms
0
6ms
0
5ms
0
5ms
0
5ms
0
5ms
0
4ms
0
4ms
0
5ms
0
5ms
6
6ms
0
5ms
0
5ms
0
5ms
0
4ms
18 FE 6 F8 6 F8 E0 FE 18 F8 7E E0 66 60 F8 18 FE 66 1E FE 66 FE F8 6 78 80 98
105ms
6 F8 6 FE 60 0 0
24ms
0
5ms
0
5ms
0
4ms
0
5ms
0
5ms
0
5ms
0
5ms
0
5ms
0
5ms
6
5ms
0
5ms
0
4ms
0
4ms
0
5ms
6 FE 6 F8 6 F8 9E FE 18 F8 7E E0 66 60 F8 18 FE 66 60 FE 66 FE F8 6 78 7E FE
104ms
6 F8 6 FE 60 0 0
26ms
0
4ms
0
4ms
0
5ms
0
5ms
0
5ms
0
5ms
0
6ms
0
5ms
0
4ms
6
4ms
0
5ms
0
5ms
0
5ms
0
5ms
6 FE 6 F8 6 F8 E0 FE 18 F8 7E E0 66 60 F8 18 FE 66 1E FE 78 FE F8 6 78 80 98
105ms
6 F8 6 FE 60 0 0
24ms
0
6ms
0
5ms
0
5ms
0
5ms
0
4ms
0
5ms
0
4ms
0
4ms
0
5ms
6
6ms
0
5ms
0
5ms
0
5ms
0
4ms
18 FE 6 F8 6 F8 E6 FE 18 F8 7E E0 66 60 F8 18 FE 66 1E FE 66 FE F8 6 78 86 98
105ms
6 F8 6 FE 60 0 0
24ms
0
5ms
0
5ms
0
4ms
0
5ms
0
5ms
0
5ms
0
5ms
0
5ms
0
5ms
6
5ms
0
4ms
0
5ms
0
5ms
0
5ms
6 FE 6 F8 6 F8 E6 FE 18 F8 7E E0 66 60 F8 18 FE 66 1E FE 66 FE F8 6 78 80 98
104ms
6 F8 6 FE 60 0 0
26ms
0
4ms
0
5ms
0
5ms
0
5ms
0
5ms
0
5ms
0
6ms
0
5ms
0
4ms
6
4ms
0
5ms
0
5ms
0
5ms
0
5ms
18 FE 18 F8 6 F8 E0 FE 18 F8 7E E0 66 60 F8 18 FE 66 1E FE 78 FE F8 6 78 98 98
105ms
6 F8 6 FE 60 0 0
24ms
0
6ms
0
5ms
0
5ms
0
5ms
0
5ms
0
5ms
0
4ms
0
5ms
0
6ms
6
5ms
0
5ms
0
5ms
0
5ms
0
4ms
18 FE 18 F8 6 F8 E6 FE 18 F8 7E E0 66 60 F8 18 FE 66 1E FE 66 FE F8 6 78 98 98
106ms
6 F8 6 FE 60 0 0
24ms
0
5ms
0
5ms
0
5ms
0
5ms
0
4ms
0
5ms
0
5ms
0
5ms
0
5ms
6
5ms
0
4ms
0
5ms
0
5ms
0
5ms
18 FE 6 F8 6 F8 E6 FE 18 F8 7E E0 66 60 F8 18 FE 66 1E FE 78 FE F8 6 78 98 98
104ms
6 F8 6 FE 60 0 0
25ms
0
5ms
0
4ms
0
4ms
0
5ms
0
5ms
0
6ms
0
5ms
0
5ms
0
4ms
6
4ms
0
5ms
0
5ms
0
5ms
0
5ms
18 FE 6 F8 6 F8 E0 FE 18 F8 7E E0 66 60 F8 18 FE 66 1E FE 78 FE F8 6 78 86 98 18 18 FE 0
105ms
60 FE
23ms
78
6ms
0
5ms
98 E6 0 E0 18 F8 0 E0 6 18
А вот, кстати, лог от Опель-сканер ECU какой красивый получился:
175ms
0
50ms
81 11 F1 81 4
61ms
83 F1 11 C1 EF 8F C4
137ms
82 11 F1 1A 81 1F
71ms
A2 F1 11 5A 81 4 90 6F 62 3 98 6A 3 99 44 3 92 44 3 91 6B 3 94 64 3 95 2 3 96 66 3 97 66 3 9A 2 FF D3 82 11 F1 1A 80 1E 80 F1 11 44 5A 80 57 30 4C 30 30 30 30 33 36 56 31 31 36 36 37 37 32 53 30 30 31 30 30 34 39 32 34 19 98 12 14 16 20 22 80 31 36 32 30 32 20 30 81 11 F1 3E C1 81 F1 11 7E 1 84 11 F1 18 0 FF 0 9D 85 F1 11 58 1 1 70 22 73 81 11 F1 3E C1 81 F1 11 7E 1 81 11 F1 3E C1 81 F1 11 7E 1 81 11 F1 3E C1 81 F1 11 7E 1 81 11 F1 3E C1 81 F1 11 7E 1
1676ms
81 11 F1 3E C1
66ms
81 F1 11 7E 1
133ms
81 11 F1 3E C1
68ms
81 F1 11 7E 1
134ms
81 11 F1 3E C1
65ms
81 F1 11 7E 1
133ms
81 11 F1 3E C1
67ms
81 F1 11 7E 1
134ms
81 11 F1 3E C1
66ms
81 F1 11 7E 1
135ms
81 11 F1 3E C1
65ms
81 F1 11 7E 1
133ms
81 11 F1 3E C1
66ms
81 F1 11 7E 1
135ms
81 11 F1 3E C1
64ms
81 F1 11 7E 1
133ms
81 11 F1 3E C1
67ms
81 F1 11 7E 1
134ms
81 11 F1 3E C1
67ms
81 F1 11 7E 1
132ms
81 11 F1 3E C1
66ms
81 F1 11 7E 1
135ms
81 11 F1 3E C1
66ms
81 F1 11 7E 1
135ms
81 11 F1 3E C1
66ms
81 F1 11 7E 1
134ms
81 11 F1 3E C1
67ms
81 F1 11 7E 1
135ms
81 11 F1 3E C1
65ms
81 F1 11 7E 1
134ms
81 11 F1 3E C1
66ms
81 F1 11 7E 1
134ms
81 11 F1 3E C1
67ms
81 F1 11 7E 1
133ms
81 11 F1 3E C1
67ms
81 F1 11 7E 1
133ms
81 11 F1 3E C1
66ms
81 F1 11 7E 1
136ms
81 11 F1 3E C1
65ms
81 F1 11 7E 1
133ms
81 11 F1 3E C1
68ms
81 F1 11 7E 1
134ms
81 11 F1 3E C1
65ms
81 F1 11 7E 1
133ms
81 11 F1 3E C1
67ms
81 F1 11 7E 1
135ms
81 11 F1 3E C1
66ms
81 F1 11 7E 1
137ms
81 11 F1 3E C1
64ms
81 F1 11 7E 1
134ms
81 11 F1 3E C1
67ms
81 F1 11 7E 1
135ms
81 11 F1 3E C1
64ms
81 F1 11 7E 1
135ms
81 11 F1 3E C1
66ms
81 F1 11 7E 1
134ms
81 11 F1 3E C1
67ms
81 F1 11 7E 1
132ms
81 11 F1 3E C1
67ms
81 F1 11 7E 1
134ms
81 11 F1 3E C1
66ms
81 F1 11 7E 1
136ms
81 11 F1 3E C1
65ms
81 F1 11 7E 1
133ms
81 11 F1 3E C1
67ms
81 F1 11 7E 1
138ms
84 11 F1 18 0 FF 0 9D
86ms
85 F1 11 58 1 1 70 22 73
137ms
81 11 F1 3E C1
63ms
81 F1 11 7E 1
135ms
81 11 F1 3E C1
66ms
81 F1 11 7E 1
133ms
81 11 F1 3E C1
67ms
81 F1 11 7E 1
135ms
81 11 F1 3E C1
65ms
81 F1 11 7E 1
133ms
81 11 F1 3E C1
68ms
81 F1 11 7E 1
136ms
81 11 F1 3E C1
65ms
81 F1 11 7E 1
133ms
81 11 F1 3E C1
67ms
81 F1 11 7E 1
138ms
84 11 F1 18 0 FF 0 9D
87ms
85 F1 11 58 1 1 70 22 73
137ms
81 11 F1 3E C1
62ms
81 F1 11 7E 1
135ms
81 11 F1 3E C1
66ms
81 F1 11 7E 1
135ms
81 11 F1 3E C1
66ms
81 F1 11 7E 1
134ms
81 11 F1 3E C1
67ms
81 F1 11 7E 1
135ms
81 11 F1 3E C1
65ms
81 F1 11 7E 1
133ms
81 11 F1 3E C1
67ms
81 F1 11 7E 1
134ms
81 11 F1 3E C1
67ms
81 F1 11 7E 1
133ms
81 11 F1 3E C1
68ms
81 F1 11 7E 1
133ms
81 11 F1 3E C1
66ms
81 F1 11 7E 1
135ms
81 11 F1 3E C1
66ms
81 F1 11 7E 1
134ms
82 11 F1 21 1 A6
74ms
B0 F1 11 61 1 1 1 70 22 0 0 0 F9 75 48 68 36 6E 8A F 34 0 0 0 0 0 1E 0 0 0 FF 49 0 0 65 80 12 73 0 FF 4A 0 0 80 84 8 27 34 0 0 0 B7 82 11 F1 21 1 A6 B0 F1 11 61 1 1 1 70 22 0 0 0 F9 75 48 68 36 6E 8A F 34 0 0 0 0 0 1E 0 0 0 FF 49 80 82 11 F1 21 1 A6 B0 F1 11 61 1 1 1 70 22 0 0 0 F9 75 48 68 0 65 34 82 11 F1 21 1 A6 B0 F1 11 61 1 1 1 70 22 0 0 0 F9 75 48 0 73 0 82 11 F1 21 1 A6 B0 F1 11 61 1 1 1 70 22 0 0 0 F9 75 36 0 0 82 11 F1 21 1 A6 B0 F1 11 61 1 1 1 70 22 0 0 0 F9 75 48 F 0 8 82 11 F1 21 1 A6 B0 F1 11 61 1 1 1 70 22 0 0 0 F9 75 48 0 65 34 82 11 F1 21 1 A6 B0 F1 11 61 1 1 1 70 22 0 0 0 F9 75 48 0 12 0 82 11 F1 21 1 A6 B0 F1 11 61 1 1 1 70 22 0 0 0 F9 75 48 0 12 0 82 11 F1 21 1 A6 B0 F1 11 61 1 1 1 70 22 0 0 0 F9 75 36 0 0 82 11 F1 21 1 A6 B0 F1 11 61 1 1 1 70 22 0 0 0 F9 75 48 68 34 0 27 82 11 F1 21 1 A6 B0 F1 11 61 1 1 1 70 22 0 0 0 F9 75 48 0 12 0 82 11 F1 21 1 A6 B0 F1 11 61 1 1 1 70 22 0 0 0 F9 75 36 0 0 82 11 F1 21 1 A6 B0 F1 11 61 1 1 1 70 22 0 0 0 F9 75 48 F 0 8 82 11 F1 21 1 A6 B0 F1 11 61 1 1 1 70 22 0 0 0 F9 75 48 0 65 34 82 11 F1 21 1 A6 B0 F1 11 61 1 1 1 70 22 0 0 0 F9 75 48 0 12 0 82 11 F1 21 1 A6 B0 F1 11 61 1 1 1 70 22 0 0 0 F9 75 68 0 0 82 11 F1 21 1 A6 B0 F1 11 61 1 1 1 70 22 0 0 0 F9 75 48 F 0 8 82 11 F1 21 1 A6 B0 F1 11 61 1 1 1 70 22 0 0 0 F9 75 48 0 65 34 82 11 F1 21 1 A6 B0 F1 11 61 1 1 1 70 22 0 0 0 F9 75 48 0 12 0 82 11 F1 21 1 A6 B0 F1 11 61 1 1 1 70 22 0 0 0 F9 75 68 0 0 82 11 F1 21 1 A6 B0 F1 11 61 1 1 1 70 22 0 0 0 F9 75 48 F 0 8 81 11 F1 3E C1 81 F1 11 7E 1 81 11 F1 3E C1 81 F1 11 7E 1 81 11 F1 3E C1 81 F1 11 7E 1 81 11 F1 3E C1 81 F1 11 7E 1 81 11 F1 3E C1 81 F1 11 7E 1 81 11 F1 3E C1
6497ms
81 F1 11 7E 1
132ms
81 11 F1 3E C1
67ms
81 F1 11 7E 1
133ms
81 11 F1 3E C1
68ms
81 F1 11 7E 1
134ms
81 11 F1 3E C1
66ms
81 F1 11 7E 1
135ms
81 11 F1 3E C1
65ms
81 F1 11 7E 1
133ms
81 11 F1 3E C1
67ms
81 F1 11 7E 1
135ms
81 11 F1 3E C1
66ms
81 F1 11 7E 1
133ms
81 11 F1 3E C1
67ms
81 F1 11 7E 1
133ms
81 11 F1 3E C1
65ms
81 F1 11 7E 1
133ms
81 11 F1 3E C1
68ms
81 F1 11 7E 1
134ms
81 11 F1 3E C1
67ms
81 F1 11 7E 1
134ms
81 11 F1 3E C1
64ms
81 F1 11 7E 1
135ms
81 11 F1 3E C1
66ms
81 F1 11 7E 1
135ms
81 11 F1 3E C1
66ms
81 F1 11 7E 1
133ms
81 11 F1 3E C1
67ms
81 F1 11 7E 1
134ms
81 11 F1 3E C1
66ms
81 F1 11 7E 1
133ms
81 11 F1 82 5
67ms
81 F1 11 C2 45
Почитал... завис :) Долго переваривать буду, ну не программер я.... так, рядом пробегал.
Хорошо, получается, что у меня практически все сходится с ТС? Но тем не менее, как же заставить общаться с приборкой и ЭБУ по одному пину? Я так предполагаю, что читать данные пробега и бака можно при включении зажигания только, а дальше уже при выключении заносить в EEPROM. Но тогда пробег придется через скорость/время считать, из-за чего расхождения могут быть....
Попробую выпилить из скетча все упоминания про несипользуемые пока библиотеки, кнопки и экран. Может на UNO получится в сериале потестить?
да щас напишу обмен с приборкой. Можно будет чередовать обмен ЭБУ и щитка, ниче в этом такого плохого нет. Ну будет немного затупать в момент обмена со считком, но это редко (раз в минуту например) .
если нет соединения, вот ещё скетч вверху выбираем и пробуем разные скорости инита (5 или 200 baud) и разные адреса панели (0xE0, 0xE1, 0xB8, 0XB9, 0xBA)
#define BAUD_200 0
#define BAUD_5 1
bool Protocol = BAUD_200; // тут выбираем протокол 200 baud или 5 baud
byte GAUGE_ADDRESS = 0xE0; // тут выбираем адрес панели. Возможные варианты 0xE0, 0xE1, 0xB8, 0XB9, 0xBA
int bit_time = 0;
#include <SoftwareSerial.h>
#define RX_gauge 7
#define TX_gauge 8
SoftwareSerial Gauge_K_line (RX_gauge, TX_gauge);
bool InitGauge = 0; // флаг инита панели
void setup() {
Serial.begin (9600); //открываем соединение терминала для отладки
pinMode (TX_gauge, OUTPUT);
digitalWrite (TX_gauge, 1); // BUS idle
delay (2000);
// далее посылаем на панель адрес на скорости 5 baud или 200 baud
Serial.print("Delayu zapros na panel. Adress: "); Serial.println(GAUGE_ADDRESS, HEX);
if (Protocol) {bit_time = 200; Serial.println("5 baud Init"); }
else {bit_time = 5; Serial.println("200 baud Init"); }
digitalWrite (TX_gauge, 0); delay (bit_time); // старт бит
for(byte i = 0; i<8; i++) {digitalWrite (TX_gauge, bitRead(GAUGE_ADDRESS,i)); delay(bit_time);}
digitalWrite (TX_gauge, 1); delay (bit_time); // стоп бит
Gauge_K_line.begin(4800); // открываем к-лайн на приборку на 4800
}
byte head_count = 0;
byte head[4] = {0};
void loop() {
while(!InitGauge){
if (Gauge_K_line.available()) {
byte inByte = Gauge_K_line.read();
Serial.print(" ");
Serial.print(inByte,HEX);
if (inByte==0x80) {Gauge_K_line.write (0x7F); delay (2);}
if (inByte==0x78) {
Gauge_K_line.write (0x02); delay (2);
Gauge_K_line.write (0x11); delay (2);
Gauge_K_line.write (byte(0x00)); delay (2);
Gauge_K_line.write (0x13); delay (2); InitGauge=1; Serial.println("Ura! Panel init proshla uspeshno!"); }}}
if (InitGauge && Gauge_K_line.available()) {
// ниже ищем шапку кадра
byte inbyte = Gauge_K_line.read();
delay (7);
if (inbyte == 0x21 && head_count == 0) {head_count = 1; head[0] = inbyte; }
else if (inbyte == 0xA1 && head_count == 1) {head_count = 2; head[1] = inbyte; }
else if (inbyte == 0x04 && head_count == 2) {head_count = 3; head[2] = inbyte; }
else {head_count = 0; for (byte i=0; i<sizeof(head); i++) head[i] = 0;}
// нашли шапку:
if (head_count == 3){
head_count = 0; // очищаем переменную поиска шапки
byte Length = head[0];
if (Length>100)Length=100;
const byte sizeMes = Length+2;
byte MessageRx [sizeMes] = {0};
uint16_t crc = 0;
for (byte i=0; i<3; i++){MessageRx[i]= head[i]; crc += MessageRx[i]; head[i] = 0; Serial.print (MessageRx[i], HEX); Serial.print (" ");} // очищаем переменные поиска шапки
bool CRC_OK = 0;
// ниже пишем сообщение в буфер и считаем КС
for (byte i = 3; i < sizeMes; i++) { MessageRx[i] = Gauge_K_line.read(); if (i!=sizeMes-2) crc += MessageRx[i]; delay (7); Serial.print (MessageRx[i], HEX); Serial.print (" "); }
Serial.println();
int CRC = ( ( unsigned int )MessageRx [sizeMes-2] << 8 ) | MessageRx [sizeMes-1];
if (CRC==crc) CRC_OK = 1;
if (CRC_OK){
Serial.println ("Ya prinyal pravilnye parametry ot paneli pribirov!!!");
} // конец ифа с правильной CRC
else Serial.println("CRC FAIL!!!");
}
}
}
А у вас же есть юсб клайн адаптер? Подключите к-лайн_дуню к нему. Покидайте в нее байтами на 4800 через терминальную программу. Посмотрите в мониторе порта дуни прилетают ли? Сдается мне что то подключили неправильно
не понял, почему после фразы Ura! Panel init proshla uspeshno! опять попытки инита, там должно сразу выйти из цикла while. иливы скетч поменяли? выкладывайте скетч
нижний лог вообщето это не мусор, это уже полезные параметры со щитка пошли, такчто видимо 150 надо и еще задержку в строке 087 увеличить, а то не всегда все байты успевает захватить
В вашем сниффе немного неправильно скомпанованы кадры, поэтому затруднительно понимать что к чему. Сначала пытаемся увидеть зависмости и выловить начала и концы кадров, у меня получилось так:
объясню смысл сообщений (кадров) в таких протоколах. Скажу сразу что эта инфа не является истиной, а лишь мои догадки.
Первый байт (а правильнее нулевой) содержит информацию о длине посылки. Длина это количество байт за исключением самого байта длины, байтов адреса и контрольной суммы. У байта длины нужно убрать старший бит (самый левый) тогда получим правильную длину. Это можно сделать в виндовом калькуляторе. после чего можно перевести в удобный для нас DEC в том же калькуляторе.
например, разберём сообщение 82 11 F1 21 01 A6 . Берём виндовый калькулятор
82 - переводим в BIN 10000010 убираем левую единицу получаем в BIN 00000010 или просто 10 т.е. 2 в DEC (это длина кадра - два байта, забегая вперёд: 21 01 )
11 - адрес получателя кадра (в данном случае сообщение адресовано на PCM автомобиля, адрес 11)
F1 - адрес отправителя кадра (F1 - надо полагать это адрес диагностики)
21 01 - команда или полезная информация сообщения (вот это и есть функциональная тобишь смысловая нагрузка сообщения, длину которой и показывает нулевой байт в сообщении). Все остальные байты в сообшении служебные (поэтому основные байты выделил жирным).
A6 - контрольная сумма (CRC) всех предыдущих байт кадра. Просто сложение, если сумма всех байт будет больше чем один байт (255 или тоже самое 0xFF) то берётся самый младший (правый байт). На примере нашего кадра CRC получается в HEX 1A6 соответсвенно берётся A6
Есть один нюанс с нулевым байтом кадра, который показывает длину. Если старший (левый) полубайт (ниббл) равен 8, а младший (правый) равен 0 , (т.е. байт такой: 0x80) соответствено если убрать старший бит получим в итоге длину 0. Такие сообщения есть - обычно это длинные сообщения. В таком случае длина кадра указывается дополнительным байтом, вставленным после байт адресов оправителя и получателя. Пример:
80 F1 11 44 5A 80 57 30 4C 30 30 30 30 33 36 56 31 31 36 36 37 37 32 53 30 30 31 30 30 34 39 32 34 19 98 12 14 16 20 22 80 31 36 32 30 32 33 31 39 20 4E 4C 43 4D 58 4A 0 8 44 39 36 30 30 33 58 31 36 58 45 4C 1 2 A3
вот смотрите после 80 F1 11 стоит 44 в DEC это 68. Не поленитесь, посчитайте количество байт после 44 - будет 68 байт и ещё один байт контрольной суммы (как мы помним - он не входит в длину).
А вот ответ вашего PCM на запрос параметров (82 11 F1 21 01 A6):
B0 F1 11 61 1 1 1 70 22 0 0 0 FA 79 33 78 51 C0 8A 12 34 0 0 0 0 0 1E 0 0 0 8B 26 0 0 56 80 12 74 0 FF 7B 0 0 0 84 8 27 34 0 0 0 33
смотрим, B0 без старшего бита это в DEC 48 считайте количество байт после B0 F1 11 - всё сходится. Можете сложить всё байты младший (правый) байт результата будет равен 33 в HEX.
Спасибо за науку... Вы то уже глаз наметали, а я б из этой мешанины вовек не выдрал правильных строк. Остается вопрос - почему сместились кадры? Может в коде снифера что-то доработать? И почему у меня не видно запроса инициализации от ОП-ком, как у ТС (81 11 F1 81 04 запрос инициализации).
Упс, сам спросил, сам увидел про задержку. Завтра буду играться. Может поэтому и пропускаю запрос инициализации...
вот вам эмулятор с данными вашей машины. Проверил PID ы также себя ведут, как я чуть выше приводил. такчто теперь вы знаете что и как в ответе на запрос параметров 21 01
интересен один момент корявости моей программы OPCOM k-line. Чуть выше я говорил про байт длины, что может по разному длину показывать, (либо просто байт либо при помощи дополнительного байта), дак вот ваша машина отвечает длиной без дополнительного байта :
B0 F1 11 61 1 1 1 70 22 0 0 0 FA 79 33 78 51 C0 8A 12 34 0 0 0 0 0 1E 0 0 0 8B 26 0 0 56 80 12 74 0 FF 7B 0 0 0 84 8 27 34 0 0 0 33
подставил так в эмулятор - не видит программа параметры. Подставил с дополнительным байтом - заработало:
80 F1 11 30 61 1 1 1 70 22 0 0 0 FA 79 33 78 51 C0 8A 12 34 0 0 0 0 0 1E 0 0 0 8B 26 0 0 56 80 12 74 0 FF 7B 0 0 0 84 8 27 34 0 0 0 33
кстати CRC при этом не меняется.
Вот более совершенный алгоритм получения-парсинга сообщений с проверкой CRC на примере всё того же эмулятора. (Этот алгоритм потом и в скетче итоговом можно использовать).
В эмуляторе ошибки DTC можно читать стирать. Если опять нажать стереть - они снова появляются, так для прикола сделал.
Остается вопрос - почему сместились кадры? Может в коде снифера что-то доработать?
Упс, сам спросил, сам увидел про задержку. Завтра буду играться.
да, скорее всего задержкой можно скомпоновать
И почему у меня не видно запроса инициализации от ОП-ком, как у ТС (81 11 F1 81 04 запрос инициализации).
Может поэтому и пропускаю запрос инициализации...
смотрите внимательнее свой сниф. Там есть этот запрос в строке с 8 по 10 .
Пытаюсь запустить эмулятор. Оп-ком К-лине упорно говорит что нет ответа от ECU. Драфйвера ваши, но скорость порта не могу поставить 10400
Не нужно ставить скорость порта. Какой у вас адаптер юсб-клайн?
Адаптер нужен на фтди иначе нужны танцы с бубном
Пытаюсь запустить эмулятор. Оп-ком К-лине упорно говорит что нет ответа от ECU. Драфйвера ваши, но скорость порта не могу поставить 10400
если ничего не получается со скоростью 10400 и нет фтди, ставьте в эмуляторе скорость 9600
Адаптер FTD1232, как вы давали ссылку. Сперва пробовал не меняя скорости, потом уже пытался ставить разную Результат одинаков..... Не могу понять что за ерунда. Завтра попробую на другом компе.
тут нужно внимательней. У ардуины точно K-line адаптер правильно подключен? на 7rx 8tx пин?
в Opcom точно выбираете RS232 и нужный компорт юсб-com адаптера? (делается через кнопку "установки" в проге OPCOM)
12В на к-лайны точно подаёте?
Не компилируется.
Ну да ладно, Вроде бы все мало-мальски полезные данные есть. Теперь бы с приборкой разобраться. Но она у меня тоже на PIN7. Это ж постоянно отключаться от одного блока и подключаться к другому нужно, будет же задержка в получении данных?
PS... у ТС за каждый показатель два байта отвечают, у меня один получается?
это в какой версии IDE компилируете? у меня всё норм
1.6.8 в более новых ошибки ползут при компилировании из-за TVout. Хотя странно те ошибки вылазят - то все нормально, то ошибка. Не может ли IDE оставлять мусор во временной папке?
1.8.5 грузите и пробуйте чисто мой скетч, должно компилироваться, иначе рестарт компа
и пишите что конкретно не получается. Выше писали, что прога OPCOM не видит эмулятор, сейчас уже оказывается не компилируется
какие данные диагностика в приборке видит? сниффить приборку надо на скорости 9600 или ещё может 4800
Прошу прощения... все получилось. Программа все увидела успешно. Скетч только предыдущий использовал. Без проверки CRC.
PS... у ТС за каждый показатель два байта отвечают, у меня один получается?
да, получается так. PID лист по другому выполнен.
Все же рекомендую разобраться со скетчем, который с CRC, там кроме crc, более правильное считывание сообщений. В конечном устройстве лучше такой алгоритм применять.
и нафиг вам эта тв оут. Поставьте отдельный экран и не мучайтесь. Подозреваю, что через тв оут такое разрешение будет стремное, что текста не видно будет.
Весь смысл сделать так, чтоб было похоже на заводской. Т.е. борткомп должен стоять в штатном месте, управляться штатными кнопками. Разрешение при этом 120х98. Что дает нам 9 строк и 12 столбцов текста. Я ж уже делал часики на нем. Читабельно. Показания все за раз задачи выводить не стоит, будет переключаться экран, как и в родном БК.
Но я тут нашел кое-что другое давеча, нужно почитать: http://forum.arduino.cc/index.php?topic=199170.0
Все равно пока Мегу жду, время есть
Пиды с формулами:
А вот таких PID у меня нет, но можно расчитать (немного другой двигатель):
И вот самое интересное, что по O2 Integrator легко расчитать Short Term Fuel Trim: (O2 Integrator-128)*100/128. Еще как-то бы на долгосрочную коррекцию выйти путем расчетов (Long Term Fuel Trim). Для тех, у кого стоит ГБО - это очень хорошее подспорье при настройке. Показывает обеднение/обогащение смеси в процентах.
бывает на некоторых автомобилях в принципе нет долговременной коррекции. На старых обычно, коим ваш авто и является. Подключитесь к приборке , показывает ли там остаток топлива в баке? и заснифить это нужно
авообще вам бы найти кого нибудь со штатным TID или MID и заснифить протокол.
Показывает через нормальный OP-COM. Через ОП-ком к-лайн ничего не показывает. Соединяется, но потом выдает CRC Error и все. Вот такой лог от него:
От нормального нужно так же на скорости 9600 и 4800 провертиь, сейчас пойду сниму сниф.
Посмотрел что будет при инициализации скетчем ТС. я так понимаю все нормально, инициализировалось, только при парсинге нужно пропускать некоторые байты.
Чего его искать? Вот он я :) Только нема там чего снифить. Он сам унутри себя расчитывает по приходящим сигналам, распиновку прилагаю:
Подходят к нему только сигнал с тахометра, скорости, расхода топлива ну и уровня топлива. Вот и все его общение. Подозреваю, сигналы там аналоговые. Пины с 8 по 11 - только для общения со штатной магнитолой.
а какие данные видятся если опком к нему подключить (по 8 пину ОБД получается)? если ваш адаптер Опком только к 7 пину подключается, попробуйте к-лайн опком - вдруг подключится . Косяк с прогой к-лайн опком скорее всего как раз в байте длины.
Да кроме кода прошивки и в некоторых машинах программирования индекса звука ничего там не видно. К моей ничего не подключается, подозреваю, т.к. MID от машины поновее и перепрошит под мой мотор через дилерский TECH2.
Логи....
Приборка через OP-COM на скорости 4800:
На скорости 9600
Приборка на скорости 4800 и Опель-сканер:
При скорости 9600:
А вот, кстати, лог от Опель-сканер ECU какой красивый получился:
правильная скорость 4800 только там сообщения обрываются, нужно задержки увеличить, т.к. скорость то низкая - байты дольше формируются.
а также читаем сообщение #819 этой темы
ага, вижу сниф со второго сканера - он нормально прошел. Скомпоновал его, всё сходится с ТС:
55 52 80
7F
20 A0 20 39 30 35 36 39 37 38 35 20 30 36 39 36 20 30 36 39 36 20 30 37 39 37 20 30 31 32 20 33 6 78
20 A0 20 39 30 35 36 39 37 38 35 20 30 36 39 36 20 30 36 39 36 20 30 37 39 37 20 30 31 32 20 33 6 78
2 B0 0 B2
6 F0 AA 10 32 10 1 F2
6 F0 AA 10 32 10 1 F2
2 11 0 13
21 A1 4 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 72 33 31 BB 32 17 F5 24 D2 5 B2 C6 3F 1 6 49
21 A1 4 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 71 31 31 BB 32 17 F5 24 D2 5 B3 C5 3F 1 6 46
21 A1 4 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 72 31 31 BC 32 17 F5 24 D2 5 B4 C5 3F 1 6 49
21 A1 4 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 72 32 31 BB 32 17 F5 24 D2 5 B3 C7 3F 1 6 4A
21 A1 4 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 72 32 31 BC 32 17 F5 24 D2 5 B4 C5 3F 1 6 4A
21 A1 4 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 71 31 31 BB 32 17 F5 24 D2 5 B2 C6 3F 1 6 46
21 A1 4 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 72 31 31 BC 32 17 F5 24 D2 5 B3 C5 3F 1 6 48
и т.д.
Почитал... завис :) Долго переваривать буду, ну не программер я.... так, рядом пробегал.
Хорошо, получается, что у меня практически все сходится с ТС? Но тем не менее, как же заставить общаться с приборкой и ЭБУ по одному пину? Я так предполагаю, что читать данные пробега и бака можно при включении зажигания только, а дальше уже при выключении заносить в EEPROM. Но тогда пробег придется через скорость/время считать, из-за чего расхождения могут быть....
Попробую выпилить из скетча все упоминания про несипользуемые пока библиотеки, кнопки и экран. Может на UNO получится в сериале потестить?
да щас напишу обмен с приборкой. Можно будет чередовать обмен ЭБУ и щитка, ниче в этом такого плохого нет. Ну будет немного затупать в момент обмена со считком, но это редко (раз в минуту например) .
вот пробуйте завязаться со щитком .. ИСПРАВИЛ!
update: Еще исправил
если нет соединения, вот ещё скетч вверху выбираем и пробуем разные скорости инита (5 или 200 baud) и разные адреса панели (0xE0, 0xE1, 0xB8, 0XB9, 0xBA)
Наиболее вероятен вариант с адресом 0xE0 init 5 baud
Глухо полностью. В серийник ничего не выводит абсолютно, с любыми вариантами.
А у вас же есть юсб клайн адаптер? Подключите к-лайн_дуню к нему. Покидайте в нее байтами на 4800 через терминальную программу. Посмотрите в мониторе порта дуни прилетают ли? Сдается мне что то подключили неправильно
Для проверки залил скетч на 5baut+2101 - он работает. Так что, наверное, подключено все правильно.
Там скорость сериал монитора 115200 стоит. В моем скетче 9600. Может вы на 115200 смотрели?
Упс :)
И все. С другими параметрами даже этих данных нет (55 52...)
Строка 047 пробовать убрать delay или наоборот пробовать больше сделать 5, 10, 25 может
Также delay пробуем переставить так и играемся его значением:
if (inByte==0x80) { delay (2); Gauge_K_line.write (0x7F); }
Методом научного тыка выяснено, что инит приборки проходит при минимальной зедержки - 70 мс. Причем проходит строго каждый второй инит.
Если выставить задержку 150 или больше, то там еще какой-то мусор сыпется и кричит CRC Error
не понял, почему после фразы Ura! Panel init proshla uspeshno! опять попытки инита, там должно сразу выйти из цикла while. иливы скетч поменяли? выкладывайте скетч
Кнопка ресет на Ардуинке :) Ну так, чисто убедится что оно не случайно инициализировалось
понятно. чето я намудрил с checksum похоже. Вроде все байты прилетают а пишет crc fail. Проверю
А как должно быть то? Как при 70 мс или как при 150?
нижний лог вообщето это не мусор, это уже полезные параметры со щитка пошли, такчто видимо 150 надо и еще задержку в строке 087 увеличить, а то не всегда все байты успевает захватить
исправил проблемы с Checksum