1*61c4878aSAndroid Build Coastguard Worker.. _module-pw_hdlc: 2*61c4878aSAndroid Build Coastguard Worker 3*61c4878aSAndroid Build Coastguard Worker.. rst-class:: with-subtitle 4*61c4878aSAndroid Build Coastguard Worker 5*61c4878aSAndroid Build Coastguard Worker======= 6*61c4878aSAndroid Build Coastguard Workerpw_hdlc 7*61c4878aSAndroid Build Coastguard Worker======= 8*61c4878aSAndroid Build Coastguard Worker.. pigweed-module:: 9*61c4878aSAndroid Build Coastguard Worker :name: pw_hdlc 10*61c4878aSAndroid Build Coastguard Worker 11*61c4878aSAndroid Build Coastguard Worker - **Simple**: Transmit RPCs and other data between devices over serial 12*61c4878aSAndroid Build Coastguard Worker - **Robust**: Detect corruption and data loss 13*61c4878aSAndroid Build Coastguard Worker - **Efficient**: Stream to transport without buffering 14*61c4878aSAndroid Build Coastguard Worker 15*61c4878aSAndroid Build Coastguard Worker.. include:: design.rst 16*61c4878aSAndroid Build Coastguard Worker :start-after: .. pw_hdlc-overview-start 17*61c4878aSAndroid Build Coastguard Worker :end-before: .. pw_hdlc-overview-end 18*61c4878aSAndroid Build Coastguard Worker 19*61c4878aSAndroid Build Coastguard WorkerEncoding looks like this: 20*61c4878aSAndroid Build Coastguard Worker 21*61c4878aSAndroid Build Coastguard Worker.. pw_hdlc-encoding-example-start 22*61c4878aSAndroid Build Coastguard Worker 23*61c4878aSAndroid Build Coastguard Worker.. tab-set:: 24*61c4878aSAndroid Build Coastguard Worker 25*61c4878aSAndroid Build Coastguard Worker .. tab-item:: C++ 26*61c4878aSAndroid Build Coastguard Worker :sync: cpp 27*61c4878aSAndroid Build Coastguard Worker 28*61c4878aSAndroid Build Coastguard Worker .. code-block:: cpp 29*61c4878aSAndroid Build Coastguard Worker 30*61c4878aSAndroid Build Coastguard Worker // Writes a span of data to a pw::stream::Writer and returns the status. This 31*61c4878aSAndroid Build Coastguard Worker // implementation uses the pw_checksum module to compute the CRC-32 frame check 32*61c4878aSAndroid Build Coastguard Worker // sequence. 33*61c4878aSAndroid Build Coastguard Worker 34*61c4878aSAndroid Build Coastguard Worker #include "pw_hdlc/encoder.h" 35*61c4878aSAndroid Build Coastguard Worker #include "pw_hdlc/sys_io_stream.h" 36*61c4878aSAndroid Build Coastguard Worker 37*61c4878aSAndroid Build Coastguard Worker int main() { 38*61c4878aSAndroid Build Coastguard Worker pw::stream::SysIoWriter serial_writer; 39*61c4878aSAndroid Build Coastguard Worker Status status = pw::hdlc::WriteUIFrame(123 /* address */, data, serial_writer); 40*61c4878aSAndroid Build Coastguard Worker if (!status.ok()) { 41*61c4878aSAndroid Build Coastguard Worker PW_LOG_INFO("Writing frame failed! %s", status.str()); 42*61c4878aSAndroid Build Coastguard Worker } 43*61c4878aSAndroid Build Coastguard Worker } 44*61c4878aSAndroid Build Coastguard Worker 45*61c4878aSAndroid Build Coastguard Worker .. tab-item:: Python 46*61c4878aSAndroid Build Coastguard Worker :sync: py 47*61c4878aSAndroid Build Coastguard Worker 48*61c4878aSAndroid Build Coastguard Worker .. code-block:: python 49*61c4878aSAndroid Build Coastguard Worker 50*61c4878aSAndroid Build Coastguard Worker # Read bytes from serial and encode HDLC frames 51*61c4878aSAndroid Build Coastguard Worker 52*61c4878aSAndroid Build Coastguard Worker import serial 53*61c4878aSAndroid Build Coastguard Worker from pw_hdlc import encode 54*61c4878aSAndroid Build Coastguard Worker 55*61c4878aSAndroid Build Coastguard Worker ser = serial.Serial() 56*61c4878aSAndroid Build Coastguard Worker address = 123 57*61c4878aSAndroid Build Coastguard Worker ser.write(encode.ui_frame(address, b'your data here!')) 58*61c4878aSAndroid Build Coastguard Worker 59*61c4878aSAndroid Build Coastguard Worker.. pw_hdlc-encoding-example-end 60*61c4878aSAndroid Build Coastguard Worker 61*61c4878aSAndroid Build Coastguard WorkerAnd decoding looks like this: 62*61c4878aSAndroid Build Coastguard Worker 63*61c4878aSAndroid Build Coastguard Worker.. pw_hdlc-decoding-example-start 64*61c4878aSAndroid Build Coastguard Worker 65*61c4878aSAndroid Build Coastguard Worker.. tab-set:: 66*61c4878aSAndroid Build Coastguard Worker 67*61c4878aSAndroid Build Coastguard Worker .. tab-item:: C++ 68*61c4878aSAndroid Build Coastguard Worker :sync: cpp 69*61c4878aSAndroid Build Coastguard Worker 70*61c4878aSAndroid Build Coastguard Worker .. code-block:: cpp 71*61c4878aSAndroid Build Coastguard Worker 72*61c4878aSAndroid Build Coastguard Worker // Read individual bytes from pw::sys_io and decode HDLC frames. 73*61c4878aSAndroid Build Coastguard Worker 74*61c4878aSAndroid Build Coastguard Worker #include "pw_hdlc/decoder.h" 75*61c4878aSAndroid Build Coastguard Worker #include "pw_sys_io/sys_io.h" 76*61c4878aSAndroid Build Coastguard Worker 77*61c4878aSAndroid Build Coastguard Worker int main() { 78*61c4878aSAndroid Build Coastguard Worker std::byte data; 79*61c4878aSAndroid Build Coastguard Worker std::array<std::byte, 128> decode_buffer; 80*61c4878aSAndroid Build Coastguard Worker pw::hdlc::Decoder decoder(decode_buffer); 81*61c4878aSAndroid Build Coastguard Worker while (true) { 82*61c4878aSAndroid Build Coastguard Worker if (!pw::sys_io::ReadByte(&data).ok()) { 83*61c4878aSAndroid Build Coastguard Worker // Log serial reading error 84*61c4878aSAndroid Build Coastguard Worker } 85*61c4878aSAndroid Build Coastguard Worker Result<Frame> decoded_frame = decoder.Process(data); 86*61c4878aSAndroid Build Coastguard Worker 87*61c4878aSAndroid Build Coastguard Worker if (decoded_frame.ok()) { 88*61c4878aSAndroid Build Coastguard Worker // Handle the decoded frame 89*61c4878aSAndroid Build Coastguard Worker } 90*61c4878aSAndroid Build Coastguard Worker } 91*61c4878aSAndroid Build Coastguard Worker } 92*61c4878aSAndroid Build Coastguard Worker 93*61c4878aSAndroid Build Coastguard Worker .. tab-item:: Python 94*61c4878aSAndroid Build Coastguard Worker :sync: py 95*61c4878aSAndroid Build Coastguard Worker 96*61c4878aSAndroid Build Coastguard Worker .. code-block:: python 97*61c4878aSAndroid Build Coastguard Worker 98*61c4878aSAndroid Build Coastguard Worker # Decode data read from serial 99*61c4878aSAndroid Build Coastguard Worker 100*61c4878aSAndroid Build Coastguard Worker import serial 101*61c4878aSAndroid Build Coastguard Worker from pw_hdlc import decode 102*61c4878aSAndroid Build Coastguard Worker 103*61c4878aSAndroid Build Coastguard Worker ser = serial.Serial() 104*61c4878aSAndroid Build Coastguard Worker decoder = decode.FrameDecoder() 105*61c4878aSAndroid Build Coastguard Worker 106*61c4878aSAndroid Build Coastguard Worker while True: 107*61c4878aSAndroid Build Coastguard Worker for frame in decoder.process_valid_frames(ser.read()): 108*61c4878aSAndroid Build Coastguard Worker # Handle the decoded frame 109*61c4878aSAndroid Build Coastguard Worker 110*61c4878aSAndroid Build Coastguard Worker.. pw_hdlc-decoding-example-end 111*61c4878aSAndroid Build Coastguard Worker 112*61c4878aSAndroid Build Coastguard Worker.. pw_hdlc-nav-start 113*61c4878aSAndroid Build Coastguard Worker 114*61c4878aSAndroid Build Coastguard Worker.. grid:: 1 115*61c4878aSAndroid Build Coastguard Worker 116*61c4878aSAndroid Build Coastguard Worker .. grid-item-card:: :octicon:`rocket` Get started & guides 117*61c4878aSAndroid Build Coastguard Worker :link: module-pw_hdlc-guide 118*61c4878aSAndroid Build Coastguard Worker :link-type: ref 119*61c4878aSAndroid Build Coastguard Worker :class-item: sales-pitch-cta-primary 120*61c4878aSAndroid Build Coastguard Worker 121*61c4878aSAndroid Build Coastguard Worker How to set up and use ``pw_hdlc`` 122*61c4878aSAndroid Build Coastguard Worker 123*61c4878aSAndroid Build Coastguard Worker.. grid:: 2 124*61c4878aSAndroid Build Coastguard Worker 125*61c4878aSAndroid Build Coastguard Worker .. grid-item-card:: :octicon:`code-square` API reference 126*61c4878aSAndroid Build Coastguard Worker :link: module-pw_hdlc-api 127*61c4878aSAndroid Build Coastguard Worker :link-type: ref 128*61c4878aSAndroid Build Coastguard Worker :class-item: sales-pitch-cta-secondary 129*61c4878aSAndroid Build Coastguard Worker 130*61c4878aSAndroid Build Coastguard Worker Reference details about the ``pw_hdlc`` API 131*61c4878aSAndroid Build Coastguard Worker 132*61c4878aSAndroid Build Coastguard Worker .. grid-item-card:: :octicon:`stack` Design 133*61c4878aSAndroid Build Coastguard Worker :link: module-pw_hdlc-design 134*61c4878aSAndroid Build Coastguard Worker :link-type: ref 135*61c4878aSAndroid Build Coastguard Worker :class-item: sales-pitch-cta-secondary 136*61c4878aSAndroid Build Coastguard Worker 137*61c4878aSAndroid Build Coastguard Worker Design details about ``pw_hdlc`` 138*61c4878aSAndroid Build Coastguard Worker 139*61c4878aSAndroid Build Coastguard Worker.. grid:: 2 140*61c4878aSAndroid Build Coastguard Worker 141*61c4878aSAndroid Build Coastguard Worker .. grid-item-card:: :octicon:`graph` Code size analysis 142*61c4878aSAndroid Build Coastguard Worker :link: module-pw_hdlc-size 143*61c4878aSAndroid Build Coastguard Worker :link-type: ref 144*61c4878aSAndroid Build Coastguard Worker :class-item: sales-pitch-cta-secondary 145*61c4878aSAndroid Build Coastguard Worker 146*61c4878aSAndroid Build Coastguard Worker The code size impact of ``pw_hdlc`` 147*61c4878aSAndroid Build Coastguard Worker 148*61c4878aSAndroid Build Coastguard Worker .. grid-item-card:: :octicon:`list-ordered` RPC over HDLC example 149*61c4878aSAndroid Build Coastguard Worker :link: module-pw_hdlc-rpc-example 150*61c4878aSAndroid Build Coastguard Worker :link-type: ref 151*61c4878aSAndroid Build Coastguard Worker :class-item: sales-pitch-cta-secondary 152*61c4878aSAndroid Build Coastguard Worker 153*61c4878aSAndroid Build Coastguard Worker A step-by-step example of sending RPCs over HDLC 154*61c4878aSAndroid Build Coastguard Worker 155*61c4878aSAndroid Build Coastguard Worker.. grid:: 1 156*61c4878aSAndroid Build Coastguard Worker 157*61c4878aSAndroid Build Coastguard Worker .. grid-item-card:: :octicon:`workflow` Experimental async router 158*61c4878aSAndroid Build Coastguard Worker :link: module-pw_hdlc-router 159*61c4878aSAndroid Build Coastguard Worker :link-type: ref 160*61c4878aSAndroid Build Coastguard Worker :class-item: sales-pitch-cta-secondary 161*61c4878aSAndroid Build Coastguard Worker 162*61c4878aSAndroid Build Coastguard Worker An experimental asynchronous HDLC router using ``pw_channel`` 163*61c4878aSAndroid Build Coastguard Worker 164*61c4878aSAndroid Build Coastguard Worker.. pw_hdlc-nav-end 165*61c4878aSAndroid Build Coastguard Worker 166*61c4878aSAndroid Build Coastguard Worker.. toctree:: 167*61c4878aSAndroid Build Coastguard Worker :maxdepth: 1 168*61c4878aSAndroid Build Coastguard Worker :hidden: 169*61c4878aSAndroid Build Coastguard Worker 170*61c4878aSAndroid Build Coastguard Worker guide 171*61c4878aSAndroid Build Coastguard Worker api 172*61c4878aSAndroid Build Coastguard Worker design 173*61c4878aSAndroid Build Coastguard Worker size 174*61c4878aSAndroid Build Coastguard Worker rpc_example/docs 175*61c4878aSAndroid Build Coastguard Worker router 176*61c4878aSAndroid Build Coastguard Worker Source code <https://cs.opensource.google/pigweed/pigweed/+/main:pw_hdlc/> 177