[{"data":1,"prerenderedAt":1839},["Reactive",2],{"kb-nav":3,"kb-doc":96},[4,10,15,20,25,30,35,40,45,50,55,60,65,70,75,81,86,91],{"_path":5,"title":6,"description":7,"part":8,"chapterNumber":9},"/knowledge-base/networks/introduction","Introduction","Overview of the communication networks used in modern vehicles, from LIN to Automotive Ethernet.","Vehicle Networks & Protocols",1,{"_path":11,"title":12,"description":13,"part":8,"chapterNumber":14},"/knowledge-base/networks/vehicle-documentation","Vehicle Documentation","Where to find manufacturer wiring diagrams, J2534 passthrough devices, and the different types of diagrams that are useful when researching a vehicle.",2,{"_path":16,"title":17,"description":18,"part":8,"chapterNumber":19},"/knowledge-base/networks/lin-bus","Local Interconnect Network (LIN)","Local Interconnect Network — a single-wire low-speed bus used as a low-cost alternative to CAN for non-critical body electronics.",3,{"_path":21,"title":22,"description":23,"part":8,"chapterNumber":24},"/knowledge-base/networks/controller-area-network","Controller Area Network (CAN)","ISO 11898 — the differential bus that became the backbone of automotive networking. Frames, bit timing, errors, CAN FD, message contents, and practical attacks.",4,{"_path":26,"title":27,"description":28,"part":8,"chapterNumber":29},"/knowledge-base/networks/flexray","FlexRay","Time-triggered, deterministic automotive bus standardized as ISO 17458, designed for higher speeds and drive-by-wire systems.",5,{"_path":31,"title":32,"description":33,"part":8,"chapterNumber":34},"/knowledge-base/networks/automotive-ethernet","Automotive Ethernet","Automotive variants of Ethernet — 100BASE-T1, 1000BASE-T1, and 10BASE-T1S — built around single twisted-pair cabling and strict EMC requirements.",6,{"_path":36,"title":37,"description":38,"part":8,"chapterNumber":39},"/knowledge-base/networks/secure-onboard-communication","Secure Onboard Communication (SecOC)","AUTOSAR's standard for cryptographic message authentication on in-vehicle networks — freshness values, MAC computation and key management.",7,{"_path":41,"title":6,"description":42,"part":43,"chapterNumber":44},"/knowledge-base/diagnostics/introduction","Overview of automotive diagnostic protocols — ISO-TP, OBD-II, UDS, CCP and XCP — and how they layer on top of CAN.","Diagnostic Protocols",8,{"_path":46,"title":47,"description":48,"part":43,"chapterNumber":49},"/knowledge-base/diagnostics/iso-tp","ISO 15765-2 (ISO-TP)","ISO 15765-2 transport layer for sending diagnostic payloads larger than 8 bytes over CAN — single, first, consecutive and flow-control frames.",9,{"_path":51,"title":52,"description":53,"part":43,"chapterNumber":54},"/knowledge-base/diagnostics/vw-tp20","VW Transport Protocol 2.0 (TP 2.0)","Volkswagen's pre-ISO-TP transport layer for KWP2000 over CAN — channel setup, parameter negotiation, and the data exchange counter scheme.",10,{"_path":56,"title":57,"description":58,"part":43,"chapterNumber":59},"/knowledge-base/diagnostics/obd-ii","On-board diagnostics (OBD-II)","On-Board Diagnostics II — the J1962 connector, signal protocols, service IDs, parameter IDs, and DTC encoding.",11,{"_path":61,"title":62,"description":63,"part":43,"chapterNumber":64},"/knowledge-base/diagnostics/uds","Unified Diagnostic Services (UDS)","ISO 14229-1 — the modern diagnostic protocol for sessions, Read/Write DID, Security Access, Routine Control and firmware Request Download / Upload.",12,{"_path":66,"title":67,"description":68,"part":43,"chapterNumber":69},"/knowledge-base/diagnostics/ccp","CAN Calibration Protocol (CCP)","A low-level debug/calibration protocol over CAN — Command Receive Object, Data Transfer Object, and the commands used to read and write ECU memory.",13,{"_path":71,"title":72,"description":73,"part":43,"chapterNumber":74},"/knowledge-base/diagnostics/xcp","Universal Measurement and Calibration Protocol (XCP)","ASAM XCP — successor to CCP supporting CAN, CAN FD, FlexRay, and Ethernet, with synchronous data acquisition, stimulation, and calibration.",14,{"_path":76,"title":77,"description":78,"part":79,"chapterNumber":80},"/knowledge-base/tools/can-adapters","CAN Adapters","USB-to-CAN adapters — comma.ai red panda and PEAK-System PCAN — and the standard DB-9 pinout for CAN.","Tools",15,{"_path":82,"title":83,"description":84,"part":79,"chapterNumber":85},"/knowledge-base/tools/can-analysis","CAN Analysis","Tools for analysing and reverse-engineering CAN traffic — comma.ai cabana, SavyCAN, VehicleSpy, and Wireshark.",16,{"_path":87,"title":88,"description":89,"part":79,"chapterNumber":90},"/knowledge-base/tools/scripting","Scripting","Python libraries and CLI tools for talking to a CAN bus — comma.ai panda, SocketCAN can-utils, python-can, and Scapy with ISO-TP and UDS examples.",17,{"_path":92,"title":93,"description":94,"part":79,"chapterNumber":95},"/knowledge-base/tools/dbc-files","DBC Files","The DBC file format used to describe the contents of CAN messages — nodes, messages, signals, comments, and value tables.",18,{"_path":61,"_dir":97,"_draft":98,"_partial":98,"_locale":99,"title":62,"description":63,"part":43,"chapterNumber":64,"body":100,"_type":1834,"_id":1835,"_source":1836,"_file":1837,"_extension":1838},"diagnostics",false,"",{"type":101,"children":102,"toc":1804},"root",[103,111,128,135,173,178,185,191,196,202,214,226,238,243,248,359,366,378,407,413,433,452,473,478,483,490,509,515,534,561,573,594,600,619,625,637,649,654,659,678,683,689,710,716,722,734,739,744,809,814,819,824,829,841,860,872,877,903,908,921,927,933,939,958,963,975,980,985,998,1010,1022,1051,1057,1062,1068,1074,1086,1091,1112,1136,1141,1147,1153,1209,1211,1719,1725,1731,1744,1749,1755,1784],{"type":104,"tag":105,"props":106,"children":108},"element","h1",{"id":107},"unified-diagnostic-services-uds",[109],{"type":110,"value":62},"text",{"type":104,"tag":112,"props":113,"children":114},"p",{},[115,117,126],{"type":110,"value":116},"UDS is the most common diagnostic protocol used in vehicles today and is standardized as ",{"type":104,"tag":118,"props":119,"children":123},"a",{"href":120,"rel":121},"https://www.iso.org/standard/72439.html",[122],"nofollow",[124],{"type":110,"value":125},"ISO 14229-1",{"type":110,"value":127},". It is a request-response protocol that can be used over different transport layers and networks, including CAN, FlexRay, and Ethernet.",{"type":104,"tag":129,"props":130,"children":132},"h2",{"id":131},"protocol",[133],{"type":110,"value":134},"Protocol",{"type":104,"tag":112,"props":136,"children":137},{},[138,140,147,149,155,157,163,165,171],{"type":110,"value":139},"The first byte of a UDS request is the SID (Service ID), a unique identifier for the requested service. A successful response starts with the SID ORed with ",{"type":104,"tag":141,"props":142,"children":144},"code",{"className":143},[],[145],{"type":110,"value":146},"0x40",{"type":110,"value":148}," (e.g. SID ",{"type":104,"tag":141,"props":150,"children":152},{"className":151},[],[153],{"type":110,"value":154},"0x10",{"type":110,"value":156}," becomes a response of ",{"type":104,"tag":141,"props":158,"children":160},{"className":159},[],[161],{"type":110,"value":162},"0x50",{"type":110,"value":164},"). In case of an error, the reply starts with ",{"type":104,"tag":141,"props":166,"children":168},{"className":167},[],[169],{"type":110,"value":170},"0x7F",{"type":110,"value":172},", followed by the SID and a negative response code.",{"type":104,"tag":112,"props":174,"children":175},{},[176],{"type":110,"value":177},"Some SIDs use a sub-function ID as the first payload byte. A sub-function ID is a 7-bit value in which the highest bit is used to suppress the positive response from the ECU in case that is not needed. The sub-function ID is only used for some SIDs, and is followed by the parameters.",{"type":104,"tag":179,"props":180,"children":184},"uds-packet",{":fields":181,"direction":182,"title":183},"[{\"name\":\"Service ID\",\"mnemonic\":\"SID\",\"placeholder\":\"SID\",\"description\":\"1 byte. Identifies the requested service (e.g. 0x10, 0x22, 0x27).\"},{\"name\":\"sub-function\",\"mnemonic\":\"SF\",\"placeholder\":\"sub-function\",\"description\":\"Optional, 1 byte. Present for some SIDs.\\nThe top bit (0x80) suppresses the positive response.\\n\"},{\"name\":\"parameters\",\"mnemonic\":\"DATA\",\"placeholder\":\"service-specific bytes\",\"description\":\"Optional. Format depends on the service.\"}]","request","Generic request",[],{"type":104,"tag":179,"props":186,"children":190},{":fields":187,"direction":188,"title":189},"[{\"name\":\"Response SID\",\"mnemonic\":\"SIDPR\",\"placeholder\":\"SID + 0x40\",\"description\":\"Request SID ORed with 0x40 (e.g. 0x10 → 0x50, 0x22 → 0x62).\"},{\"name\":\"sub-function\",\"mnemonic\":\"SF\",\"placeholder\":\"sub-function\",\"description\":\"Echoed when the request had a sub-function (top bit cleared).\"},{\"name\":\"parameters\",\"mnemonic\":\"DATA\",\"placeholder\":\"service-specific bytes\",\"description\":\"Optional. Format depends on the service.\"}]","response","Generic positive response",[],{"type":104,"tag":179,"props":192,"children":195},{":fields":193,"direction":188,"title":194},"[{\"name\":\"Negative Response indicator\",\"mnemonic\":\"SIDNR\",\"bytes\":\"7F\",\"description\":\"Fixed prefix indicating a negative response.\"},{\"name\":\"Service ID\",\"mnemonic\":\"SIDRQ\",\"placeholder\":\"SID\",\"description\":\"The service ID the negative response is for.\"},{\"name\":\"negativeResponseCode\",\"mnemonic\":\"NRC\",\"placeholder\":\"NRC\",\"description\":\"1 byte explaining why the request was rejected. See the Error Codes section.\"}]","Generic negative response",[],{"type":104,"tag":129,"props":197,"children":199},{"id":198},"service-ids-sids",[200],{"type":110,"value":201},"Service IDs (SIDs)",{"type":104,"tag":112,"props":203,"children":204},{},[205,207,212],{"type":110,"value":206},"Below is an overview of some interesting UDS services. For a full list of services, see ",{"type":104,"tag":118,"props":208,"children":210},{"href":120,"rel":209},[122],[211],{"type":110,"value":125},{"type":110,"value":213},".",{"type":104,"tag":215,"props":216,"children":218},"h3",{"id":217},"_0x10-diagnostic-session-control",[219,224],{"type":104,"tag":141,"props":220,"children":222},{"className":221},[],[223],{"type":110,"value":154},{"type":110,"value":225}," — Diagnostic Session Control",{"type":104,"tag":112,"props":227,"children":228},{},[229,231,236],{"type":110,"value":230},"UDS has a concept of diagnostic sessions. Some SIDs are only available in certain sessions. For example, firmware updates usually require a programming session, and actuation tests are usually only available in an extended diagnostic session. Entering some sessions might require authentication first. SID ",{"type":104,"tag":141,"props":232,"children":234},{"className":233},[],[235],{"type":110,"value":154},{"type":110,"value":237}," is used to change the current session type. The sub-function ID is used to specify the requested session type.",{"type":104,"tag":112,"props":239,"children":240},{},[241],{"type":110,"value":242},"Optionally, the ECU may send an extra 4 bytes of \"Session Parameter Record\" following the response, containing information on the timeout values the tester can use.",{"type":104,"tag":112,"props":244,"children":245},{},[246],{"type":110,"value":247},"The most common sessions are listed below, but manufacturers can define their own session types as well. These can be found by iterating over all possible session types and observing the ECU's response.",{"type":104,"tag":249,"props":250,"children":251},"ul",{},[252,272,289,306,323,341],{"type":104,"tag":253,"props":254,"children":255},"li",{},[256,262,264,270],{"type":104,"tag":141,"props":257,"children":259},{"className":258},[],[260],{"type":110,"value":261},"0x1",{"type":110,"value":263}," — ",{"type":104,"tag":265,"props":266,"children":267},"strong",{},[268],{"type":110,"value":269},"Default Session",{"type":110,"value":271},": The session type the ECU will be in after a power cycle.",{"type":104,"tag":253,"props":273,"children":274},{},[275,281,282,287],{"type":104,"tag":141,"props":276,"children":278},{"className":277},[],[279],{"type":110,"value":280},"0x2",{"type":110,"value":263},{"type":104,"tag":265,"props":283,"children":284},{},[285],{"type":110,"value":286},"Programming Session",{"type":110,"value":288},": Used to update the firmware running on an ECU. Often requesting this session type will reboot the ECU into the bootloader.",{"type":104,"tag":253,"props":290,"children":291},{},[292,298,299,304],{"type":104,"tag":141,"props":293,"children":295},{"className":294},[],[296],{"type":110,"value":297},"0x3",{"type":110,"value":263},{"type":104,"tag":265,"props":300,"children":301},{},[302],{"type":110,"value":303},"Extended Diagnostic Session",{"type":110,"value":305},": Usually unlocks some extra SIDs that are not available in the default session, for example actuation tests and changing data that persists across reboots.",{"type":104,"tag":253,"props":307,"children":308},{},[309,315,316,321],{"type":104,"tag":141,"props":310,"children":312},{"className":311},[],[313],{"type":110,"value":314},"0x4",{"type":110,"value":263},{"type":104,"tag":265,"props":317,"children":318},{},[319],{"type":110,"value":320},"Safety System Diagnostic Session",{"type":110,"value":322},": Used to test safety-critical systems, such as the airbags.",{"type":104,"tag":253,"props":324,"children":325},{},[326,331,333,339],{"type":104,"tag":141,"props":327,"children":329},{"className":328},[],[330],{"type":110,"value":146},{"type":110,"value":332}," – ",{"type":104,"tag":141,"props":334,"children":336},{"className":335},[],[337],{"type":110,"value":338},"0x5F",{"type":110,"value":340}," — Vehicle Manufacturer-specific.",{"type":104,"tag":253,"props":342,"children":343},{},[344,350,351,357],{"type":104,"tag":141,"props":345,"children":347},{"className":346},[],[348],{"type":110,"value":349},"0x60",{"type":110,"value":332},{"type":104,"tag":141,"props":352,"children":354},{"className":353},[],[355],{"type":110,"value":356},"0x7E",{"type":110,"value":358}," — System Supplier Specific.",{"type":104,"tag":360,"props":361,"children":365},"uds-exchange",{":request":362,":response":363,"title":364},"{\"fields\":[{\"name\":\"Service ID\",\"mnemonic\":\"DSC\",\"bytes\":\"10\",\"description\":\"DiagnosticSessionControl request SID.\"},{\"name\":\"diagnosticSessionType\",\"mnemonic\":\"DS\",\"bytes\":\"03\",\"description\":\"Sub-function. 0x03 = extendedDiagnosticSession.\"}]}","{\"fields\":[{\"name\":\"Response SID\",\"mnemonic\":\"DSCPR\",\"bytes\":\"50\",\"description\":\"Request SID ORed with 0x40.\"},{\"name\":\"diagnosticSessionType\",\"mnemonic\":\"DS\",\"bytes\":\"03\",\"description\":\"Echoed sub-function.\"}],\"advancedFields\":[{\"name\":\"Response SID\",\"mnemonic\":\"DSCPR\",\"bytes\":\"50\",\"description\":\"Request SID ORed with 0x40.\"},{\"name\":\"diagnosticSessionType\",\"mnemonic\":\"DS\",\"bytes\":\"03\",\"description\":\"Echoed sub-function.\"},{\"name\":\"P2Server_max\",\"mnemonic\":\"SPREC\",\"bytes\":\"00 32\",\"description\":\"Default response timeout, big-endian, 1 ms per LSB.\\n0x0032 = 50 ms.\\n\"},{\"name\":\"P2*Server_max\",\"mnemonic\":\"SPREC\",\"bytes\":\"01 F4\",\"description\":\"Enhanced response timeout (after NRC 0x78 \\\"responsePending\\\"),\\nbig-endian, 10 ms per LSB. 0x01F4 = 5000 ms.\\n\"}]}","Enter extendedDiagnosticSession",[],{"type":104,"tag":215,"props":367,"children":369},{"id":368},"_0x11-ecu-reset",[370,376],{"type":104,"tag":141,"props":371,"children":373},{"className":372},[],[374],{"type":110,"value":375},"0x11",{"type":110,"value":377}," — ECU Reset",{"type":104,"tag":112,"props":379,"children":380},{},[381,383,389,391,397,399,405],{"type":110,"value":382},"ECU Reset can be used to reset the ECU. For example, this could be used after modifying flash memory. The sub-function ID specifies the reset type. Common reset types include ",{"type":104,"tag":141,"props":384,"children":386},{"className":385},[],[387],{"type":110,"value":388},"0x01",{"type":110,"value":390}," hard reset, ",{"type":104,"tag":141,"props":392,"children":394},{"className":393},[],[395],{"type":110,"value":396},"0x02",{"type":110,"value":398}," key off/on reset, and ",{"type":104,"tag":141,"props":400,"children":402},{"className":401},[],[403],{"type":110,"value":404},"0x03",{"type":110,"value":406}," soft reset.",{"type":104,"tag":360,"props":408,"children":412},{":request":409,":response":410,"title":411},"{\"fields\":[{\"name\":\"Service ID\",\"mnemonic\":\"ER\",\"bytes\":\"11\",\"description\":\"ECUReset request SID.\"},{\"name\":\"resetType\",\"mnemonic\":\"RT\",\"bytes\":\"01\",\"description\":\"Sub-function. 0x01 = hardReset.\"}]}","{\"fields\":[{\"name\":\"Response SID\",\"mnemonic\":\"ERPR\",\"bytes\":\"51\",\"description\":\"Request SID ORed with 0x40.\"},{\"name\":\"resetType\",\"mnemonic\":\"RT\",\"bytes\":\"01\",\"description\":\"Echoed sub-function.\"}]}","Hard reset",[],{"type":104,"tag":215,"props":414,"children":416},{"id":415},"_0x22-0x2e-read-write-data-by-identifier",[417,423,425,431],{"type":104,"tag":141,"props":418,"children":420},{"className":419},[],[421],{"type":110,"value":422},"0x22",{"type":110,"value":424}," / ",{"type":104,"tag":141,"props":426,"children":428},{"className":427},[],[429],{"type":110,"value":430},"0x2E",{"type":110,"value":432}," — Read / Write Data By Identifier",{"type":104,"tag":112,"props":434,"children":435},{},[436,438,443,445,450],{"type":110,"value":437},"Read Data By Identifier (",{"type":104,"tag":141,"props":439,"children":441},{"className":440},[],[442],{"type":110,"value":422},{"type":110,"value":444},") is used to read values, and Write Data By Identifier (",{"type":104,"tag":141,"props":446,"children":448},{"className":447},[],[449],{"type":110,"value":430},{"type":110,"value":451},") is used to write values.",{"type":104,"tag":112,"props":453,"children":454},{},[455,457,463,465,471],{"type":110,"value":456},"The identifiers are called DIDs (Data Identifiers). The UDS standard has a few predefined DIDs, such as ",{"type":104,"tag":141,"props":458,"children":460},{"className":459},[],[461],{"type":110,"value":462},"0xF180",{"type":110,"value":464}," \"Boot Software Identification Data Identifier\" or ",{"type":104,"tag":141,"props":466,"children":468},{"className":467},[],[469],{"type":110,"value":470},"0xF190",{"type":110,"value":472}," which contains the vehicle's VIN. Manufacturers can define their own DIDs as well, which can be found by iterating over all possible DIDs and observing the ECU's response.",{"type":104,"tag":112,"props":474,"children":475},{},[476],{"type":110,"value":477},"On some implementations it may also be possible to request multiple DIDs with a single request, by concatenating the DIDs after the SID. Whether this is supported depends on the UDS implementation.",{"type":104,"tag":112,"props":479,"children":480},{},[481],{"type":110,"value":482},"Example requesting the VIN:",{"type":104,"tag":360,"props":484,"children":489},{":request":485,":response":486,"title":487,"advancedTitle":488},"{\"fields\":[{\"name\":\"Service ID\",\"mnemonic\":\"RDBI\",\"bytes\":\"22\",\"description\":\"ReadDataByIdentifier request SID.\"},{\"name\":\"dataIdentifier\",\"mnemonic\":\"DID\",\"bytes\":\"F1 90\",\"description\":\"0xF190 = VIN data identifier (big-endian).\"}],\"advancedFields\":[{\"name\":\"Service ID\",\"mnemonic\":\"RDBI\",\"bytes\":\"22\",\"description\":\"ReadDataByIdentifier request SID.\"},{\"name\":\"dataIdentifier#1\",\"mnemonic\":\"DID\",\"bytes\":\"F1 90\",\"description\":\"First identifier — VIN.\"},{\"name\":\"dataIdentifier#2\",\"mnemonic\":\"DID\",\"bytes\":\"F1 80\",\"description\":\"Second identifier — Boot Software Identification.\"},{\"name\":\"dataIdentifier#3\",\"mnemonic\":\"DID\",\"bytes\":\"F1 8C\",\"description\":\"Third identifier — ECU Serial Number. Support for multiple DIDs in one request is implementation-specific.\"}]}","{\"fields\":[{\"name\":\"Response SID\",\"mnemonic\":\"RDBIPR\",\"bytes\":\"62\",\"description\":\"Request SID ORed with 0x40.\"},{\"name\":\"dataIdentifier\",\"mnemonic\":\"DID\",\"bytes\":\"F1 90\",\"description\":\"Echoed identifier.\"},{\"name\":\"dataRecord\",\"mnemonic\":\"DREC\",\"placeholder\":\"17 ASCII bytes (the VIN)\",\"description\":\"Value of the identifier. Format is manufacturer-specific.\"}],\"advancedFields\":[{\"name\":\"Response SID\",\"mnemonic\":\"RDBIPR\",\"bytes\":\"62\",\"description\":\"Request SID ORed with 0x40.\"},{\"name\":\"dataIdentifier#1\",\"mnemonic\":\"DID\",\"bytes\":\"F1 90\",\"description\":\"First identifier echoed.\"},{\"name\":\"dataRecord#1\",\"mnemonic\":\"DREC\",\"placeholder\":\"VIN bytes\",\"description\":\"Value for dataIdentifier#1.\"},{\"name\":\"dataIdentifier#2\",\"mnemonic\":\"DID\",\"bytes\":\"F1 80\",\"description\":\"Second identifier echoed.\"},{\"name\":\"dataRecord#2\",\"mnemonic\":\"DREC\",\"placeholder\":\"bootSwId bytes\",\"description\":\"Value for dataIdentifier#2.\"},{\"name\":\"dataIdentifier#3\",\"mnemonic\":\"DID\",\"bytes\":\"F1 8C\",\"description\":\"Third identifier echoed.\"},{\"name\":\"dataRecord#3\",\"mnemonic\":\"DREC\",\"placeholder\":\"serial number bytes\",\"description\":\"Value for dataIdentifier#3.\"}]}","Reading the VIN","Reading multiple DIDs in one request",[],{"type":104,"tag":112,"props":491,"children":492},{},[493,495,500,502,507],{"type":110,"value":494},"Using Write Data By Identifier (",{"type":104,"tag":141,"props":496,"children":498},{"className":497},[],[499],{"type":110,"value":430},{"type":110,"value":501},") data can be written back to the ECU. Use the same format, but append the data to write after the DID. The response will contain the SID + ",{"type":104,"tag":141,"props":503,"children":505},{"className":504},[],[506],{"type":110,"value":146},{"type":110,"value":508}," and the DID.",{"type":104,"tag":360,"props":510,"children":514},{":request":511,":response":512,"title":513},"{\"fields\":[{\"name\":\"Service ID\",\"mnemonic\":\"WDBI\",\"bytes\":\"2E\",\"description\":\"WriteDataByIdentifier request SID.\"},{\"name\":\"dataIdentifier\",\"mnemonic\":\"DID\",\"bytes\":\"F1 90\",\"description\":\"Identifier to write.\"},{\"name\":\"dataRecord\",\"mnemonic\":\"DREC\",\"placeholder\":\"17 ASCII bytes (the new VIN)\",\"description\":\"Data to write into the identifier.\"}]}","{\"fields\":[{\"name\":\"Response SID\",\"mnemonic\":\"WDBIPR\",\"bytes\":\"6E\",\"description\":\"Request SID ORed with 0x40.\"},{\"name\":\"dataIdentifier\",\"mnemonic\":\"DID\",\"bytes\":\"F1 90\",\"description\":\"Echoed identifier.\"}]}","Writing the VIN",[],{"type":104,"tag":215,"props":516,"children":518},{"id":517},"_0x23-0x3d-read-write-memory-by-address",[519,525,526,532],{"type":104,"tag":141,"props":520,"children":522},{"className":521},[],[523],{"type":110,"value":524},"0x23",{"type":110,"value":424},{"type":104,"tag":141,"props":527,"children":529},{"className":528},[],[530],{"type":110,"value":531},"0x3D",{"type":110,"value":533}," — Read / Write Memory By Address",{"type":104,"tag":112,"props":535,"children":536},{},[537,539,544,546,551,553,559],{"type":110,"value":538},"Where ",{"type":104,"tag":141,"props":540,"children":542},{"className":541},[],[543],{"type":110,"value":422},{"type":110,"value":545}," can be used to read DIDs, ",{"type":104,"tag":141,"props":547,"children":549},{"className":548},[],[550],{"type":110,"value":524},{"type":110,"value":552}," can be used to read memory by address. The payload starts with an ",{"type":104,"tag":141,"props":554,"children":556},{"className":555},[],[557],{"type":110,"value":558},"addressAndLengthFormatIdentifier",{"type":110,"value":560}," (ALFID), followed by the address and the number of bytes to read. The high nibble of the ALFID specifies the number of size bytes, and the low nibble specifies the number of address bytes. The address and length are usually big endian.",{"type":104,"tag":112,"props":562,"children":563},{},[564,566,571],{"type":110,"value":565},"The response will contain the SID + ",{"type":104,"tag":141,"props":567,"children":569},{"className":568},[],[570],{"type":110,"value":146},{"type":110,"value":572},", immediately followed by the data.",{"type":104,"tag":112,"props":574,"children":575},{},[576,578,584,586,592],{"type":110,"value":577},"The example below reads 16 bytes from address ",{"type":104,"tag":141,"props":579,"children":581},{"className":580},[],[582],{"type":110,"value":583},"0x12345678",{"type":110,"value":585},". There are 4 address bytes and 1 size byte, so the ALFID is ",{"type":104,"tag":141,"props":587,"children":589},{"className":588},[],[590],{"type":110,"value":591},"0x14",{"type":110,"value":593},". Hover any byte or row to highlight the corresponding field.",{"type":104,"tag":360,"props":595,"children":599},{":request":596,":response":597,"title":598},"{\"fields\":[{\"name\":\"Service ID\",\"mnemonic\":\"RMBA\",\"bytes\":\"23\",\"description\":\"ReadMemoryByAddress request SID.\"},{\"name\":\"addressAndLengthFormatIdentifier\",\"mnemonic\":\"ALFID\",\"bytes\":\"14\",\"nibbles\":{\"high\":\"memorySize length (1 byte)\",\"low\":\"memoryAddress length (4 bytes)\"}},{\"name\":\"memoryAddress\",\"mnemonic\":\"MA\",\"bytes\":\"12 34 56 78\",\"description\":\"Start address, big-endian. MSB first.\"},{\"name\":\"memorySize\",\"mnemonic\":\"MS\",\"bytes\":\"10\",\"description\":\"Number of bytes to read (0x10 = 16).\"}]}","{\"fields\":[{\"name\":\"Response SID\",\"mnemonic\":\"RMBAPR\",\"bytes\":\"63\",\"description\":\"Request SID ORed with 0x40.\"},{\"name\":\"dataRecord\",\"mnemonic\":\"DREC\",\"placeholder\":\"16 bytes of memory contents\",\"description\":\"The requested memory bytes, in the order they appear in memory.\"}]}","ReadMemoryByAddress — 4-byte address, 1-byte size",[],{"type":104,"tag":112,"props":601,"children":602},{},[603,605,610,612,617],{"type":110,"value":604},"Using Write Memory By Address (",{"type":104,"tag":141,"props":606,"children":608},{"className":607},[],[609],{"type":110,"value":531},{"type":110,"value":611},"), data can be written back to the ECU. Use the same format, but append the data to write after the address and length. The response will contain the SID + ",{"type":104,"tag":141,"props":613,"children":615},{"className":614},[],[616],{"type":110,"value":146},{"type":110,"value":618},", the ALFID, and the address and size.",{"type":104,"tag":360,"props":620,"children":624},{":request":621,":response":622,"title":623},"{\"fields\":[{\"name\":\"Service ID\",\"mnemonic\":\"WMBA\",\"bytes\":\"3D\",\"description\":\"WriteMemoryByAddress request SID.\"},{\"name\":\"addressAndLengthFormatIdentifier\",\"mnemonic\":\"ALFID\",\"bytes\":\"14\",\"nibbles\":{\"high\":\"memorySize length (1 byte)\",\"low\":\"memoryAddress length (4 bytes)\"}},{\"name\":\"memoryAddress\",\"mnemonic\":\"MA\",\"bytes\":\"12 34 56 78\",\"description\":\"Destination address, big-endian.\"},{\"name\":\"memorySize\",\"mnemonic\":\"MS\",\"bytes\":\"10\",\"description\":\"Number of bytes to write (0x10 = 16).\"},{\"name\":\"dataRecord\",\"mnemonic\":\"DREC\",\"placeholder\":\"16 bytes to write\",\"description\":\"Payload of bytes to write at the destination.\"}]}","{\"fields\":[{\"name\":\"Response SID\",\"mnemonic\":\"WMBAPR\",\"bytes\":\"7D\",\"description\":\"Request SID ORed with 0x40.\"},{\"name\":\"addressAndLengthFormatIdentifier\",\"mnemonic\":\"ALFID\",\"bytes\":\"14\",\"description\":\"Echoed.\"},{\"name\":\"memoryAddress\",\"mnemonic\":\"MA\",\"bytes\":\"12 34 56 78\",\"description\":\"Echoed.\"},{\"name\":\"memorySize\",\"mnemonic\":\"MS\",\"bytes\":\"10\",\"description\":\"Echoed.\"}]}","WriteMemoryByAddress — 4-byte address, 1-byte size",[],{"type":104,"tag":215,"props":626,"children":628},{"id":627},"_0x27-security-access",[629,635],{"type":104,"tag":141,"props":630,"children":632},{"className":631},[],[633],{"type":110,"value":634},"0x27",{"type":110,"value":636}," — Security Access",{"type":104,"tag":112,"props":638,"children":639},{},[640,642,647],{"type":110,"value":641},"Some types of diagnostic sessions or SIDs require authentication first. This is done using SID ",{"type":104,"tag":141,"props":643,"children":645},{"className":644},[],[646],{"type":110,"value":634},{"type":110,"value":648},". The authentication works by requesting a seed from the ECU, putting the seed into a special algorithm to compute a key, and sending the key back to the ECU. If the key is correct, the ECU will grant access to the requested session or SID.",{"type":104,"tag":112,"props":650,"children":651},{},[652],{"type":110,"value":653},"There are usually two countermeasures to prevent brute-forcing the key. The first is that there are usually only a limited number of tries to provide the correct key before the ECU locks further attempts. This either requires a reboot of the ECU or waiting a certain amount of time.",{"type":104,"tag":112,"props":655,"children":656},{},[657],{"type":110,"value":658},"The second countermeasure is that a certain amount of time has to pass between powering on the ECU and requesting a seed. This is to prevent an attacker from making a few attempts until the ECU blocks further tries and then quickly power-cycling the ECU to try again. Another benefit is that if the RNG does not have any good source of randomness, the seed will be the same every time the ECU is powered on. By forcing the user to wait before making an attempt, it's harder to get the same seed twice.",{"type":104,"tag":112,"props":660,"children":661},{},[662,664,669,671,676],{"type":110,"value":663},"Usually sub-function ",{"type":104,"tag":141,"props":665,"children":667},{"className":666},[],[668],{"type":110,"value":388},{"type":110,"value":670}," is used to request a seed, and sub-function ",{"type":104,"tag":141,"props":672,"children":674},{"className":673},[],[675],{"type":110,"value":396},{"type":110,"value":677}," is used for sending the key as a response. Sometimes more than one type of seed/key can be chosen for different levels of security using higher sub-function IDs. All odd sub-function IDs request a certain type of seed, while the even sub-function IDs are used to send back the computed key.",{"type":104,"tag":112,"props":679,"children":680},{},[681],{"type":110,"value":682},"The algorithms to compute the key are usually not public — they range from simple XOR operations to more complex algorithms.",{"type":104,"tag":684,"props":685,"children":688},"excalidraw",{"alt":686,"src":687},"State diagram of the Security Access exchange between tester and ECU.","/excalidraw/diagnostics/uds_27.excalidraw",[],{"type":104,"tag":112,"props":690,"children":691},{},[692,694,700,702,708],{"type":110,"value":693},"Example of a tester requesting a seed (",{"type":104,"tag":141,"props":695,"children":697},{"className":696},[],[698],{"type":110,"value":699},"0x1234",{"type":110,"value":701},"), and then sending back the key (",{"type":104,"tag":141,"props":703,"children":705},{"className":704},[],[706],{"type":110,"value":707},"0x9876",{"type":110,"value":709},"):",{"type":104,"tag":360,"props":711,"children":715},{":request":712,":response":713,"title":714},"{\"fields\":[{\"name\":\"Service ID\",\"mnemonic\":\"SA\",\"bytes\":\"27\",\"description\":\"SecurityAccess request SID.\"},{\"name\":\"securityAccessType\",\"mnemonic\":\"SAT\",\"bytes\":\"01\",\"description\":\"Sub-function. Odd value = requestSeed at level 0x01.\"}]}","{\"fields\":[{\"name\":\"Response SID\",\"mnemonic\":\"SAPR\",\"bytes\":\"67\",\"description\":\"Request SID ORed with 0x40.\"},{\"name\":\"securityAccessType\",\"mnemonic\":\"SAT\",\"bytes\":\"01\",\"description\":\"Echoed sub-function.\"},{\"name\":\"securitySeed\",\"mnemonic\":\"SECSEED\",\"bytes\":\"12 34\",\"description\":\"Random seed produced by the ECU.\"}]}","Step 1 — request seed",[],{"type":104,"tag":360,"props":717,"children":721},{":request":718,":response":719,"title":720},"{\"fields\":[{\"name\":\"Service ID\",\"mnemonic\":\"SA\",\"bytes\":\"27\",\"description\":\"SecurityAccess request SID.\"},{\"name\":\"securityAccessType\",\"mnemonic\":\"SAT\",\"bytes\":\"02\",\"description\":\"Sub-function. Even value = sendKey at level 0x01.\"},{\"name\":\"securityKey\",\"mnemonic\":\"SECKEY\",\"bytes\":\"98 76\",\"description\":\"Key derived from the seed.\"}]}","{\"fields\":[{\"name\":\"Response SID\",\"mnemonic\":\"SAPR\",\"bytes\":\"67\",\"description\":\"Request SID ORed with 0x40. Indicates the key was accepted.\"},{\"name\":\"securityAccessType\",\"mnemonic\":\"SAT\",\"bytes\":\"02\",\"description\":\"Echoed sub-function.\"}]}","Step 2 — send computed key",[],{"type":104,"tag":215,"props":723,"children":725},{"id":724},"_0x28-communication-control",[726,732],{"type":104,"tag":141,"props":727,"children":729},{"className":728},[],[730],{"type":110,"value":731},"0x28",{"type":110,"value":733}," — Communication Control",{"type":104,"tag":112,"props":735,"children":736},{},[737],{"type":110,"value":738},"This SID is used to enable or disable certain types of communication. The sub-function ID is used to specify the requested action. The payload contains the type of communication to control, optionally followed by a two-byte node ID.",{"type":104,"tag":112,"props":740,"children":741},{},[742],{"type":110,"value":743},"Sub-function ID values:",{"type":104,"tag":249,"props":745,"children":746},{},[747,758,768,778,788,798],{"type":104,"tag":253,"props":748,"children":749},{},[750,756],{"type":104,"tag":141,"props":751,"children":753},{"className":752},[],[754],{"type":110,"value":755},"0x0",{"type":110,"value":757}," — Enable Rx and Tx (default).",{"type":104,"tag":253,"props":759,"children":760},{},[761,766],{"type":104,"tag":141,"props":762,"children":764},{"className":763},[],[765],{"type":110,"value":261},{"type":110,"value":767}," — Enable Rx and disable Tx for the specified communication type.",{"type":104,"tag":253,"props":769,"children":770},{},[771,776],{"type":104,"tag":141,"props":772,"children":774},{"className":773},[],[775],{"type":110,"value":280},{"type":110,"value":777}," — Disable Rx and enable Tx for the specified communication type.",{"type":104,"tag":253,"props":779,"children":780},{},[781,786],{"type":104,"tag":141,"props":782,"children":784},{"className":783},[],[785],{"type":110,"value":297},{"type":110,"value":787}," — Disable Rx and Tx for the specified communication type.",{"type":104,"tag":253,"props":789,"children":790},{},[791,796],{"type":104,"tag":141,"props":792,"children":794},{"className":793},[],[795],{"type":110,"value":314},{"type":110,"value":797}," — Enable Rx and disable Tx on the sub-network with the specified node ID.",{"type":104,"tag":253,"props":799,"children":800},{},[801,807],{"type":104,"tag":141,"props":802,"children":804},{"className":803},[],[805],{"type":110,"value":806},"0x5",{"type":110,"value":808}," — Enable Rx and Tx on the sub-network with the specified node ID.",{"type":104,"tag":112,"props":810,"children":811},{},[812],{"type":110,"value":813},"The communication type is a bit field such that multiple types can be controlled at the same time. The lower nibble is used for the type of messages: bit 0 indicates normal communication messages, bit 1 indicates network management messages. The upper nibble is used to indicate the number of the sub-network to control.",{"type":104,"tag":112,"props":815,"children":816},{},[817],{"type":110,"value":818},"Example of a tester disabling all CAN communication. Note the MSB of the sub-function ID is set, so the ECU will not send a positive response:",{"type":104,"tag":179,"props":820,"children":823},{":fields":821,"direction":182,"title":822},"[{\"name\":\"Service ID\",\"mnemonic\":\"CC\",\"bytes\":\"28\",\"description\":\"CommunicationControl request SID.\"},{\"name\":\"controlType\",\"mnemonic\":\"CTRLTP\",\"bytes\":\"83\",\"description\":\"Sub-function. 0x03 = disableRxAndTx.\\nTop bit (0x80) = suppressPosRspMsgIndicationBit.\\n\"},{\"name\":\"communicationType\",\"mnemonic\":\"CTP\",\"bytes\":\"03\",\"description\":\"Bit 0: normal communication messages.\\nBit 1: network management messages.\\nUpper nibble: sub-network number.\\n\"}]","Disable all CAN communication (no response)",[],{"type":104,"tag":112,"props":825,"children":826},{},[827],{"type":110,"value":828},"The ECU does not send a response because the suppress-positive-response bit is set.",{"type":104,"tag":215,"props":830,"children":832},{"id":831},"_0x29-authentication",[833,839],{"type":104,"tag":141,"props":834,"children":836},{"className":835},[],[837],{"type":110,"value":838},"0x29",{"type":110,"value":840}," — Authentication",{"type":104,"tag":112,"props":842,"children":843},{},[844,846,851,853,858],{"type":110,"value":845},"This SID was added in a 2020 update to the UDS specification. Where service ",{"type":104,"tag":141,"props":847,"children":849},{"className":848},[],[850],{"type":110,"value":634},{"type":110,"value":852}," (Security Access) works using symmetric cryptography (where the tester and ECU use the same algorithm and key), service ",{"type":104,"tag":141,"props":854,"children":856},{"className":855},[],[857],{"type":110,"value":838},{"type":110,"value":859}," (Authentication) also supports using asymmetric cryptography and PKI certificates.",{"type":104,"tag":215,"props":861,"children":863},{"id":862},"_0x31-routine-control",[864,870],{"type":104,"tag":141,"props":865,"children":867},{"className":866},[],[868],{"type":110,"value":869},"0x31",{"type":110,"value":871}," — Routine Control",{"type":104,"tag":112,"props":873,"children":874},{},[875],{"type":110,"value":876},"This SID is used to start and stop functions on the ECU. Some functions produce a result that can be retrieved using this SID. For example, functions can be implemented to test or calibrate actuators. During reprogramming of an ECU, a routine control is used to initiate the erasure process before new firmware can be written.",{"type":104,"tag":112,"props":878,"children":879},{},[880,882,887,889,894,896,901],{"type":110,"value":881},"The sub-function ID specifies the requested action: ",{"type":104,"tag":141,"props":883,"children":885},{"className":884},[],[886],{"type":110,"value":261},{"type":110,"value":888}," to start a routine, ",{"type":104,"tag":141,"props":890,"children":892},{"className":891},[],[893],{"type":110,"value":280},{"type":110,"value":895}," to stop a routine, ",{"type":104,"tag":141,"props":897,"children":899},{"className":898},[],[900],{"type":110,"value":297},{"type":110,"value":902}," to request the result. The sub-function ID is followed by a two-byte routine identifier.",{"type":104,"tag":112,"props":904,"children":905},{},[906],{"type":110,"value":907},"Both requests and responses can contain extra payload data, e.g. to pass extra parameters when starting a routine, or to return the result of a routine when stopping it.",{"type":104,"tag":112,"props":909,"children":910},{},[911,913,919],{"type":110,"value":912},"Example of a tester starting a routine with routine identifier ",{"type":104,"tag":141,"props":914,"children":916},{"className":915},[],[917],{"type":110,"value":918},"0xAABB",{"type":110,"value":920},", stopping it, and requesting the result:",{"type":104,"tag":360,"props":922,"children":926},{":request":923,":response":924,"title":925},"{\"fields\":[{\"name\":\"Service ID\",\"mnemonic\":\"RC\",\"bytes\":\"31\",\"description\":\"RoutineControl request SID.\"},{\"name\":\"routineControlType\",\"mnemonic\":\"RCTP\",\"bytes\":\"01\",\"description\":\"Sub-function. 0x01 = startRoutine.\"},{\"name\":\"routineIdentifier\",\"mnemonic\":\"RID\",\"bytes\":\"AA BB\",\"description\":\"16-bit identifier of the routine to start.\"}]}","{\"fields\":[{\"name\":\"Response SID\",\"mnemonic\":\"RCPR\",\"bytes\":\"71\",\"description\":\"Request SID ORed with 0x40.\"},{\"name\":\"routineControlType\",\"mnemonic\":\"RCTP\",\"bytes\":\"01\",\"description\":\"Echoed sub-function.\"},{\"name\":\"routineIdentifier\",\"mnemonic\":\"RID\",\"bytes\":\"AA BB\",\"description\":\"Echoed identifier.\"}]}","Start routine",[],{"type":104,"tag":360,"props":928,"children":932},{":request":929,":response":930,"title":931},"{\"fields\":[{\"name\":\"Service ID\",\"mnemonic\":\"RC\",\"bytes\":\"31\",\"description\":\"RoutineControl request SID.\"},{\"name\":\"routineControlType\",\"mnemonic\":\"RCTP\",\"bytes\":\"02\",\"description\":\"Sub-function. 0x02 = stopRoutine.\"},{\"name\":\"routineIdentifier\",\"mnemonic\":\"RID\",\"bytes\":\"AA BB\",\"description\":\"Identifier of the routine to stop.\"}]}","{\"fields\":[{\"name\":\"Response SID\",\"mnemonic\":\"RCPR\",\"bytes\":\"71\",\"description\":\"Request SID ORed with 0x40.\"},{\"name\":\"routineControlType\",\"mnemonic\":\"RCTP\",\"bytes\":\"02\",\"description\":\"Echoed sub-function.\"},{\"name\":\"routineIdentifier\",\"mnemonic\":\"RID\",\"bytes\":\"AA BB\",\"description\":\"Echoed identifier.\"}]}","Stop routine",[],{"type":104,"tag":360,"props":934,"children":938},{":request":935,":response":936,"title":937},"{\"fields\":[{\"name\":\"Service ID\",\"mnemonic\":\"RC\",\"bytes\":\"31\",\"description\":\"RoutineControl request SID.\"},{\"name\":\"routineControlType\",\"mnemonic\":\"RCTP\",\"bytes\":\"03\",\"description\":\"Sub-function. 0x03 = requestRoutineResults.\"},{\"name\":\"routineIdentifier\",\"mnemonic\":\"RID\",\"bytes\":\"AA BB\",\"description\":\"Identifier of the routine to query.\"}]}","{\"fields\":[{\"name\":\"Response SID\",\"mnemonic\":\"RCPR\",\"bytes\":\"71\",\"description\":\"Request SID ORed with 0x40.\"},{\"name\":\"routineControlType\",\"mnemonic\":\"RCTP\",\"bytes\":\"03\",\"description\":\"Echoed sub-function.\"},{\"name\":\"routineIdentifier\",\"mnemonic\":\"RID\",\"bytes\":\"AA BB\",\"description\":\"Echoed identifier.\"},{\"name\":\"routineStatusRecord\",\"mnemonic\":\"RSR\",\"placeholder\":\"routine result bytes\",\"description\":\"Result data, format defined by the manufacturer.\"}]}","Request result",[],{"type":104,"tag":215,"props":940,"children":942},{"id":941},"_0x34-0x37-request-download-upload",[943,949,950,956],{"type":104,"tag":141,"props":944,"children":946},{"className":945},[],[947],{"type":110,"value":948},"0x34",{"type":110,"value":332},{"type":104,"tag":141,"props":951,"children":953},{"className":952},[],[954],{"type":110,"value":955},"0x37",{"type":110,"value":957}," — Request Download / Upload",{"type":104,"tag":112,"props":959,"children":960},{},[961],{"type":110,"value":962},"Request Download / Upload SIDs are used to update firmware or calibration maps on the ECU. The terms for download and upload are defined from the perspective of the ECU, so download means sending data from the tester to the ECU, and upload means sending data from the ECU to the tester.",{"type":104,"tag":112,"props":964,"children":965},{},[966,968,973],{"type":110,"value":967},"The transfer is initiated by sending the request. The payload is similar to SID ",{"type":104,"tag":141,"props":969,"children":971},{"className":970},[],[972],{"type":110,"value":524},{"type":110,"value":974}," (Read Memory By Address), where the first byte is a format byte. This format byte is used to indicate if the data is encrypted or compressed.",{"type":104,"tag":112,"props":976,"children":977},{},[978],{"type":110,"value":979},"The format byte is followed by the address-and-length format byte that specifies the number of address bytes and the number of data bytes. This is followed by the address and length of the transfer.",{"type":104,"tag":112,"props":981,"children":982},{},[983],{"type":110,"value":984},"After requesting the download or upload, the ECU will respond with the maximum block size of the actual data transfer. The response payload starts with a format byte indicating the number of length bytes that will follow, followed by the actual maximum length of the block.",{"type":104,"tag":112,"props":986,"children":987},{},[988,990,996],{"type":110,"value":989},"The actual data is then transferred using SID ",{"type":104,"tag":141,"props":991,"children":993},{"className":992},[],[994],{"type":110,"value":995},"0x36",{"type":110,"value":997}," (Transfer Data). The payload starts with a 1-byte block counter that starts at 1 and increments for each block. The block counter is used to detect missing or duplicate blocks. If a download was requested, the block counter is followed by the actual data, which can be up to the maximum block size specified by the ECU.",{"type":104,"tag":112,"props":999,"children":1000},{},[1001,1003,1008],{"type":110,"value":1002},"After each call to SID ",{"type":104,"tag":141,"props":1004,"children":1006},{"className":1005},[],[1007],{"type":110,"value":995},{"type":110,"value":1009},", the ECU will respond with the block counter and a payload. For an upload, this payload will contain the requested data. For a download, the payload is optional, but could for example be used to send a checksum of the transferred data to be verified by the tester.",{"type":104,"tag":112,"props":1011,"children":1012},{},[1013,1015,1020],{"type":110,"value":1014},"After all data has been transferred, SID ",{"type":104,"tag":141,"props":1016,"children":1018},{"className":1017},[],[1019],{"type":110,"value":955},{"type":110,"value":1021}," (Request Transfer Exit) is used to exit the transfer mode. The payload is optional and can be used to send a checksum of the transferred data to be verified by the ECU. The ECU will use this function to verify the transferred data and optionally mark the new firmware as valid or bootable.",{"type":104,"tag":112,"props":1023,"children":1024},{},[1025,1027,1033,1035,1041,1043,1049],{"type":110,"value":1026},"The example below downloads ",{"type":104,"tag":141,"props":1028,"children":1030},{"className":1029},[],[1031],{"type":110,"value":1032},"0x100",{"type":110,"value":1034}," bytes (256) starting at address ",{"type":104,"tag":141,"props":1036,"children":1038},{"className":1037},[],[1039],{"type":110,"value":1040},"0x60200000",{"type":110,"value":1042},". The ECU then accepts blocks up to ",{"type":104,"tag":141,"props":1044,"children":1046},{"className":1045},[],[1047],{"type":110,"value":1048},"0x0081",{"type":110,"value":1050}," bytes (129).",{"type":104,"tag":360,"props":1052,"children":1056},{":request":1053,":response":1054,"title":1055},"{\"fields\":[{\"name\":\"Service ID\",\"mnemonic\":\"RD\",\"bytes\":\"34\",\"description\":\"RequestDownload request SID.\"},{\"name\":\"dataFormatIdentifier\",\"mnemonic\":\"DFI\",\"bytes\":\"00\",\"nibbles\":{\"high\":\"compressionMethod\",\"low\":\"encryptingMethod\"},\"description\":\"0x00 = uncompressed and unencrypted.\"},{\"name\":\"addressAndLengthFormatIdentifier\",\"mnemonic\":\"ALFID\",\"bytes\":\"44\",\"nibbles\":{\"high\":\"memorySize length (4 bytes)\",\"low\":\"memoryAddress length (4 bytes)\"}},{\"name\":\"memoryAddress\",\"mnemonic\":\"MA\",\"bytes\":\"60 20 00 00\",\"description\":\"Destination address, big-endian.\"},{\"name\":\"memorySize\",\"mnemonic\":\"MS\",\"bytes\":\"00 00 01 00\",\"description\":\"Number of bytes to download (0x100 = 256).\"}]}","{\"fields\":[{\"name\":\"Response SID\",\"mnemonic\":\"RDPR\",\"bytes\":\"74\",\"description\":\"Request SID ORed with 0x40.\"},{\"name\":\"lengthFormatIdentifier\",\"mnemonic\":\"LFID\",\"bytes\":\"20\",\"nibbles\":{\"high\":\"maxNumberOfBlockLength length (2 bytes)\",\"low\":\"reserved, must be 0\"}},{\"name\":\"maxNumberOfBlockLength\",\"mnemonic\":\"MNROB\",\"bytes\":\"00 81\",\"description\":\"Maximum number of bytes per TransferData request, including SID and BSC. 0x0081 = 129.\"}]}","0x34 — Request download",[],{"type":104,"tag":112,"props":1058,"children":1059},{},[1060],{"type":110,"value":1061},"The 0x35 (RequestUpload) request and response have the same structure but the SID is 0x35 / 0x75.",{"type":104,"tag":360,"props":1063,"children":1067},{":request":1064,":response":1065,"title":1066},"{\"fields\":[{\"name\":\"Service ID\",\"mnemonic\":\"TD\",\"bytes\":\"36\",\"description\":\"TransferData request SID.\"},{\"name\":\"blockSequenceCounter\",\"mnemonic\":\"BSC\",\"bytes\":\"01\",\"description\":\"Starts at 1, increments per block, wraps at 0xFF → 0x00.\"},{\"name\":\"transferRequestParameterRecord\",\"mnemonic\":\"TRPR\",\"placeholder\":\"up to maxNumberOfBlockLength − 2 bytes\",\"description\":\"For a download, the data being written. For an upload, this is empty.\"}]}","{\"fields\":[{\"name\":\"Response SID\",\"mnemonic\":\"TDPR\",\"bytes\":\"76\",\"description\":\"Request SID ORed with 0x40.\"},{\"name\":\"blockSequenceCounter\",\"mnemonic\":\"BSC\",\"bytes\":\"01\",\"description\":\"Echoed counter.\"},{\"name\":\"transferResponseParameterRecord\",\"mnemonic\":\"TRPR\",\"placeholder\":\"optional response data\",\"description\":\"For an upload, this contains the data being read. For a download, optional (e.g. a checksum).\"}]}","0x36 — Transfer data block",[],{"type":104,"tag":360,"props":1069,"children":1073},{":request":1070,":response":1071,"title":1072},"{\"fields\":[{\"name\":\"Service ID\",\"mnemonic\":\"RTE\",\"bytes\":\"37\",\"description\":\"RequestTransferExit request SID.\"},{\"name\":\"transferRequestParameterRecord\",\"mnemonic\":\"TRPR\",\"placeholder\":\"optional checksum\",\"description\":\"Optional. May contain a checksum of the transferred data for verification.\"}]}","{\"fields\":[{\"name\":\"Response SID\",\"mnemonic\":\"RTEPR\",\"bytes\":\"77\",\"description\":\"Request SID ORed with 0x40. The transfer is complete and the ECU has accepted the data.\"},{\"name\":\"transferResponseParameterRecord\",\"mnemonic\":\"TRPR\",\"placeholder\":\"optional verification data\",\"description\":\"Optional response data, e.g. a confirmation checksum.\"}]}","0x37 — Request transfer exit",[],{"type":104,"tag":215,"props":1075,"children":1077},{"id":1076},"_0x3e-tester-present",[1078,1084],{"type":104,"tag":141,"props":1079,"children":1081},{"className":1080},[],[1082],{"type":110,"value":1083},"0x3E",{"type":110,"value":1085}," — Tester Present",{"type":104,"tag":112,"props":1087,"children":1088},{},[1089],{"type":110,"value":1090},"After a certain time of no communication, the ECU will exit the current diagnostic session. Tester Present is used to keep the current diagnostic session active, or is sometimes needed before initiating a session.",{"type":104,"tag":112,"props":1092,"children":1093},{},[1094,1096,1102,1104,1110],{"type":110,"value":1095},"Tester Present has a sub-function that controls whether the ECU should send a positive response. This is useful to keep the ECU awake without filling up the CAN bus with responses. The sub-function ID is ",{"type":104,"tag":141,"props":1097,"children":1099},{"className":1098},[],[1100],{"type":110,"value":1101},"0x00",{"type":110,"value":1103}," to send a response, or ",{"type":104,"tag":141,"props":1105,"children":1107},{"className":1106},[],[1108],{"type":110,"value":1109},"0x80",{"type":110,"value":1111}," to suppress the positive response.",{"type":104,"tag":112,"props":1113,"children":1114},{},[1115,1120,1122,1127,1129,1134],{"type":104,"tag":141,"props":1116,"children":1118},{"className":1117},[],[1119],{"type":110,"value":1109},{"type":110,"value":1121}," is also useful after using ",{"type":104,"tag":141,"props":1123,"children":1125},{"className":1124},[],[1126],{"type":110,"value":731},{"type":110,"value":1128}," (Communication Control) to disable CAN communication. Some ECUs need periodic Tester Present messages or the CAN messages will resume. Sending Tester Present with sub-function ",{"type":104,"tag":141,"props":1130,"children":1132},{"className":1131},[],[1133],{"type":110,"value":1101},{"type":110,"value":1135}," will immediately enable CAN communication again because the ECU is forced to send a response.",{"type":104,"tag":112,"props":1137,"children":1138},{},[1139],{"type":110,"value":1140},"Tester Present is also a very useful SID to scan for the presence of UDS on a certain CAN Arbitration ID. You can quickly send the Tester Present payload to a set of Arbitration IDs and see which ones respond.",{"type":104,"tag":360,"props":1142,"children":1146},{":request":1143,":response":1144,"title":1145},"{\"fields\":[{\"name\":\"Service ID\",\"mnemonic\":\"TP\",\"bytes\":\"3E\",\"description\":\"TesterPresent request SID.\"},{\"name\":\"zeroSubFunction\",\"mnemonic\":\"ZSUBF\",\"bytes\":\"00\",\"description\":\"Sub-function. 0x00 = expect response. 0x80 = suppress positive response.\"}]}","{\"fields\":[{\"name\":\"Response SID\",\"mnemonic\":\"TPPR\",\"bytes\":\"7E\",\"description\":\"Request SID ORed with 0x40.\"},{\"name\":\"zeroSubFunction\",\"mnemonic\":\"ZSUBF\",\"bytes\":\"00\",\"description\":\"Echoed sub-function.\"}]}","Tester Present keep-alive",[],{"type":104,"tag":129,"props":1148,"children":1150},{"id":1149},"error-codes",[1151],{"type":110,"value":1152},"Error Codes",{"type":104,"tag":112,"props":1154,"children":1155},{},[1156,1158,1164,1166,1172,1174,1179,1181,1186,1188,1193,1194,1200,1202,1207],{"type":110,"value":1157},"When an ECU rejects a request, the negative response (",{"type":104,"tag":141,"props":1159,"children":1161},{"className":1160},[],[1162],{"type":110,"value":1163},"0x7F SID NRC",{"type":110,"value":1165},") ends with a Negative Response Code (NRC). The full set is defined in Annex A of ",{"type":104,"tag":118,"props":1167,"children":1169},{"href":120,"rel":1168},[122],[1170],{"type":110,"value":1171},"ISO 14229-1:2013",{"type":110,"value":1173},". Codes ",{"type":104,"tag":141,"props":1175,"children":1177},{"className":1176},[],[1178],{"type":110,"value":388},{"type":110,"value":1180},"–",{"type":104,"tag":141,"props":1182,"children":1184},{"className":1183},[],[1185],{"type":110,"value":170},{"type":110,"value":1187}," cover communication-related errors (request format, sequencing, security, transfer state). Codes ",{"type":104,"tag":141,"props":1189,"children":1191},{"className":1190},[],[1192],{"type":110,"value":1109},{"type":110,"value":1180},{"type":104,"tag":141,"props":1195,"children":1197},{"className":1196},[],[1198],{"type":110,"value":1199},"0xFF",{"type":110,"value":1201}," are reserved for preconditions on the vehicle state (RPM, temperature, voltage, gear, …) and serve as more specific alternatives to ",{"type":104,"tag":141,"props":1203,"children":1205},{"className":1204},[],[1206],{"type":110,"value":422},{"type":110,"value":1208}," conditionsNotCorrect.",{"type":110,"value":1210},"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",{"type":104,"tag":1212,"props":1213,"children":1214},"table",{},[1215,1239],{"type":104,"tag":1216,"props":1217,"children":1218},"thead",{},[1219],{"type":104,"tag":1220,"props":1221,"children":1222},"tr",{},[1223,1229,1234],{"type":104,"tag":1224,"props":1225,"children":1226},"th",{},[1227],{"type":110,"value":1228},"Code",{"type":104,"tag":1224,"props":1230,"children":1231},{},[1232],{"type":110,"value":1233},"Mnemonic",{"type":104,"tag":1224,"props":1235,"children":1236},{},[1237],{"type":110,"value":1238},"Name",{"type":104,"tag":1240,"props":1241,"children":1242},"tbody",{},[1243,1265,1286,1308,1330,1351,1373,1394,1416,1438,1460,1481,1503,1525,1546,1567,1589,1611,1633,1655,1677,1698],{"type":104,"tag":1220,"props":1244,"children":1245},{},[1246,1255,1260],{"type":104,"tag":1247,"props":1248,"children":1249},"td",{},[1250],{"type":104,"tag":141,"props":1251,"children":1253},{"className":1252},[],[1254],{"type":110,"value":154},{"type":104,"tag":1247,"props":1256,"children":1257},{},[1258],{"type":110,"value":1259},"GR",{"type":104,"tag":1247,"props":1261,"children":1262},{},[1263],{"type":110,"value":1264},"generalReject",{"type":104,"tag":1220,"props":1266,"children":1267},{},[1268,1276,1281],{"type":104,"tag":1247,"props":1269,"children":1270},{},[1271],{"type":104,"tag":141,"props":1272,"children":1274},{"className":1273},[],[1275],{"type":110,"value":375},{"type":104,"tag":1247,"props":1277,"children":1278},{},[1279],{"type":110,"value":1280},"SNS",{"type":104,"tag":1247,"props":1282,"children":1283},{},[1284],{"type":110,"value":1285},"serviceNotSupported",{"type":104,"tag":1220,"props":1287,"children":1288},{},[1289,1298,1303],{"type":104,"tag":1247,"props":1290,"children":1291},{},[1292],{"type":104,"tag":141,"props":1293,"children":1295},{"className":1294},[],[1296],{"type":110,"value":1297},"0x12",{"type":104,"tag":1247,"props":1299,"children":1300},{},[1301],{"type":110,"value":1302},"SFNS",{"type":104,"tag":1247,"props":1304,"children":1305},{},[1306],{"type":110,"value":1307},"sub-functionNotSupported",{"type":104,"tag":1220,"props":1309,"children":1310},{},[1311,1320,1325],{"type":104,"tag":1247,"props":1312,"children":1313},{},[1314],{"type":104,"tag":141,"props":1315,"children":1317},{"className":1316},[],[1318],{"type":110,"value":1319},"0x13",{"type":104,"tag":1247,"props":1321,"children":1322},{},[1323],{"type":110,"value":1324},"IMLOIF",{"type":104,"tag":1247,"props":1326,"children":1327},{},[1328],{"type":110,"value":1329},"incorrectMessageLengthOrInvalidFormat",{"type":104,"tag":1220,"props":1331,"children":1332},{},[1333,1341,1346],{"type":104,"tag":1247,"props":1334,"children":1335},{},[1336],{"type":104,"tag":141,"props":1337,"children":1339},{"className":1338},[],[1340],{"type":110,"value":591},{"type":104,"tag":1247,"props":1342,"children":1343},{},[1344],{"type":110,"value":1345},"RTL",{"type":104,"tag":1247,"props":1347,"children":1348},{},[1349],{"type":110,"value":1350},"responseTooLong",{"type":104,"tag":1220,"props":1352,"children":1353},{},[1354,1363,1368],{"type":104,"tag":1247,"props":1355,"children":1356},{},[1357],{"type":104,"tag":141,"props":1358,"children":1360},{"className":1359},[],[1361],{"type":110,"value":1362},"0x21",{"type":104,"tag":1247,"props":1364,"children":1365},{},[1366],{"type":110,"value":1367},"BRR",{"type":104,"tag":1247,"props":1369,"children":1370},{},[1371],{"type":110,"value":1372},"busyRepeatRequest",{"type":104,"tag":1220,"props":1374,"children":1375},{},[1376,1384,1389],{"type":104,"tag":1247,"props":1377,"children":1378},{},[1379],{"type":104,"tag":141,"props":1380,"children":1382},{"className":1381},[],[1383],{"type":110,"value":422},{"type":104,"tag":1247,"props":1385,"children":1386},{},[1387],{"type":110,"value":1388},"CNC",{"type":104,"tag":1247,"props":1390,"children":1391},{},[1392],{"type":110,"value":1393},"conditionsNotCorrect",{"type":104,"tag":1220,"props":1395,"children":1396},{},[1397,1406,1411],{"type":104,"tag":1247,"props":1398,"children":1399},{},[1400],{"type":104,"tag":141,"props":1401,"children":1403},{"className":1402},[],[1404],{"type":110,"value":1405},"0x24",{"type":104,"tag":1247,"props":1407,"children":1408},{},[1409],{"type":110,"value":1410},"RSE",{"type":104,"tag":1247,"props":1412,"children":1413},{},[1414],{"type":110,"value":1415},"requestSequenceError",{"type":104,"tag":1220,"props":1417,"children":1418},{},[1419,1428,1433],{"type":104,"tag":1247,"props":1420,"children":1421},{},[1422],{"type":104,"tag":141,"props":1423,"children":1425},{"className":1424},[],[1426],{"type":110,"value":1427},"0x25",{"type":104,"tag":1247,"props":1429,"children":1430},{},[1431],{"type":110,"value":1432},"NRFSC",{"type":104,"tag":1247,"props":1434,"children":1435},{},[1436],{"type":110,"value":1437},"noResponseFromSubnetComponent",{"type":104,"tag":1220,"props":1439,"children":1440},{},[1441,1450,1455],{"type":104,"tag":1247,"props":1442,"children":1443},{},[1444],{"type":104,"tag":141,"props":1445,"children":1447},{"className":1446},[],[1448],{"type":110,"value":1449},"0x26",{"type":104,"tag":1247,"props":1451,"children":1452},{},[1453],{"type":110,"value":1454},"FPEORA",{"type":104,"tag":1247,"props":1456,"children":1457},{},[1458],{"type":110,"value":1459},"failurePreventsExecutionOfRequestedAction",{"type":104,"tag":1220,"props":1461,"children":1462},{},[1463,1471,1476],{"type":104,"tag":1247,"props":1464,"children":1465},{},[1466],{"type":104,"tag":141,"props":1467,"children":1469},{"className":1468},[],[1470],{"type":110,"value":869},{"type":104,"tag":1247,"props":1472,"children":1473},{},[1474],{"type":110,"value":1475},"ROOR",{"type":104,"tag":1247,"props":1477,"children":1478},{},[1479],{"type":110,"value":1480},"requestOutOfRange",{"type":104,"tag":1220,"props":1482,"children":1483},{},[1484,1493,1498],{"type":104,"tag":1247,"props":1485,"children":1486},{},[1487],{"type":104,"tag":141,"props":1488,"children":1490},{"className":1489},[],[1491],{"type":110,"value":1492},"0x33",{"type":104,"tag":1247,"props":1494,"children":1495},{},[1496],{"type":110,"value":1497},"SAD",{"type":104,"tag":1247,"props":1499,"children":1500},{},[1501],{"type":110,"value":1502},"securityAccessDenied",{"type":104,"tag":1220,"props":1504,"children":1505},{},[1506,1515,1520],{"type":104,"tag":1247,"props":1507,"children":1508},{},[1509],{"type":104,"tag":141,"props":1510,"children":1512},{"className":1511},[],[1513],{"type":110,"value":1514},"0x35",{"type":104,"tag":1247,"props":1516,"children":1517},{},[1518],{"type":110,"value":1519},"IK",{"type":104,"tag":1247,"props":1521,"children":1522},{},[1523],{"type":110,"value":1524},"invalidKey",{"type":104,"tag":1220,"props":1526,"children":1527},{},[1528,1536,1541],{"type":104,"tag":1247,"props":1529,"children":1530},{},[1531],{"type":104,"tag":141,"props":1532,"children":1534},{"className":1533},[],[1535],{"type":110,"value":995},{"type":104,"tag":1247,"props":1537,"children":1538},{},[1539],{"type":110,"value":1540},"ENOA",{"type":104,"tag":1247,"props":1542,"children":1543},{},[1544],{"type":110,"value":1545},"exceedNumberOfAttempts",{"type":104,"tag":1220,"props":1547,"children":1548},{},[1549,1557,1562],{"type":104,"tag":1247,"props":1550,"children":1551},{},[1552],{"type":104,"tag":141,"props":1553,"children":1555},{"className":1554},[],[1556],{"type":110,"value":955},{"type":104,"tag":1247,"props":1558,"children":1559},{},[1560],{"type":110,"value":1561},"RTDNE",{"type":104,"tag":1247,"props":1563,"children":1564},{},[1565],{"type":110,"value":1566},"requiredTimeDelayNotExpired",{"type":104,"tag":1220,"props":1568,"children":1569},{},[1570,1579,1584],{"type":104,"tag":1247,"props":1571,"children":1572},{},[1573],{"type":104,"tag":141,"props":1574,"children":1576},{"className":1575},[],[1577],{"type":110,"value":1578},"0x70",{"type":104,"tag":1247,"props":1580,"children":1581},{},[1582],{"type":110,"value":1583},"UDNA",{"type":104,"tag":1247,"props":1585,"children":1586},{},[1587],{"type":110,"value":1588},"uploadDownloadNotAccepted",{"type":104,"tag":1220,"props":1590,"children":1591},{},[1592,1601,1606],{"type":104,"tag":1247,"props":1593,"children":1594},{},[1595],{"type":104,"tag":141,"props":1596,"children":1598},{"className":1597},[],[1599],{"type":110,"value":1600},"0x71",{"type":104,"tag":1247,"props":1602,"children":1603},{},[1604],{"type":110,"value":1605},"TDS",{"type":104,"tag":1247,"props":1607,"children":1608},{},[1609],{"type":110,"value":1610},"transferDataSuspended",{"type":104,"tag":1220,"props":1612,"children":1613},{},[1614,1623,1628],{"type":104,"tag":1247,"props":1615,"children":1616},{},[1617],{"type":104,"tag":141,"props":1618,"children":1620},{"className":1619},[],[1621],{"type":110,"value":1622},"0x72",{"type":104,"tag":1247,"props":1624,"children":1625},{},[1626],{"type":110,"value":1627},"GPF",{"type":104,"tag":1247,"props":1629,"children":1630},{},[1631],{"type":110,"value":1632},"generalProgrammingFailure",{"type":104,"tag":1220,"props":1634,"children":1635},{},[1636,1645,1650],{"type":104,"tag":1247,"props":1637,"children":1638},{},[1639],{"type":104,"tag":141,"props":1640,"children":1642},{"className":1641},[],[1643],{"type":110,"value":1644},"0x73",{"type":104,"tag":1247,"props":1646,"children":1647},{},[1648],{"type":110,"value":1649},"WBSC",{"type":104,"tag":1247,"props":1651,"children":1652},{},[1653],{"type":110,"value":1654},"wrongBlockSequenceCounter",{"type":104,"tag":1220,"props":1656,"children":1657},{},[1658,1667,1672],{"type":104,"tag":1247,"props":1659,"children":1660},{},[1661],{"type":104,"tag":141,"props":1662,"children":1664},{"className":1663},[],[1665],{"type":110,"value":1666},"0x78",{"type":104,"tag":1247,"props":1668,"children":1669},{},[1670],{"type":110,"value":1671},"RCRRP",{"type":104,"tag":1247,"props":1673,"children":1674},{},[1675],{"type":110,"value":1676},"requestCorrectlyReceived-ResponsePending",{"type":104,"tag":1220,"props":1678,"children":1679},{},[1680,1688,1693],{"type":104,"tag":1247,"props":1681,"children":1682},{},[1683],{"type":104,"tag":141,"props":1684,"children":1686},{"className":1685},[],[1687],{"type":110,"value":356},{"type":104,"tag":1247,"props":1689,"children":1690},{},[1691],{"type":110,"value":1692},"SFNSIAS",{"type":104,"tag":1247,"props":1694,"children":1695},{},[1696],{"type":110,"value":1697},"sub-functionNotSupportedInActiveSession",{"type":104,"tag":1220,"props":1699,"children":1700},{},[1701,1709,1714],{"type":104,"tag":1247,"props":1702,"children":1703},{},[1704],{"type":104,"tag":141,"props":1705,"children":1707},{"className":1706},[],[1708],{"type":110,"value":170},{"type":104,"tag":1247,"props":1710,"children":1711},{},[1712],{"type":110,"value":1713},"SNSIAS",{"type":104,"tag":1247,"props":1715,"children":1716},{},[1717],{"type":110,"value":1718},"serviceNotSupportedInActiveSession",{"type":104,"tag":129,"props":1720,"children":1722},{"id":1721},"can-arbitration-ids",[1723],{"type":110,"value":1724},"CAN Arbitration IDs",{"type":104,"tag":215,"props":1726,"children":1728},{"id":1727},"functional-addressing",[1729],{"type":110,"value":1730},"Functional Addressing",{"type":104,"tag":112,"props":1732,"children":1733},{},[1734,1736,1742],{"type":110,"value":1735},"UDS supports two methods of addressing. The first is functional addressing, which is a type of broadcast. In functional addressing the Arbitration ID is usually ",{"type":104,"tag":141,"props":1737,"children":1739},{"className":1738},[],[1740],{"type":110,"value":1741},"0x7DF",{"type":110,"value":1743},". All ECUs can respond to the request simultaneously. The response will be sent on the ECU's normal response address for Physical Addressing.",{"type":104,"tag":112,"props":1745,"children":1746},{},[1747],{"type":110,"value":1748},"In functional addressing, only payloads that fit in a single CAN message are supported; otherwise, it's unclear which ECU should handle flow control.",{"type":104,"tag":215,"props":1750,"children":1752},{"id":1751},"physical-addressing",[1753],{"type":110,"value":1754},"Physical Addressing",{"type":104,"tag":112,"props":1756,"children":1757},{},[1758,1760,1766,1768,1774,1776,1782],{"type":110,"value":1759},"With physical addressing, the request is sent to a specific ECU. For physical addressing, the Arbitration ID is usually between ",{"type":104,"tag":141,"props":1761,"children":1763},{"className":1762},[],[1764],{"type":110,"value":1765},"0x700",{"type":110,"value":1767}," and ",{"type":104,"tag":141,"props":1769,"children":1771},{"className":1770},[],[1772],{"type":110,"value":1773},"0x800",{"type":110,"value":1775},". The response is sent on the Arbitration ID of the request + 8 (or sometimes + 1, or + ",{"type":104,"tag":141,"props":1777,"children":1779},{"className":1778},[],[1780],{"type":110,"value":1781},"0x6A",{"type":110,"value":1783}," for Volkswagen).",{"type":104,"tag":112,"props":1785,"children":1786},{},[1787,1789,1795,1797,1803],{"type":110,"value":1788},"If 29-bit extended addresses are used, UDS can usually be found on Arbitration IDs of the form ",{"type":104,"tag":141,"props":1790,"children":1792},{"className":1791},[],[1793],{"type":110,"value":1794},"0x18DAxxF1",{"type":110,"value":1796},". In this case the response is not sent on the Arbitration ID of the request + 8, but on ",{"type":104,"tag":141,"props":1798,"children":1800},{"className":1799},[],[1801],{"type":110,"value":1802},"0x18DAF1xx",{"type":110,"value":213},{"title":99,"searchDepth":14,"depth":14,"links":1805},[1806,1807,1829,1830],{"id":131,"depth":14,"text":134},{"id":198,"depth":14,"text":201,"children":1808},[1809,1811,1813,1815,1817,1819,1821,1823,1825,1827],{"id":217,"depth":19,"text":1810},"0x10 — Diagnostic Session Control",{"id":368,"depth":19,"text":1812},"0x11 — ECU Reset",{"id":415,"depth":19,"text":1814},"0x22 / 0x2E — Read / Write Data By Identifier",{"id":517,"depth":19,"text":1816},"0x23 / 0x3D — Read / Write Memory By Address",{"id":627,"depth":19,"text":1818},"0x27 — Security Access",{"id":724,"depth":19,"text":1820},"0x28 — Communication Control",{"id":831,"depth":19,"text":1822},"0x29 — Authentication",{"id":862,"depth":19,"text":1824},"0x31 — Routine Control",{"id":941,"depth":19,"text":1826},"0x34 – 0x37 — Request Download / Upload",{"id":1076,"depth":19,"text":1828},"0x3E — Tester Present",{"id":1149,"depth":14,"text":1152},{"id":1721,"depth":14,"text":1724,"children":1831},[1832,1833],{"id":1727,"depth":19,"text":1730},{"id":1751,"depth":19,"text":1754},"markdown","content:7.knowledge-base:2.diagnostics:6.uds.md","content","7.knowledge-base/2.diagnostics/6.uds.md","md",1778093002008]