Здравейте,
Свързах го!!! Най - накрая.
Правилната комбинация се оказа 0x81, 0x0А, 0xF1, 0x81, 0xBD.
Това го видях от дебъг лога на unidiaga.
Пусках тази последователност и пак не стана.
Най-накрая пак с осцилоскопа и видях, че между байтовете нямам никакви паузи.
Един байт се предава като:
1. един старт бит.
2. 8 дита
3. стоп бит
Общо 10 бита.
При скорост 10400kbs това прави 10/10400 ~ 1ms.
Ето какво изкарва Unidiaga като го "затапя" (TxD<->RxD):
Както се вижда имаме по 7ms между байтовете.
Тоест имаме по 6ms пауза между байтовете.
Направих същия времеви интервал и най-накрая инициализирах връзката!
Утре ще пробвам няколко PID команди с терминала.
П.С. Намерих много добър материал за OBD командите.
Ето го:
http://obdexplained.hit.bg/OBD_protocols_explained.zipРазбрах формата на съобщението.
Има много изключения от правилото, но ще обясня, това, което се
използва от EDC17 и Unidiag-a.
[Format byte] [Target] [Source] [Data]...[Data] [CS]
Където:
Format byte: битове XXLL LLLL.
Ако XX = 10 -> физически адрес (използваният от нас)
Ако XX = 11 -> функционален адрес
LLLLLL определя дължината на данние и/или дали ще има байт
за дължина на данните.
Ако LLLLLL = 000000 - тогава имаме байт за дължина
(това не е нашия случай).
Ако LLLLLL е различно от 000000 тогава това число
определя броя на байтовете с данни.
Target: 0x0A адреса на ECU-то.
Source: 0xF1 адреса на тест устройството.
Data: данните, които предаваме, или приемаме
CS: Чек сума. Смята се като сума на всички байтве с данни и от
полученото число се взимат последните 8 бита.
Пример за инициализация:
1) 25ms ниско ниво
2) 25ms високо ниво
Това е еднократно (освен ако няма тайм аут от 5 сек.)
1) може да се постигне ако се прати 0x00 на 360bps.
3) 0x81 0x0A 0xF1 0x81 0xFD
0x81: 1000 0001. Имаме физическо адресиране и един байт данни
0x0A: адреса на еку-то
0xF1: адреса на тестера
0x81: Start Communication Request
0xFD: чек сума.
Еку-то трябва да отговори с:
0x83 0xF1 0x0A C1 0xYY oxZZ 0xCS
0x83 от тук се вижда, че байтовете са три.
0xF1 и 0x0A са съответно адресите на тестера и еку-то.
0xC1 е подтвърждение на рекуеста 0x81.
0xXX , 0xYY са ключовата дума.
С това инициализацията приключва.
Успях да получа данни от ЕКУ-то.
Интерфейса е 99% както на ELM327.
След инициализацията трябва да се поиска startDiagnosticSession .
Тук хватката е да се diagnostic mode = fa или по-фолямо число. Това са дисгностични режими на Фиат.
Тук бях ударил на камък. Но всичко си го пише в документа, няколко поста по-нагоре.
изпращам: 82 0a f1 10 fa
получавам: 7F 10 12 . Това според документа е отказ за диагностика: subFunctionNotSupported
След това може да се изискат данни от ЕКУ-то:
Километраж:
От Unidiag def файла: RDBLI_2000, 0x21, 0x03, "Odometer", 1, "Odometer", 1, "#scaling unsigned 3 X*1 km";
изпращам: 82 0a f1 21 03
получавам: 61 03 68 80 6E.
61 03 е отговора на 21 03 заявката.
68 80 6Е са данние.
Това е 6848622 десетично число.
Въпроса е как да го сметна ??? километража в момента е на 198997км.
"scaling unsigned 3" scaled числата са мащабирани. Тоест би трябвало да го разделя на 3 или на 10^3, не съм сигурен, но и по двата начина не става.
Напрежение на акумулатора:
От Unidiag def файла: RDBLI_2000, 0x21, 0x43, "Battery voltage", 1, "Battery voltage", 1, "#scaling unsigned 2 (X*20.372 + 700)/1000 Volt";
изпращам: 820af12143
получавам: 61 43 02 44
61 43 е отговора на 21 43 заявката.
02 44 са данние.
Това дава 580 десетично число.
(580 *20.372 + 700)/1000 Volt = 12,51V
Това е напрежение е ОК, обаче километража не е ОК.