{"id":4600,"date":"2026-07-19T09:00:27","date_gmt":"2026-07-19T09:00:27","guid":{"rendered":"https:\/\/blog.embeddedexpert.io\/?p=4600"},"modified":"2026-07-19T09:00:28","modified_gmt":"2026-07-19T09:00:28","slug":"uart-based-sensor-emulation-part-2-establish-communication","status":"publish","type":"post","link":"https:\/\/blog.embeddedexpert.io\/?p=4600","title":{"rendered":"UART Based Sensor Emulation Part 2: Establish Communication"},"content":{"rendered":"\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"559\" src=\"https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2026\/07\/Gemini_Generated_Image_vetcfvvetcfvvetc-1024x559.png\" alt=\"\" class=\"wp-image-4601\" srcset=\"https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2026\/07\/Gemini_Generated_Image_vetcfvvetcfvvetc-1024x559.png 1024w, https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2026\/07\/Gemini_Generated_Image_vetcfvvetcfvvetc-300x164.png 300w, https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2026\/07\/Gemini_Generated_Image_vetcfvvetcfvvetc-768x419.png 768w, https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2026\/07\/Gemini_Generated_Image_vetcfvvetcfvvetc-1150x627.png 1150w, https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2026\/07\/Gemini_Generated_Image_vetcfvvetcfvvetc-750x409.png 750w, https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2026\/07\/Gemini_Generated_Image_vetcfvvetcfvvetc-400x218.png 400w, https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2026\/07\/Gemini_Generated_Image_vetcfvvetcfvvetc-250x136.png 250w, https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2026\/07\/Gemini_Generated_Image_vetcfvvetcfvvetc.png 1408w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>Establishing reliable bidirectional communication is the foundational step in validating the sensor emulation framework, ensuring that the master device and the emulated sensor can exchange data packets effectively. By implementing an echo protocol where the emulator mirrors the received master request, you can verify link integrity and confirm that the timing and data formatting align perfectly with the target sensor\u2019s specifications.<\/p>\n\n\n\n<p><\/p>\n\n\n\n<p>In this guide, we shall cover the following:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Introduction.<\/li>\n\n\n\n<li>Emulated sensor firmware development.<\/li>\n\n\n\n<li>Master MCU firmware development.<\/li>\n\n\n\n<li>Results.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">1. Introduction:<\/h2>\n\n\n\n<p>The transition from individual component configuration to functional, bidirectional communication represents a critical milestone in sensor emulation development. At this stage, we move beyond static setup to create a dynamic handshake between the Master controller and the Emulated Sensor. The implementation of an echo protocol acts as the primary validation mechanism for the entire architecture; by forcing the emulator to receive a command from the Master and immediately return that data to the origin, we create a closed-loop system. This process is instrumental in verifying that the UART parameters\u2014such as baud rate, parity, and timing constraints\u2014are perfectly synchronized across both STM32F4 Nucleo-64 boards.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">The Significance of the Echo Protocol<\/h3>\n\n\n\n<p>The &#8220;echo&#8221; approach is favored in embedded systems design because it provides an immediate, low-latency acknowledgment of system health and connectivity without requiring complex application-layer state machines. For an emulation environment, this design serves several strategic purposes:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Link Integrity Verification:<\/strong>\u00a0It allows for the instantaneous confirmation of physical electrical connectivity. If the Master sends a byte and does not receive the expected mirror, it indicates a failure in the TX\/RX physical path or a mismatch in the UART frame configuration.<\/li>\n\n\n\n<li><strong>Latency Benchmarking:<\/strong>\u00a0By measuring the time interval between the transmission of a command and the receipt of the echo, developers can precisely determine the total latency of the communication channel. This is essential for ensuring that the emulation remains within the timing budgets required by the target application\u2019s real-time constraints.<\/li>\n\n\n\n<li><strong>Protocol Synchronization:<\/strong>\u00a0The echo mechanism acts as a foundation for more sophisticated master-slave communication. Once a simple echo is reliable, it becomes trivial to transition to more complex packet structures, such as command-response pairs involving headers, data payloads, and checksums (like CRC-16 or parity checks).<\/li>\n\n\n\n<li><strong>Deterministic Debugging:<\/strong>\u00a0Because the emulator is programmed to respond predictably to specific inputs, any deviation in the echoed data stream provides a clear indicator of where the communication flow is being interrupted\u2014whether it is at the interrupt service routine (ISR) entry, buffer overflow, or data processing stage.<\/li>\n<\/ul>\n\n\n\n<p>By establishing this reliable feedback loop, we ensure that the communication infrastructure is robust before introducing the logic that simulates specific, high-fidelity sensor behavior. This ensures that when we eventually stream complex data profiles, any errors encountered are identified as application-level issues rather than fundamental problems with the underlying UART link.<\/p>\n\n\n\n<p><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">2. Emulated Sensor Firmware Development:<\/h2>\n\n\n\n<p>We start off with emulated sensor project.<\/p>\n\n\n\n<p>Open the project and then open main.c<\/p>\n\n\n\n<p><\/p>\n\n\n\n<p>In main.c, in user code begin PV, declare the following:<\/p>\n\n\n\n<div class=\"wp-block-codemirror-blocks-code-block code-block\"><pre class=\"CodeMirror\" data-setting=\"{&quot;showPanel&quot;:true,&quot;languageLabel&quot;:&quot;language&quot;,&quot;fullScreenButton&quot;:true,&quot;copyButton&quot;:true,&quot;mode&quot;:&quot;clike&quot;,&quot;mime&quot;:&quot;text\/x-csrc&quot;,&quot;theme&quot;:&quot;dracula&quot;,&quot;lineNumbers&quot;:false,&quot;styleActiveLine&quot;:false,&quot;lineWrapping&quot;:false,&quot;readOnly&quot;:true,&quot;fileName&quot;:&quot;C&quot;,&quot;language&quot;:&quot;C&quot;,&quot;maxHeight&quot;:&quot;400px&quot;,&quot;modeName&quot;:&quot;c&quot;}\">#define BufferSize 50\nuint8_t RxBuffer[BufferSize];<\/pre><\/div>\n\n\n\n<p>This is an array to hold the received data from the master MCU. This will allow us to receive the incoming bytes using DMA which will free the CPU.<\/p>\n\n\n\n<p>Next, in user code begin 0, declare the following function:<\/p>\n\n\n\n<div class=\"wp-block-codemirror-blocks-code-block code-block\"><pre class=\"CodeMirror\" data-setting=\"{&quot;showPanel&quot;:true,&quot;languageLabel&quot;:&quot;language&quot;,&quot;fullScreenButton&quot;:true,&quot;copyButton&quot;:true,&quot;mode&quot;:&quot;clike&quot;,&quot;mime&quot;:&quot;text\/x-csrc&quot;,&quot;theme&quot;:&quot;dracula&quot;,&quot;lineNumbers&quot;:false,&quot;styleActiveLine&quot;:false,&quot;lineWrapping&quot;:false,&quot;readOnly&quot;:true,&quot;fileName&quot;:&quot;C&quot;,&quot;language&quot;:&quot;C&quot;,&quot;maxHeight&quot;:&quot;400px&quot;,&quot;modeName&quot;:&quot;c&quot;}\">void HAL_UARTEx_RxEventCallback(UART_HandleTypeDef *huart, uint16_t Size)\n\n{\n\n\tif(huart-&gt;Instance == USART1)\n\t{\n\t\tHAL_UART_Transmit(&amp;huart1, RxBuffer, Size, 100);\n\t\tHAL_UARTEx_ReceiveToIdle_DMA(&amp;huart1, RxBuffer, BufferSize);\n\n\t}\n\n}<\/pre><\/div>\n\n\n\n<p>This function allows the user to use IDLE line to receive unknown length of data but limited to the BufferSize (50 character in this case).<\/p>\n\n\n\n<p>Once the characters has been received or IDLE has been detected, the function shall be called.<\/p>\n\n\n\n<p>Here, we are just sending back the characters and restart the operation of the uart.<\/p>\n\n\n\n<p>In user code begin 2 in main function, declare start the reception with IDLE in DMA mode as follows:<\/p>\n\n\n\n<div class=\"wp-block-codemirror-blocks-code-block code-block\"><pre class=\"CodeMirror\" data-setting=\"{&quot;showPanel&quot;:true,&quot;languageLabel&quot;:&quot;language&quot;,&quot;fullScreenButton&quot;:true,&quot;copyButton&quot;:true,&quot;mode&quot;:&quot;clike&quot;,&quot;mime&quot;:&quot;text\/x-csrc&quot;,&quot;theme&quot;:&quot;dracula&quot;,&quot;lineNumbers&quot;:false,&quot;styleActiveLine&quot;:false,&quot;lineWrapping&quot;:false,&quot;readOnly&quot;:true,&quot;fileName&quot;:&quot;C&quot;,&quot;language&quot;:&quot;C&quot;,&quot;maxHeight&quot;:&quot;400px&quot;,&quot;modeName&quot;:&quot;c&quot;}\">HAL_UARTEx_ReceiveToIdle_DMA(&amp;huart1, RxBuffer, BufferSize);<\/pre><\/div>\n\n\n\n<p>Thats all for the emulated sensor part.<\/p>\n\n\n\n<p>Save, build the project and run it as follows:<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"34\" src=\"https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2026\/04\/image-1-1024x34.png\" alt=\"\" class=\"wp-image-4349\" srcset=\"https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2026\/04\/image-1-1024x34.png 1024w, https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2026\/04\/image-1-300x10.png 300w, https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2026\/04\/image-1-768x26.png 768w, https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2026\/04\/image-1-1536x51.png 1536w, https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2026\/04\/image-1-1150x38.png 1150w, https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2026\/04\/image-1-750x25.png 750w, https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2026\/04\/image-1-400x13.png 400w, https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2026\/04\/image-1-250x8.png 250w, https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2026\/04\/image-1.png 1986w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">3. Master MCU Firmware Development:<\/h2>\n\n\n\n<p><\/p>\n\n\n\n<p>Open main.c file of the master MCU. <\/p>\n\n\n\n<p>In user code begin PV, declare the following variables:<\/p>\n\n\n\n<div class=\"wp-block-codemirror-blocks-code-block code-block\"><pre class=\"CodeMirror\" data-setting=\"{&quot;showPanel&quot;:true,&quot;languageLabel&quot;:&quot;language&quot;,&quot;fullScreenButton&quot;:true,&quot;copyButton&quot;:true,&quot;mode&quot;:&quot;clike&quot;,&quot;mime&quot;:&quot;text\/x-csrc&quot;,&quot;theme&quot;:&quot;dracula&quot;,&quot;lineNumbers&quot;:false,&quot;styleActiveLine&quot;:false,&quot;lineWrapping&quot;:false,&quot;readOnly&quot;:true,&quot;fileName&quot;:&quot;C&quot;,&quot;language&quot;:&quot;C&quot;,&quot;maxHeight&quot;:&quot;400px&quot;,&quot;modeName&quot;:&quot;c&quot;}\">#define BufferSize 50\nuint8_t RxBuffer[BufferSize];\n\nuint8_t TxBuffer[BufferSize];\n\nuint8_t counter;<\/pre><\/div>\n\n\n\n<ul class=\"wp-block-list\">\n<li>RxBuffer holds the received data.<\/li>\n\n\n\n<li>TxBuffer holds the data to be transferred.<\/li>\n\n\n\n<li>Counter variable when sending the string.<\/li>\n<\/ul>\n\n\n\n<p>In user code begin 0, declare the following function:<\/p>\n\n\n\n<div class=\"wp-block-codemirror-blocks-code-block code-block\"><pre class=\"CodeMirror\" data-setting=\"{&quot;showPanel&quot;:true,&quot;languageLabel&quot;:&quot;language&quot;,&quot;fullScreenButton&quot;:true,&quot;copyButton&quot;:true,&quot;mode&quot;:&quot;clike&quot;,&quot;mime&quot;:&quot;text\/x-csrc&quot;,&quot;theme&quot;:&quot;dracula&quot;,&quot;lineNumbers&quot;:false,&quot;styleActiveLine&quot;:false,&quot;lineWrapping&quot;:false,&quot;readOnly&quot;:true,&quot;fileName&quot;:&quot;C&quot;,&quot;language&quot;:&quot;C&quot;,&quot;maxHeight&quot;:&quot;400px&quot;,&quot;modeName&quot;:&quot;c&quot;}\">void HAL_UARTEx_RxEventCallback(UART_HandleTypeDef *huart, uint16_t Size)\n\n{\n\n\tif(huart-&gt;Instance == USART1)\n\t{\n\t\tHAL_UART_Transmit(&amp;huart2, RxBuffer, Size,10);\n\t\tHAL_UARTEx_ReceiveToIdle_DMA(&amp;huart1, RxBuffer, BufferSize);\n\n\t}\n\n}<\/pre><\/div>\n\n\n\n<p>It is similar to emulated sensor part, the difference that we are sending the received data to USART2 rather that USART1.<\/p>\n\n\n\n<p>Next, in user code begin 2 in main function, start the reception process in DMA with IDLE line as follows:<\/p>\n\n\n\n<div class=\"wp-block-codemirror-blocks-code-block code-block\"><pre class=\"CodeMirror\" data-setting=\"{&quot;showPanel&quot;:true,&quot;languageLabel&quot;:&quot;language&quot;,&quot;fullScreenButton&quot;:true,&quot;copyButton&quot;:true,&quot;mode&quot;:&quot;clike&quot;,&quot;mime&quot;:&quot;text\/x-csrc&quot;,&quot;theme&quot;:&quot;dracula&quot;,&quot;lineNumbers&quot;:false,&quot;styleActiveLine&quot;:false,&quot;lineWrapping&quot;:false,&quot;readOnly&quot;:true,&quot;fileName&quot;:&quot;C&quot;,&quot;language&quot;:&quot;C&quot;,&quot;maxHeight&quot;:&quot;400px&quot;,&quot;modeName&quot;:&quot;c&quot;}\">HAL_UARTEx_ReceiveToIdle_DMA(&amp;huart1, RxBuffer, BufferSize);<\/pre><\/div>\n\n\n\n<p><\/p>\n\n\n\n<p>Next, in user code begin 3 in while 1 loop:<\/p>\n\n\n\n<div class=\"wp-block-codemirror-blocks-code-block code-block\"><pre class=\"CodeMirror\" data-setting=\"{&quot;showPanel&quot;:true,&quot;languageLabel&quot;:&quot;language&quot;,&quot;fullScreenButton&quot;:true,&quot;copyButton&quot;:true,&quot;mode&quot;:&quot;clike&quot;,&quot;mime&quot;:&quot;text\/x-csrc&quot;,&quot;theme&quot;:&quot;dracula&quot;,&quot;lineNumbers&quot;:false,&quot;styleActiveLine&quot;:false,&quot;lineWrapping&quot;:false,&quot;readOnly&quot;:true,&quot;fileName&quot;:&quot;C&quot;,&quot;language&quot;:&quot;C&quot;,&quot;maxHeight&quot;:&quot;400px&quot;,&quot;modeName&quot;:&quot;c&quot;}\">uint16_t len;\nlen=sprintf(TxBuffer,&quot;Counter value to be send is %d\\r\\n&quot;,counter);\nHAL_UART_Transmit(&amp;huart2,TxBuffer,len,100);\n\nlen=sprintf(TxBuffer,&quot;Counter value = %d\\r\\n&quot;,counter);\nHAL_UART_Transmit(&amp;huart1,TxBuffer,len,100);\ncounter++;\nHAL_Delay(500);<\/pre><\/div>\n\n\n\n<p>This will send two different strings.<\/p>\n\n\n\n<p>Thats all for the master MCU project<\/p>\n\n\n\n<p>Save, build the project and run it as follows:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"34\" src=\"https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2026\/07\/image-1024x34.png\" alt=\"\" class=\"wp-image-4602\" srcset=\"https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2026\/07\/image-1024x34.png 1024w, https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2026\/07\/image-300x10.png 300w, https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2026\/07\/image-768x26.png 768w, https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2026\/07\/image-1536x51.png 1536w, https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2026\/07\/image-1150x38.png 1150w, https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2026\/07\/image-750x25.png 750w, https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2026\/07\/image-400x13.png 400w, https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2026\/07\/image-250x8.png 250w, https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2026\/07\/image.png 1986w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p><\/p>\n\n\n\n<p>You many download the project from here:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Master MCU project from <a href=\"https:\/\/github.com\/hussamaldean\/Embedded-Expert-Post-Projects\/tree\/main\/Projects\/Sensor%20Emulator%20Master\" data-type=\"link\" data-id=\"https:\/\/github.com\/hussamaldean\/Embedded-Expert-Post-Projects\/tree\/main\/Projects\/Sensor%20Emulator%20Master\" target=\"_blank\" rel=\"noreferrer noopener\">here<\/a>.<\/li>\n\n\n\n<li>Emulated Sensor project from <a href=\"https:\/\/github.com\/hussamaldean\/Embedded-Expert-Post-Projects\/tree\/main\/Projects\/Sensor%20Emulation%20DUT\" data-type=\"link\" data-id=\"https:\/\/github.com\/hussamaldean\/Embedded-Expert-Post-Projects\/tree\/main\/Projects\/Sensor%20Emulation%20DUT\" target=\"_blank\" rel=\"noreferrer noopener\">here<\/a>. <\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">4. Results:<\/h2>\n\n\n\n<p>Open your favourite terminal application, set the buadrate to 115200 and you should get the following:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"705\" src=\"https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2026\/07\/2026-07-19_10-18-35-1024x705.png\" alt=\"\" class=\"wp-image-4603\" srcset=\"https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2026\/07\/2026-07-19_10-18-35-1024x705.png 1024w, https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2026\/07\/2026-07-19_10-18-35-300x207.png 300w, https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2026\/07\/2026-07-19_10-18-35-768x529.png 768w, https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2026\/07\/2026-07-19_10-18-35-1536x1058.png 1536w, https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2026\/07\/2026-07-19_10-18-35-1150x792.png 1150w, https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2026\/07\/2026-07-19_10-18-35-750x517.png 750w, https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2026\/07\/2026-07-19_10-18-35-400x276.png 400w, https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2026\/07\/2026-07-19_10-18-35-250x172.png 250w, https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2026\/07\/2026-07-19_10-18-35.png 1890w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p><\/p>\n\n\n\n<p>In next part, we shall start sending some configuration data from main mcu to emulated sensor.<\/p>\n\n\n\n<p>Staty tuned.<\/p>\n\n\n\n<p>Happy coding \ud83d\ude09 <\/p>\n\n\n\n<p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Establishing reliable bidirectional communication is the foundational step in validating the sensor emulation framework, ensuring that the master device and the emulated sensor can exchange data packets effectively. By implementing an echo protocol where the emulator mirrors the received master request, you can verify link integrity and confirm that the timing and data formatting align [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[2,11,12],"tags":[],"class_list":["post-4600","post","type-post","status-publish","format-standard","hentry","category-embedded-systems","category-peripheral-drivers","category-stm32"],"_links":{"self":[{"href":"https:\/\/blog.embeddedexpert.io\/index.php?rest_route=\/wp\/v2\/posts\/4600"}],"collection":[{"href":"https:\/\/blog.embeddedexpert.io\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.embeddedexpert.io\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.embeddedexpert.io\/index.php?rest_route=\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.embeddedexpert.io\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=4600"}],"version-history":[{"count":1,"href":"https:\/\/blog.embeddedexpert.io\/index.php?rest_route=\/wp\/v2\/posts\/4600\/revisions"}],"predecessor-version":[{"id":4604,"href":"https:\/\/blog.embeddedexpert.io\/index.php?rest_route=\/wp\/v2\/posts\/4600\/revisions\/4604"}],"wp:attachment":[{"href":"https:\/\/blog.embeddedexpert.io\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=4600"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.embeddedexpert.io\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=4600"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.embeddedexpert.io\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=4600"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}