{"id":341,"date":"2015-08-03T22:23:25","date_gmt":"2015-08-04T05:23:25","guid":{"rendered":"http:\/\/visualgdb.com\/w\/?p=341"},"modified":"2015-08-03T22:23:25","modified_gmt":"2015-08-04T05:23:25","slug":"using-the-uart-interface-on-the-nordic-nrf51-devices","status":"publish","type":"post","link":"https:\/\/visualgdb.com\/tutorials\/arm\/nrf51\/uart\/","title":{"rendered":"Using the UART interface on the Nordic nRF51 devices"},"content":{"rendered":"<p>This tutorial shows how to use the UART interface on the Nordic nRF51 devices using the Nordic firmware package. We will create a basic application using the standard C library functions, such as printf() and scanf() and demonstrate how to interface this application with Visual Studio.<\/p>\n<ol>\n<li>Start Visual Studio and launch the VisualGDB Embedded Project Wizard:<a href=\"http:\/\/visualgdb.com\/w\/wp-content\/uploads\/2015\/08\/01-newprj1.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-342\" src=\"https:\/\/visualgdb.com\/w\/wp-content\/uploads\/2015\/08\/01-newprj1.png\" alt=\"01-newprj\" width=\"800\" height=\"529\" srcset=\"https:\/\/visualgdb.com\/w\/wp-content\/uploads\/2015\/08\/01-newprj1.png 800w, https:\/\/visualgdb.com\/w\/wp-content\/uploads\/2015\/08\/01-newprj1-300x198.png 300w\" sizes=\"(max-width: 800px) 100vw, 800px\" \/><\/a><\/li>\n<li>Ensure that &#8220;New Project -&gt; Embedded Binary&#8221; is selected on the first page:<a href=\"http:\/\/visualgdb.com\/w\/wp-content\/uploads\/2015\/08\/02-binary.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-343\" src=\"https:\/\/visualgdb.com\/w\/wp-content\/uploads\/2015\/08\/02-binary.png\" alt=\"02-binary\" width=\"702\" height=\"571\" srcset=\"https:\/\/visualgdb.com\/w\/wp-content\/uploads\/2015\/08\/02-binary.png 702w, https:\/\/visualgdb.com\/w\/wp-content\/uploads\/2015\/08\/02-binary-300x244.png 300w\" sizes=\"(max-width: 702px) 100vw, 702px\" \/><\/a><\/li>\n<li>On the next page select the device you want to use. As this example does not use any radio functionality, proceed without selecting a softdevice.<a href=\"http:\/\/visualgdb.com\/w\/wp-content\/uploads\/2015\/08\/03-device1.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-344\" src=\"https:\/\/visualgdb.com\/w\/wp-content\/uploads\/2015\/08\/03-device1.png\" alt=\"03-device\" width=\"702\" height=\"639\" srcset=\"https:\/\/visualgdb.com\/w\/wp-content\/uploads\/2015\/08\/03-device1.png 702w, https:\/\/visualgdb.com\/w\/wp-content\/uploads\/2015\/08\/03-device1-300x273.png 300w\" sizes=\"(max-width: 702px) 100vw, 702px\" \/><\/a><\/li>\n<li>Select the LEDBlink (BSP) sample, enable the FIFO-based UART driver and specify the board type printed on a sticker on your board below:<a href=\"http:\/\/visualgdb.com\/w\/wp-content\/uploads\/2015\/08\/04-ledblink2.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-352\" src=\"https:\/\/visualgdb.com\/w\/wp-content\/uploads\/2015\/08\/04-ledblink2.png\" alt=\"04-ledblink\" width=\"702\" height=\"571\" srcset=\"https:\/\/visualgdb.com\/w\/wp-content\/uploads\/2015\/08\/04-ledblink2.png 702w, https:\/\/visualgdb.com\/w\/wp-content\/uploads\/2015\/08\/04-ledblink2-300x244.png 300w\" sizes=\"(max-width: 702px) 100vw, 702px\" \/><\/a><\/li>\n<li>Select a debug method. The nRF51-DK board shown in this example uses the on-board Segger J-Link with Segger software package:<a href=\"http:\/\/visualgdb.com\/w\/wp-content\/uploads\/2015\/08\/05-debug.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-346\" src=\"https:\/\/visualgdb.com\/w\/wp-content\/uploads\/2015\/08\/05-debug.png\" alt=\"05-debug\" width=\"702\" height=\"639\" srcset=\"https:\/\/visualgdb.com\/w\/wp-content\/uploads\/2015\/08\/05-debug.png 702w, https:\/\/visualgdb.com\/w\/wp-content\/uploads\/2015\/08\/05-debug-300x273.png 300w\" sizes=\"(max-width: 702px) 100vw, 702px\" \/><\/a><\/li>\n<li>Press Finish to create your project. Then replace the main() function with the following code:\n<pre class=\"\">\u00a0\u00a0\u00a0 uint32_t err_code;\r\n\u00a0\u00a0 \u00a0const app_uart_comm_params_t comm_params =\r\n\u00a0\u00a0 \u00a0{\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0RX_PIN_NUMBER,\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0TX_PIN_NUMBER,\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0RTS_PIN_NUMBER,\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0CTS_PIN_NUMBER,\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0APP_UART_FLOW_CONTROL_ENABLED,\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0false,\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0UART_BAUDRATE_BAUDRATE_Baud38400\r\n\u00a0\u00a0 \u00a0};\r\n\r\n\u00a0\u00a0 \u00a0APP_UART_FIFO_INIT(&amp;comm_params,\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0UART_RX_BUF_SIZE,\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0UART_TX_BUF_SIZE,\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0uart_error_handle,\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0APP_IRQ_PRIORITY_LOW,\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0err_code);\r\n\r\n\u00a0\u00a0 \u00a0for (;;)\r\n\u00a0\u00a0 \u00a0{\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0uint8_t ch;\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0while (app_uart_get(&amp;ch) != NRF_SUCCESS)\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0{\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0}\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0while (app_uart_put(ch) != NRF_SUCCESS)\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0{\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0}\r\n\u00a0\u00a0 \u00a0}<\/pre>\n<\/li>\n<li>Then add the includes and definitions required by the new code:\n<pre class=\"\">extern \"C\"\r\n{\r\n#include \"app_uart.h\"\r\n#include \"app_error.h\"\r\n}\r\n\r\n#define UART_TX_BUF_SIZE 256\r\n#define UART_RX_BUF_SIZE 1\r\n\r\nvoid uart_error_handle(app_uart_evt_t * p_event)\r\n{\r\n\u00a0\u00a0 \u00a0if (p_event-&gt;evt_type == APP_UART_COMMUNICATION_ERROR)\r\n\u00a0\u00a0 \u00a0{\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0APP_ERROR_HANDLER(p_event-&gt;data.error_communication);\r\n\u00a0\u00a0 \u00a0}\r\n\u00a0\u00a0 \u00a0else if (p_event-&gt;evt_type == APP_UART_FIFO_ERROR)\r\n\u00a0\u00a0 \u00a0{\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0APP_ERROR_HANDLER(p_event-&gt;data.error_code);\r\n\u00a0\u00a0 \u00a0}\r\n}<\/pre>\n<\/li>\n<li>If you try building your project now, you will get an error stating that app_fifo.h is missing. This happens because the file is contained a framework that we have not referenced yet:<a href=\"http:\/\/visualgdb.com\/w\/wp-content\/uploads\/2015\/08\/06-nofifo.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-353\" src=\"https:\/\/visualgdb.com\/w\/wp-content\/uploads\/2015\/08\/06-nofifo.png\" alt=\"06-nofifo\" width=\"695\" height=\"562\" srcset=\"https:\/\/visualgdb.com\/w\/wp-content\/uploads\/2015\/08\/06-nofifo.png 695w, https:\/\/visualgdb.com\/w\/wp-content\/uploads\/2015\/08\/06-nofifo-300x243.png 300w\" sizes=\"(max-width: 695px) 100vw, 695px\" \/><\/a><\/li>\n<li>To fix this, open VisualGDB Project Properties, add the &#8220;NRF51 Libraries&#8221; framework and check the &#8220;fifo&#8221; and &#8220;uart&#8221; checkboxes:<a href=\"http:\/\/visualgdb.com\/w\/wp-content\/uploads\/2015\/08\/07-libs.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-354\" src=\"https:\/\/visualgdb.com\/w\/wp-content\/uploads\/2015\/08\/07-libs.png\" alt=\"07-libs\" width=\"843\" height=\"724\" srcset=\"https:\/\/visualgdb.com\/w\/wp-content\/uploads\/2015\/08\/07-libs.png 843w, https:\/\/visualgdb.com\/w\/wp-content\/uploads\/2015\/08\/07-libs-300x258.png 300w\" sizes=\"(max-width: 843px) 100vw, 843px\" \/><\/a><\/li>\n<li>Press OK and build your project again. The build should now succeed:<a href=\"http:\/\/visualgdb.com\/w\/wp-content\/uploads\/2015\/08\/07a-build.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-355\" src=\"https:\/\/visualgdb.com\/w\/wp-content\/uploads\/2015\/08\/07a-build.png\" alt=\"07a-build\" width=\"695\" height=\"563\" srcset=\"https:\/\/visualgdb.com\/w\/wp-content\/uploads\/2015\/08\/07a-build.png 695w, https:\/\/visualgdb.com\/w\/wp-content\/uploads\/2015\/08\/07a-build-300x243.png 300w\" sizes=\"(max-width: 695px) 100vw, 695px\" \/><\/a><\/li>\n<li>Open the Device Manager, connect the Nordic board to your computer and find the virtual COM port provided by the on-board Segger J-Link. In this example this is COM3:\u00a0 <a href=\"http:\/\/visualgdb.com\/w\/wp-content\/uploads\/2015\/08\/08-jlinkuart.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-357\" src=\"https:\/\/visualgdb.com\/w\/wp-content\/uploads\/2015\/08\/08-jlinkuart.png\" alt=\"08-jlinkuart\" width=\"600\" height=\"549\" srcset=\"https:\/\/visualgdb.com\/w\/wp-content\/uploads\/2015\/08\/08-jlinkuart.png 600w, https:\/\/visualgdb.com\/w\/wp-content\/uploads\/2015\/08\/08-jlinkuart-300x275.png 300w\" sizes=\"(max-width: 600px) 100vw, 600px\" \/><\/a><\/li>\n<li>Open VisualGDB Project Properties, go to the Raw Terminal page and specify the COM port there. Click &#8220;advanced settings&#8221; and specify the speed and the flow control settings matching the ones set to <strong>comm_params<\/strong>. In this example these are 38400 bits per second and hardware control flow:<a href=\"http:\/\/visualgdb.com\/w\/wp-content\/uploads\/2015\/08\/09-uart.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-358\" src=\"https:\/\/visualgdb.com\/w\/wp-content\/uploads\/2015\/08\/09-uart.png\" alt=\"09-uart\" width=\"835\" height=\"733\" srcset=\"https:\/\/visualgdb.com\/w\/wp-content\/uploads\/2015\/08\/09-uart.png 835w, https:\/\/visualgdb.com\/w\/wp-content\/uploads\/2015\/08\/09-uart-300x263.png 300w\" sizes=\"(max-width: 835px) 100vw, 835px\" \/><\/a><\/li>\n<li>Press F5 to start debugging your project. Open the COMx window and type some text there. You will see how the text is being echoed back:<a href=\"http:\/\/visualgdb.com\/w\/wp-content\/uploads\/2015\/08\/10-echo.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-359\" src=\"https:\/\/visualgdb.com\/w\/wp-content\/uploads\/2015\/08\/10-echo.png\" alt=\"10-echo\" width=\"695\" height=\"562\" srcset=\"https:\/\/visualgdb.com\/w\/wp-content\/uploads\/2015\/08\/10-echo.png 695w, https:\/\/visualgdb.com\/w\/wp-content\/uploads\/2015\/08\/10-echo-300x243.png 300w\" sizes=\"(max-width: 695px) 100vw, 695px\" \/><\/a><\/li>\n<li>Now we will demonstrate the use of the standard C library functions like printf(). Include the &lt;stdio.h&gt; file and replace the loop in main() with the following code:\n<pre class=\"\">\u00a0\u00a0\u00a0 for (;;)\r\n\u00a0\u00a0 \u00a0{\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0int value;\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0printf(\"Enter a number: \");\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0scanf(\"%d\", &amp;value);\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0printf(\"\\nYou entered %d (0x%x)\\n\", value, value);\r\n\u00a0\u00a0 \u00a0}<\/pre>\n<\/li>\n<li>Press F5 to build the updated program and start debugging it. Now you will be able to enter the numbers and see the formatted output:<a href=\"http:\/\/visualgdb.com\/w\/wp-content\/uploads\/2015\/08\/11-numbers.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-360\" src=\"https:\/\/visualgdb.com\/w\/wp-content\/uploads\/2015\/08\/11-numbers.png\" alt=\"11-numbers\" width=\"695\" height=\"561\" srcset=\"https:\/\/visualgdb.com\/w\/wp-content\/uploads\/2015\/08\/11-numbers.png 695w, https:\/\/visualgdb.com\/w\/wp-content\/uploads\/2015\/08\/11-numbers-300x242.png 300w\" sizes=\"(max-width: 695px) 100vw, 695px\" \/><\/a><\/li>\n<li>Note that when you start debugging, VisualGDB will prompt whether you want to show an ARM semihosting console, but the console will be empty and all output will be shown in the COMx window:<a href=\"http:\/\/visualgdb.com\/w\/wp-content\/uploads\/2015\/08\/12-semihosting.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-361\" src=\"https:\/\/visualgdb.com\/w\/wp-content\/uploads\/2015\/08\/12-semihosting.png\" alt=\"12-semihosting\" width=\"469\" height=\"171\" srcset=\"https:\/\/visualgdb.com\/w\/wp-content\/uploads\/2015\/08\/12-semihosting.png 469w, https:\/\/visualgdb.com\/w\/wp-content\/uploads\/2015\/08\/12-semihosting-300x109.png 300w\" sizes=\"(max-width: 469px) 100vw, 469px\" \/><\/a><\/li>\n<li>This happens because the Nordic library overrides the functions for sending\/receiving characters, but does not override other functions used by the standard C library. To find out which functions are missing, select &#8220;no&#8221; in the semihosting prompt and then select &#8220;yes&#8221; when VisualGDB suggests downloading the Newlib source code:<a href=\"http:\/\/visualgdb.com\/w\/wp-content\/uploads\/2015\/08\/13-newlib.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-362\" src=\"https:\/\/visualgdb.com\/w\/wp-content\/uploads\/2015\/08\/13-newlib.png\" alt=\"13-newlib\" width=\"496\" height=\"199\" srcset=\"https:\/\/visualgdb.com\/w\/wp-content\/uploads\/2015\/08\/13-newlib.png 496w, https:\/\/visualgdb.com\/w\/wp-content\/uploads\/2015\/08\/13-newlib-300x120.png 300w\" sizes=\"(max-width: 496px) 100vw, 496px\" \/><\/a><\/li>\n<li>You will see that the semihosting call happens inside the default implementation of _isatty() called from printf():<a href=\"http:\/\/visualgdb.com\/w\/wp-content\/uploads\/2015\/08\/14-stack.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-363\" src=\"https:\/\/visualgdb.com\/w\/wp-content\/uploads\/2015\/08\/14-stack.png\" alt=\"14-stack\" width=\"695\" height=\"562\" srcset=\"https:\/\/visualgdb.com\/w\/wp-content\/uploads\/2015\/08\/14-stack.png 695w, https:\/\/visualgdb.com\/w\/wp-content\/uploads\/2015\/08\/14-stack-300x243.png 300w\" sizes=\"(max-width: 695px) 100vw, 695px\" \/><\/a><\/li>\n<li>Add the following code to main() to override the isatty() function:\n<pre class=\"\">extern \"C\" int _isatty(int fd)\r\n{\r\n\u00a0\u00a0 \u00a0return 1;\r\n}<\/pre>\n<p>Now the semihosting prompt won&#8217;t appear anymore.<\/li>\n<li>The code redirecting the output of printf() to the UART is located in the retarget.c file that is provided by Nordic. You can right-click on the _write() function and select &#8220;Explore Call Hierarchy&#8221; to see that it finally ends up calling app_fifo_put():<a href=\"http:\/\/visualgdb.com\/w\/wp-content\/uploads\/2015\/08\/15-calls.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-364\" src=\"https:\/\/visualgdb.com\/w\/wp-content\/uploads\/2015\/08\/15-calls.png\" alt=\"15-calls\" width=\"695\" height=\"650\" srcset=\"https:\/\/visualgdb.com\/w\/wp-content\/uploads\/2015\/08\/15-calls.png 695w, https:\/\/visualgdb.com\/w\/wp-content\/uploads\/2015\/08\/15-calls-300x281.png 300w\" sizes=\"(max-width: 695px) 100vw, 695px\" \/><\/a><\/li>\n<li>Stepping into app_fifo_put() or opening it via the Call Tree view shows that the function is non-blocking, i.e. it will fail in case the FIFO is filled before its contents is transferred out. Note that FIFO_LENGTH is not a global variable like it may seem, but a macro using the <strong>p_fifo<\/strong> parameter. If you have enabled the Clang IntelliSense, you can quickly see it using the Preprocessor Lens and evaluate its value while debugging:<a href=\"http:\/\/visualgdb.com\/w\/wp-content\/uploads\/2015\/08\/16-fifolen.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-365\" src=\"https:\/\/visualgdb.com\/w\/wp-content\/uploads\/2015\/08\/16-fifolen.png\" alt=\"16-fifolen\" width=\"695\" height=\"650\" srcset=\"https:\/\/visualgdb.com\/w\/wp-content\/uploads\/2015\/08\/16-fifolen.png 695w, https:\/\/visualgdb.com\/w\/wp-content\/uploads\/2015\/08\/16-fifolen-300x281.png 300w\" sizes=\"(max-width: 695px) 100vw, 695px\" \/><\/a><\/li>\n<li>You can easily reproduce the overflow by starting to print multiple lines in an infinite loop:<a href=\"http:\/\/visualgdb.com\/w\/wp-content\/uploads\/2015\/08\/17-overflow.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-366\" src=\"https:\/\/visualgdb.com\/w\/wp-content\/uploads\/2015\/08\/17-overflow.png\" alt=\"17-overflow\" width=\"695\" height=\"650\" srcset=\"https:\/\/visualgdb.com\/w\/wp-content\/uploads\/2015\/08\/17-overflow.png 695w, https:\/\/visualgdb.com\/w\/wp-content\/uploads\/2015\/08\/17-overflow-300x281.png 300w\" sizes=\"(max-width: 695px) 100vw, 695px\" \/><\/a><\/li>\n<li>You can resolve this by unchecking the &#8220;uart&#8221; checkbox in the nRF51 Librares group in Embedded Frameworks configuration and providing your own blocking implementations of <strong>_read()<\/strong> and <strong>_write()<\/strong>:\n<pre class=\"\">extern \"C\" int _write(int file, const char * p_char, int len)\r\n{\r\n\u00a0\u00a0 \u00a0for (int i = 0; i &lt; len; i++)\r\n\u00a0\u00a0 \u00a0{\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0while (app_uart_put(p_char[i]) != NRF_SUCCESS)\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0{\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0}\r\n\u00a0\u00a0 \u00a0}\r\n\r\n\u00a0\u00a0 \u00a0return len;\r\n}\r\n\r\n\r\nextern \"C\" int _read(int file, char * p_char, int len)\r\n{\r\n\u00a0\u00a0 \u00a0while (app_uart_get((uint8_t *)p_char) == NRF_ERROR_NOT_FOUND)\r\n\u00a0\u00a0 \u00a0{\r\n\u00a0\u00a0 \u00a0}\r\n\r\n\u00a0\u00a0 \u00a0return 1;\r\n}<\/pre>\n<\/li>\n<li>If you run your program now, the lines will be printed correctly and no overflow will occur because the <strong>_write()<\/strong> function will not return until it manages to store the written character in the FIFO:<a href=\"http:\/\/visualgdb.com\/w\/wp-content\/uploads\/2015\/08\/18-blocking.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-367\" src=\"https:\/\/visualgdb.com\/w\/wp-content\/uploads\/2015\/08\/18-blocking.png\" alt=\"18-blocking\" width=\"695\" height=\"649\" srcset=\"https:\/\/visualgdb.com\/w\/wp-content\/uploads\/2015\/08\/18-blocking.png 695w, https:\/\/visualgdb.com\/w\/wp-content\/uploads\/2015\/08\/18-blocking-300x280.png 300w\" sizes=\"(max-width: 695px) 100vw, 695px\" \/><\/a>Beware that the blocking version of <strong>_write()<\/strong> may interfere with the radio functionality by causing delays that the radio firmware would not expect. Hence if you encounter buffer overruns while debugging radio-related firmware, it is recommended to increase the FIFO size instead.<\/li>\n<\/ol>\n","protected":false},"excerpt":{"rendered":"<p>This tutorial shows how to use the UART interface on the Nordic nRF51 devices using the Nordic firmware package. We<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[89],"tags":[53,95,70],"_links":{"self":[{"href":"https:\/\/visualgdb.com\/w\/wp-json\/wp\/v2\/posts\/341"}],"collection":[{"href":"https:\/\/visualgdb.com\/w\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/visualgdb.com\/w\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/visualgdb.com\/w\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/visualgdb.com\/w\/wp-json\/wp\/v2\/comments?post=341"}],"version-history":[{"count":1,"href":"https:\/\/visualgdb.com\/w\/wp-json\/wp\/v2\/posts\/341\/revisions"}],"predecessor-version":[{"id":368,"href":"https:\/\/visualgdb.com\/w\/wp-json\/wp\/v2\/posts\/341\/revisions\/368"}],"wp:attachment":[{"href":"https:\/\/visualgdb.com\/w\/wp-json\/wp\/v2\/media?parent=341"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/visualgdb.com\/w\/wp-json\/wp\/v2\/categories?post=341"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/visualgdb.com\/w\/wp-json\/wp\/v2\/tags?post=341"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}