{"id":4255,"date":"2020-05-27T20:00:38","date_gmt":"2020-05-27T18:00:38","guid":{"rendered":"https:\/\/msalamon.pl\/?p=4255"},"modified":"2025-12-27T17:26:36","modified_gmt":"2025-12-27T16:26:36","slug":"radio-communication-using-nrf24l01-modules-part-2","status":"publish","type":"post","link":"https:\/\/msalamon.pl\/en\/radio-communication-using-nrf24l01-modules-part-2\/","title":{"rendered":"Radio communication using nRF24L01+ modules, part 2"},"content":{"rendered":"\n<p><a href=\"http:\/\/msalamon.pl\/komunikacja-radiowa-z-uzyciem-modulow-nrf24l01-cz-1\/\">In the previous post<\/a> I showed you the simplest way to communicate between two Nucleo boards using the <a href=\"https:\/\/sklep.msalamon.pl\/?s=nrf24&amp;post_type=product&amp;utm_source=blog&amp;utm_medium=article&amp;utm_campaign=nrf24&amp;utm_content=Text\">nRF24L01+<\/a>. For sending and receiving data I used the simplest method, i.e. polling. While checking whether something arrived didn\u2019t do much harm because I only read a single register in the chip, when transmitting I waited in vain until the transfer finished. On top of that, fixed-length data packets were being sent and received. This time I\u2019ll show you how to send data of different lengths and how to receive messages in interrupt mode<\/p>\n\n\n\n<!--more-->\n\n\n\n<p><strong>I also remind you that you can <a href=\"https:\/\/sklep.msalamon.pl\/?s=nrf24&amp;post_type=product\/&amp;utm_source=blog&amp;utm_medium=article&amp;utm_campaign=nrf24&amp;utm_content=Text\">buy modules like this directly from me<\/a>, supporting my work at the same time.<\/strong><\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter\"><a href=\"https:\/\/sklep.msalamon.pl\/?s=nrf24&amp;post_type=product\/&amp;utm_source=blog&amp;utm_medium=banner&amp;utm_campaign=nrf24&amp;utm_content=nrf24\"><img loading=\"lazy\" decoding=\"async\" width=\"1200\" height=\"400\" src=\"http:\/\/msalamon.pl\/wp-content\/uploads\/2020\/05\/nRF24L01-baner.jpg\" alt=\"\" class=\"wp-image-1528\" srcset=\"https:\/\/msalamon.pl\/wp-content\/uploads\/2020\/05\/nRF24L01-baner.jpg 1200w, https:\/\/msalamon.pl\/wp-content\/uploads\/2020\/05\/nRF24L01-baner-300x100.jpg 300w, https:\/\/msalamon.pl\/wp-content\/uploads\/2020\/05\/nRF24L01-baner-1024x341.jpg 1024w, https:\/\/msalamon.pl\/wp-content\/uploads\/2020\/05\/nRF24L01-baner-768x256.jpg 768w, https:\/\/msalamon.pl\/wp-content\/uploads\/2020\/05\/nRF24L01-baner-24x8.jpg 24w, https:\/\/msalamon.pl\/wp-content\/uploads\/2020\/05\/nRF24L01-baner-36x12.jpg 36w, https:\/\/msalamon.pl\/wp-content\/uploads\/2020\/05\/nRF24L01-baner-160x53.jpg 160w\" sizes=\"auto, (max-width: 1200px) 100vw, 1200px\" \/><\/a><\/figure>\n<\/div>\n\n\n<p>The entire series about the <a href=\"https:\/\/sklep.msalamon.pl\/?s=nrf24&amp;post_type=product&amp;utm_source=blog&amp;utm_medium=article&amp;utm_campaign=nrf24&amp;utm_content=Text\">nRF24L01+<\/a>:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><a href=\"http:\/\/msalamon.pl\/komunikacja-radiowa-z-uzyciem-modulow-nrf24l01-cz-1\/\">Part 1<\/a><\/li>\n\n\n\n<li><a href=\"http:\/\/msalamon.pl\/komunikacja-radiowa-z-uzyciem-modulow-nrf24l01-cz-2\/\">Part 2<\/a><\/li>\n\n\n\n<li><a href=\"http:\/\/msalamon.pl\/komunikacja-radiowa-z-uzyciem-modulow-nrf24l01-cz-3\/\">Part 3<\/a><\/li>\n<\/ul>\n\n\n\n<h1 class=\"wp-block-heading\">Dynamic Payload<\/h1>\n\n\n\n<p>In <a href=\"http:\/\/msalamon.pl\/komunikacja-radiowa-z-uzyciem-modulow-nrf24l01-cz-1\/\">the previous part<\/a> I mentioned the most important properties of the <a href=\"https:\/\/sklep.msalamon.pl\/?s=nrf24&amp;post_type=product&amp;utm_source=blog&amp;utm_medium=article&amp;utm_campaign=nrf24&amp;utm_content=Text\">nRF24L01+ <\/a>chips. One of the cool features these chips offer is Dynamic Payload. Payload is the part of the transmitted frame that contains our data that we send\/receive. This is what we can influence, because the rest of the frame construction and decoding is handled by the chip itself.<\/p>\n\n\n\n<p>To enable Dynamic Payload, it\u2019s enough to set the <em>EN_DPL&nbsp;<\/em>bit in the <em>FEATURE<\/em> register to enable the feature itself, and then enable this feature in the <em>DYNPD<\/em> register for the channel where we want to use it, e.g. Pipe 0.<\/p>\n\n\n\n<p>In my library I made a constant <em>NRF24_DYNAMIC_PAYLOAD<\/em> that decides whether to enable Dynamic Payload during initialization. It enables it for all pipes. The library will also behave accordingly.<\/p>\n\n\n\n<p>Once you have Dynamic Payload enabled, all that remains is to use it.<\/p>\n\n\n\n<p>On the transmitter side you don\u2019t need to do anything special. Just write all the data into the <a href=\"https:\/\/sklep.msalamon.pl\/?s=nrf24&amp;post_type=product&amp;utm_source=blog&amp;utm_medium=article&amp;utm_campaign=nrf24&amp;utm_content=Text\">nRF<\/a>. The chip itself will calculate how many bytes it has to send and transmit the packet.<\/p>\n\n\n\n<p>On the receiver side the chip will also calculate how much Payload data arrived, but here you must read from the chip how many bytes are available in the receiver\u2019s FIFO queue. After all, you have to get this information from somewhere.<\/p>\n\n\n\n<p>This is read with the R_RX_PL_WID command. In response, the chip returns how many bytes the first message in the queue has. Now it\u2019s enough to read the known number of bytes with the <em>R_RX_PAYLOAD.<\/em> command.<\/p>\n\n\n\n<p>Simple, right? Here\u2019s what the functions that do this look like.<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"c\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">void nRF24_WriteTXPayload(uint8_t * data, uint8_t size)\n{\n    nRF24_WriteRegisters(NRF24_CMD_W_TX_PAYLOAD, data, size);\n}\n\nuint8_t nRF24_GetDynamicPayloadSize(void)\n{\n    uint8_t result = 0;\n\n    result = nRF24_ReadRegister(NRF24_CMD_R_RX_PL_WID);\n\n    if (result &amp;gt; 32) \/\/ Something went wrong :)\n    {\n        nRF24_FlushRX();\n        nRF24_Delay_ms(2);\n        return 0;\n    }\n    return result;\n}\n\nvoid nRF24_ReadRXPaylaod(uint8_t *data, uint8_t *size)\n{\n    *size = nRF24_GetDynamicPayloadSize();\n    nRF24_ReadRegisters(NRF24_CMD_R_RX_PAYLOAD, data, *size);\n\n    nRF24_WriteRegister(NRF24_STATUS, (1&amp;lt;NRF24_RX_DR));\n    if(nRF24_ReadStatus() &amp;amp; (1&amp;lt;&amp;lt;NRF24_TX_DS))\n        nRF24_WriteRegister(NRF24_STATUS, (1&amp;lt;&amp;lt;NRF24_TX_DS));\n}<\/pre>\n\n\n\n<p>Now I\u2019m able to transmit messages of different lengths. It looks more or less like this.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter\"><img loading=\"lazy\" decoding=\"async\" width=\"688\" height=\"441\" src=\"http:\/\/msalamon.pl\/wp-content\/uploads\/2020\/05\/nrf24_receive_dynamic_payload.png\" alt=\"\" class=\"wp-image-1535\" srcset=\"https:\/\/msalamon.pl\/wp-content\/uploads\/2020\/05\/nrf24_receive_dynamic_payload.png 688w, https:\/\/msalamon.pl\/wp-content\/uploads\/2020\/05\/nrf24_receive_dynamic_payload-300x192.png 300w, https:\/\/msalamon.pl\/wp-content\/uploads\/2020\/05\/nrf24_receive_dynamic_payload-24x15.png 24w, https:\/\/msalamon.pl\/wp-content\/uploads\/2020\/05\/nrf24_receive_dynamic_payload-36x23.png 36w, https:\/\/msalamon.pl\/wp-content\/uploads\/2020\/05\/nrf24_receive_dynamic_payload-125x80.png 125w\" sizes=\"auto, (max-width: 688px) 100vw, 688px\" \/><\/figure>\n<\/div>\n\n\n<p><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Interrupt on receiving a frame<\/h2>\n\n\n\n<p>First I\u2019ll discuss how I handled the receive interrupt. In a way, I already used this interrupt in polling mode. How? Well, \u201cenabling\u201d interrupts only enables their reflection on the IRQ pin. The registers, with the interrupt \u201cdisabled\u201d, still behave such that the appropriate bits in the status register are set. That\u2019s why, wanting to find out whether something arrived, I read the <em>STATUS<\/em> register, which contains information about interrupts, and checked whether the <em>RX_DR<\/em> bit, i.e. Receiver Data Ready, was set.<\/p>\n\n\n\n<p>Such continuous polling wastes a bit of the microcontroller\u2019s power. A bit, because it\u2019s only one register, but it still takes some time during I\u00b2C or SPI transfer. It\u2019s better to check, for example, a flag in RAM that will tell us whether an interrupt occurred recently.<\/p>\n\n\n\n<p>By setting the <em>RX_DR <\/em>bit in the <em>CONFIG<\/em> register I will cause an active (low) state to appear on the IRQ pin every time the RX_DR bit is set in the <em>STATUS<\/em> register. This means that I will read this register only when there is some valuable information there for me. In this case it will be the readiness of data to be read after receiving.<\/p>\n\n\n\n<p>I wrote a short interrupt handler that sets the appropriate flags in the library depending on what happened.<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"c\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">void nRF24_IRQ_Handler(void)\n{\n\tuint8_t status = nRF24_ReadStatus();\n\tuint8_t ClearIrq = 0;\n\t\/\/ RX FIFO Interrupt\n\tif ((status &amp;amp; (1 &amp;lt;&amp;lt; NRF24_RX_DR)))\n\t{\n\t\tnrf24_rx_flag = 1;\n\t\tClearIrq |= (1&amp;lt;&amp;lt;NRF24_RX_DR); \/\/ Interrupt flag clear\n\n\t}\n\t\/\/ TX Data Sent interrupt\n\tif ((status &amp;amp; (1 &amp;lt;&amp;lt; NRF24_TX_DS)))\n\t{\n\t\tnrf24_tx_flag = 1;\n\t\tClearIrq |= (1&amp;lt;&amp;lt;NRF24_TX_DS); \/\/ Interrupt flag clear\n\t}\n\t\/\/ Max Retransmits interrupt\n\tif ((status &amp;amp; (1 &amp;lt;&amp;lt; NRF24_MAX_RT)))\n\t{\n\t\tnrf24_mr_flag = 1;\n\t\tClearIrq |= (1&amp;lt;&amp;lt;NRF24_MAX_RT); \/\/ Interrupt flag clear\n\t}\n\n\tnRF24_WriteStatus(ClearIrq);\n}<\/pre>\n\n\n\n<p>I then handle these flags appropriately in the code. This happens outside the interrupt, because interrupts generally cannot last too long.<\/p>\n\n\n\n<p>For interrupt handling I wrote an event function and appropriate callbacks, modeled after those from HAL.<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"c\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">__weak void nRF24_EventRxCallback(void)\n{\n\n}\n\n__weak void nRF24_EventTxCallback(void)\n{\n\n}\n\n__weak void nRF24_EventMrCallback(void)\n{\n\n}\n\nvoid nRF24_Event(void)\n{\n\tif(nrf24_rx_flag)\n\t{\n\t\tnRF24_EventRxCallback();\n\t\tnrf24_rx_flag = 0;\n\t}\n\n\tif(nrf24_tx_flag)\n\t{\n\t\tnRF24_EventTxCallback();\n\t\tnrf24_tx_flag = 0;\n\t}\n\n\tif(nrf24_mr_flag)\n\t{\n\t\tnRF24_EventMrCallback();\n\t\tnrf24_mr_flag = 0;\n\t}\n}<\/pre>\n\n\n\n<p>As you can see, the callbacks are empty by default and have the <em>__weak<\/em> symbol. You need to override them in your program, which I also did in the main.c file.<\/p>\n\n\n\n<p>You put the <em>nRF24_Event<\/em> function into the main loop of the program. Events, i.e. the appropriate callbacks inside, will execute only if one of the interrupt-related flags is set.<\/p>\n\n\n\n<p>Also remember to enable the EXTI_GPIO interrupt on the IRQ pin and set the callback for this interrupt!<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"c\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)\n{\n\tif(Pin == NRF24_IRQ_Pin)\n\t{\n\t\n\t\tnRF24_IRQ_Handler();\n\t}\n}<\/pre>\n\n\n\n<h2 class=\"wp-block-heading\"><figure><a href=\"https:\/\/sklep.msalamon.pl\/kategoria-produktu\/dev-boardy\/stm32-nucleo\/?utm_source=blog&amp;utm_medium=banner&amp;utm_campaign=nrf24&amp;utm_content=nucleo\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/msalamon.pl\/wp-content\/uploads\/2020\/07\/Nucleo-64-baner.jpg\" alt=\"\" width=\"1200\" height=\"400\" class=\"aligncenter wp-image-1593 size-full\" srcset=\"https:\/\/msalamon.pl\/wp-content\/uploads\/2020\/07\/Nucleo-64-baner.jpg 1200w, https:\/\/msalamon.pl\/wp-content\/uploads\/2020\/07\/Nucleo-64-baner-300x100.jpg 300w, https:\/\/msalamon.pl\/wp-content\/uploads\/2020\/07\/Nucleo-64-baner-1024x341.jpg 1024w, https:\/\/msalamon.pl\/wp-content\/uploads\/2020\/07\/Nucleo-64-baner-768x256.jpg 768w\" sizes=\"auto, (max-width: 1200px) 100vw, 1200px\"><\/a><\/figure><\/h2>\n\n\n\n<h2 class=\"wp-block-heading\">Read after an interrupt<\/h2>\n\n\n\n<p>OK, an interrupt occurred, the receive flag was set and the callback was called. What should you do in such a callback? If it\u2019s a callback for received data then\u2026 receive that data \ud83d\ude42<\/p>\n\n\n\n<p>In main.c I wrote an overriding function like this.<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"c\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">void nRF24_EventRxCallback(void)\n{\n\tdo\n\t{\n\t\tnRF24_ReceivePacket(Message, &amp;amp;MessageLength);\n\t\tMessage[MessageLength] = 0; \/\/ end of string\n\t\tMessageLength = sprintf(Message, \"%s\\n\\r\", Message);\n\t\tHAL_UART_Transmit(&amp;amp;huart2, Message, MessageLength, 1000);\n\t}while(!nRF24_IsRxEmpty());\n}<\/pre>\n\n\n\n<p>What am I doing here? I receive data via <em>nRF24_ReceivePacket&nbsp;<\/em>as long as the data is available. The <em>nRF24_IsRxEmpty()<\/em> function tells us about data availability.<\/p>\n\n\n\n<p>In the example I simply print this data to UART, but in your program it may go, for example, into a circular buffer, and in the buffer event be parsed accordingly. You have freedom here, however you must keep the receiving and checking whether the FIFO is already empty.<\/p>\n\n\n\n<p>Also remember that the <em>nRF24_ReceivePacket<\/em> function returns through the second argument how much data was fetched from the <a href=\"https:\/\/sklep.msalamon.pl\/?s=nrf24&amp;post_type=product&amp;utm_source=blog&amp;utm_medium=article&amp;utm_campaign=nrf24&amp;utm_content=Text\">nRF<\/a> (Dynamic Payload).<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Summary<\/h2>\n\n\n\n<p>This is what handling Dynamic Payload and the receive interrupt would look like. The transmitted data is still blocking, because the library actively waits for the transmission by polling the chip to see if it has finished. An interrupt would also be useful for that, but I\u2019ll approach it a bit differently.<\/p>\n\n\n\n<p>In the next article I\u2019ll add circular buffers for transmitting and receiving, which I will nicely use in non-blocking transmit handling.<\/p>\n\n\n\n<p>The whole series:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><a href=\"http:\/\/msalamon.pl\/komunikacja-radiowa-z-uzyciem-modulow-nrf24l01-cz-1\/\">Part 1<\/a><\/li>\n\n\n\n<li><a href=\"http:\/\/msalamon.pl\/komunikacja-radiowa-z-uzyciem-modulow-nrf24l01-cz-2\/\">Part 2<\/a><\/li>\n\n\n\n<li><a href=\"http:\/\/msalamon.pl\/komunikacja-radiowa-z-uzyciem-modulow-nrf24l01-cz-3\/\">Part 3<\/a><\/li>\n<\/ul>\n\n\n\n<p><strong>If you liked the article, you can support me by buying something from me \ud83d\ude42 <a href=\"https:\/\/sklep.msalamon.pl\/?utm_source=blog&amp;utm_medium=article&amp;utm_campaign=nrf24&amp;utm_content=Text\">https:\/\/sklep.msalamon.pl\/<\/a><\/strong><\/p>\n\n\n\n<p>You can find the full project along with the library as usual on my GitHub: <a href=\"https:\/\/github.com\/lamik\/nRF24L01_Transmitter\/tree\/Interrupt_RX\" target=\"_blank\" rel=\"noopener\">TRANSMITTER<\/a>, <a href=\"https:\/\/github.com\/lamik\/nRF24L01_Receiver\/tree\/Interrupt_RX\" target=\"_blank\" rel=\"noopener\">RECEIVER<\/a><\/p>\n\n\n\n<p><span>If you noticed an error, disagree with something, would like to add something important, or simply feel like you\u2019d like to discuss this topic, write a comment. Remember that the discussion should be polite and consistent with the rules of the Polish language.<\/span><\/p>\n\n\n<div class=\"kk-star-ratings kksr-auto kksr-align-left kksr-valign-bottom\"\n    data-payload='{&quot;align&quot;:&quot;left&quot;,&quot;id&quot;:&quot;4255&quot;,&quot;slug&quot;:&quot;default&quot;,&quot;valign&quot;:&quot;bottom&quot;,&quot;ignore&quot;:&quot;&quot;,&quot;reference&quot;:&quot;auto&quot;,&quot;class&quot;:&quot;&quot;,&quot;count&quot;:&quot;0&quot;,&quot;legendonly&quot;:&quot;&quot;,&quot;readonly&quot;:&quot;&quot;,&quot;score&quot;:&quot;0&quot;,&quot;starsonly&quot;:&quot;&quot;,&quot;best&quot;:&quot;5&quot;,&quot;gap&quot;:&quot;0&quot;,&quot;greet&quot;:&quot;&quot;,&quot;legend&quot;:&quot;0\\\/5 - (0 votes)&quot;,&quot;size&quot;:&quot;24&quot;,&quot;title&quot;:&quot;Radio communication using nRF24L01+ modules, part 2&quot;,&quot;width&quot;:&quot;0&quot;,&quot;_legend&quot;:&quot;{score}\\\/{best} - ({count} {votes})&quot;,&quot;font_factor&quot;:&quot;1.25&quot;}'>\n            \n<div class=\"kksr-stars\">\n    \n<div class=\"kksr-stars-inactive\">\n            <div class=\"kksr-star\" data-star=\"1\" style=\"padding-right: 0px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 24px; height: 24px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" data-star=\"2\" style=\"padding-right: 0px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 24px; height: 24px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" data-star=\"3\" style=\"padding-right: 0px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 24px; height: 24px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" data-star=\"4\" style=\"padding-right: 0px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 24px; height: 24px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" data-star=\"5\" style=\"padding-right: 0px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 24px; height: 24px;\"><\/div>\n        <\/div>\n    <\/div>\n    \n<div class=\"kksr-stars-active\" style=\"width: 0px;\">\n            <div class=\"kksr-star\" style=\"padding-right: 0px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 24px; height: 24px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" style=\"padding-right: 0px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 24px; height: 24px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" style=\"padding-right: 0px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 24px; height: 24px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" style=\"padding-right: 0px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 24px; height: 24px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" style=\"padding-right: 0px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 24px; height: 24px;\"><\/div>\n        <\/div>\n    <\/div>\n<\/div>\n                \n\n<div class=\"kksr-legend\" style=\"font-size: 19.2px;\">\n            <span class=\"kksr-muted\"><\/span>\n    <\/div>\n    <\/div>\n","protected":false},"excerpt":{"rendered":"<p>In the previous post I showed you the simplest way to communicate between two Nucleo boards using the nRF24L01+. For sending and receiving data I used the simplest method, i.e. polling. While checking whether something arrived didn\u2019t do much harm because I only read a single register in the chip, [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":3445,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_links_to":"","_links_to_target":""},"categories":[160],"tags":[175,176,174],"class_list":["post-4255","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-stm32","tag-electronics","tag-programming","tag-stm32"],"_links":{"self":[{"href":"https:\/\/msalamon.pl\/en\/wp-json\/wp\/v2\/posts\/4255","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/msalamon.pl\/en\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/msalamon.pl\/en\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/msalamon.pl\/en\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/msalamon.pl\/en\/wp-json\/wp\/v2\/comments?post=4255"}],"version-history":[{"count":3,"href":"https:\/\/msalamon.pl\/en\/wp-json\/wp\/v2\/posts\/4255\/revisions"}],"predecessor-version":[{"id":4370,"href":"https:\/\/msalamon.pl\/en\/wp-json\/wp\/v2\/posts\/4255\/revisions\/4370"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/msalamon.pl\/en\/wp-json\/wp\/v2\/media\/3445"}],"wp:attachment":[{"href":"https:\/\/msalamon.pl\/en\/wp-json\/wp\/v2\/media?parent=4255"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/msalamon.pl\/en\/wp-json\/wp\/v2\/categories?post=4255"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/msalamon.pl\/en\/wp-json\/wp\/v2\/tags?post=4255"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}