flipper-zero-tutorials/gpio/uart_demo
2023-06-29 14:26:28 -05:00
..
application.fam UART demo, making UART read easier. 2023-06-29 14:26:28 -05:00
README.md UART demo, making UART read easier. 2023-06-29 14:26:28 -05:00
ring_buffer.c UART demo, making UART read easier. 2023-06-29 14:26:28 -05:00
ring_buffer.h UART demo, making UART read easier. 2023-06-29 14:26:28 -05:00
uart_demo_10px.png UART demo, making UART read easier. 2023-06-29 14:26:28 -05:00
uart_demo.c UART demo, making UART read easier. 2023-06-29 14:26:28 -05:00
uart_helper.c UART demo, making UART read easier. 2023-06-29 14:26:28 -05:00
uart_helper.h UART demo, making UART read easier. 2023-06-29 14:26:28 -05:00

UART_DEMO

This is a demonstration of using the UART to read (RX) and transmit (TX) data. You can connect pins RX and TX together with a wire or resistor to create a loopback. If you have a second Flipper Zero then you can connect TX of the first Flipper Zero to RX of the second and the RX of the first to TX of the second. You also should connect one of the ground pins from the first Flipper Zero to the second Flipper Zero.

When you run the demo application, you will see three options.

  • The first option "Clear" will clear the menu.
  • The second option "Seng Msg 1" will send "Hello World!" follow by new-line delimiter.
  • The third option "Seng Msg 2" will send "Testing 123." follow by new-line delimiter.

Whenever data is received and the delimiter is detected, the new text will be added as an additional entry in the menu.

How it works

uart_demo.c is the main class that you should look at. The goal was to simplify all the complexity of worker threads and buffers into other files that you should not have to look at.

We include uart_helper.h...

#include "uart_helper.h"

We create a callback to get invoked whenever a new line (text+delimiter) is detected...

// This callback will be invoked whenever a new line is read on the UART!
static void uart_demo_process_line(FuriString* line, void* context) {
    // For the demo, we have code to add the line to the submenu.
}

We configure the UartHelper as follows. We specify the baud rate, the delimiter of our message, if we want the delimiter included in our callback data, and which callback to invoke. When data is received by the UART it will be added to a ring buffer. Once the delimiter is detected in the data, our callback will be invoked with the received data. The UartHelper uses worker threads and ring buffers to do the processing, but all we need to do is call uart_helper_alloc to start receiving data.

#define DEVICE_BAUDRATE 115200
#define LINE_DELIMITER '\n'
#define INCLUDE_LINE_DELIMITER false

app->uart_helper = uart_helper_alloc();
uart_helper_set_baud_rate(app->uart_helper, DEVICE_BAUDRATE);
uart_helper_set_delimiter(app->uart_helper, LINE_DELIMITER, INCLUDE_LINE_DELIMITER);
uart_helper_set_callback(app->uart_helper, uart_demo_process_line, app);

We can also send a string using two helper methods...

// Send a c-style string
uart_helper_send(app->uart_helper, "Hello World!\n", 13);

// Send a FuriString
uart_helper_send_string(app->uart_helper, my_furi_string);