Bird
Raised Fist0
Embedded Cprogramming~10 mins

Receiving a byte over UART in Embedded C - Interactive Code Practice

Choose your learning style10 modes available
Practice - 5 Tasks
Answer the questions below
1fill in blank
easy

Complete the code to read a byte from UART data register.

Embedded C
uint8_t received_byte = [1];
Drag options to blanks, or click blank then click option'
AUART_DR
BUART_SR
CUART_CR
DUART_BRR
Attempts:
3 left
💡 Hint
Common Mistakes
Using UART_SR (status register) instead of UART_DR.
Trying to read from UART_CR (control register).
2fill in blank
medium

Complete the code to wait until a byte is received (RXNE flag set).

Embedded C
while (!([1] & (1 << RXNE_FLAG))) {}
Drag options to blanks, or click blank then click option'
AUART_DR
BUART_SR
CUART_CR
DUART_BRR
Attempts:
3 left
💡 Hint
Common Mistakes
Checking RXNE flag in UART_DR instead of UART_SR.
Using UART_CR or UART_BRR which do not hold status flags.
3fill in blank
hard

Fix the error in the code to correctly receive a byte over UART.

Embedded C
uint8_t data;
while (!(UART_SR & (1 << [1]))) {}
data = UART_DR;
Drag options to blanks, or click blank then click option'
ATXE_FLAG
BORE_FLAG
CRXNE_FLAG
DCTS_FLAG
Attempts:
3 left
💡 Hint
Common Mistakes
Using TXE_FLAG which is for transmit, not receive.
Using CTS_FLAG or ORE_FLAG which are unrelated here.
4fill in blank
hard

Fill both blanks to initialize the array with the RXNE flag bit positions for each UART port and access it in the loop.

Embedded C
const int uart_rxne_flags[] = { [1] };
const char* uart_ports[] = {"UART1", "UART2", "UART3"};
for (int i = 0; i < 3; i++) {
    printf("%s RXNE flag bit: %d\n", uart_ports[i], uart_rxne_flags[[2]]);
}
Drag options to blanks, or click blank then click option'
A5, 5, 5
B6, 7, 8
C5, 6, 7
Di
Attempts:
3 left
💡 Hint
Common Mistakes
Using different bit numbers for UART ports.
Not using the loop index to access the array.
5fill in blank
hard

Fill all three blanks to receive a byte only if RXNE flag is set, else set data to 0.

Embedded C
uint8_t data = (UART_SR & (1 << [1])) ? UART_[2] : [3];
Drag options to blanks, or click blank then click option'
ARXNE_FLAG
BDR
C0
DTXE_FLAG
Attempts:
3 left
💡 Hint
Common Mistakes
Using TXE_FLAG instead of RXNE_FLAG.
Setting data to UART_DR unconditionally.

Practice

(1/5)
1. What does receiving a byte over UART typically involve in embedded C programming?
easy
A. Reading one character sent from another device
B. Sending multiple bytes to another device
C. Configuring the UART baud rate only
D. Resetting the microcontroller

Solution

  1. Step 1: Understand UART communication basics

    UART communication involves sending and receiving data one byte at a time between devices.
  2. Step 2: Identify receiving action

    Receiving a byte means reading one character sent from another device, not sending or configuring settings.
  3. Final Answer:

    Reading one character sent from another device -> Option A
  4. Quick Check:

    Receiving byte = Reading one character [OK]
Hint: Receiving means reading data sent from another device [OK]
Common Mistakes:
  • Confusing receiving with sending data
  • Thinking configuration is receiving
  • Assuming multiple bytes are received at once
2. Which of the following is the correct way to check if a byte is ready to be read from UART in embedded C?
easy
A. UART_DATA = UART_STATUS & RX_READY;
B. if (UART_DATA == RX_READY) { byte = UART_STATUS; }
C. if (UART_STATUS & RX_READY) { byte = UART_DATA; }
D. while (UART_DATA != RX_READY) { }

Solution

  1. Step 1: Understand UART status checking

    To check if data is ready, we test a status register bit (e.g., RX_READY) using bitwise AND.
  2. Step 2: Correct syntax for reading byte

    If data is ready, read the byte from the data register. if (UART_STATUS & RX_READY) { byte = UART_DATA; } correctly does this.
  3. Final Answer:

    if (UART_STATUS & RX_READY) { byte = UART_DATA; } -> Option C
  4. Quick Check:

    Status & RX_READY then read data [OK]
Hint: Check status with bitwise AND before reading data [OK]
Common Mistakes:
  • Comparing data register to status bits
  • Assigning instead of checking bits
  • Using wrong registers for status or data
3. What will be the output of this code snippet if UART_DATA contains 0x41 ('A') and UART_STATUS has RX_READY set?
char received_byte;
if (UART_STATUS & RX_READY) {
    received_byte = UART_DATA;
}
printf("%c", received_byte);
medium
A. Error
B. A
C. 0
D. No output

Solution

  1. Step 1: Check condition for data ready

    UART_STATUS & RX_READY is true, so the if block executes.
  2. Step 2: Assign and print received byte

    received_byte is assigned UART_DATA value 0x41, which is ASCII 'A'. printf prints 'A'.
  3. Final Answer:

    A -> Option B
  4. Quick Check:

    UART_DATA 0x41 = 'A' printed [OK]
Hint: If RX_READY set, read UART_DATA and print it [OK]
Common Mistakes:
  • Assuming no output if condition true
  • Confusing hex 0x41 with zero
  • Expecting error without syntax issues
4. Identify the error in this UART receive code snippet:
char byte;
if (UART_STATUS & RX_READY);
{
    byte = UART_DATA;
}
medium
A. Semicolon after if condition causes unconditional block execution
B. UART_DATA should be UART_STATUS
C. Missing initialization of byte variable
D. RX_READY should be checked with equality operator

Solution

  1. Step 1: Analyze if statement syntax

    The semicolon after if condition ends the if statement prematurely.
  2. Step 2: Effect of semicolon on code block

    The block following runs always, ignoring the if condition, causing logic error.
  3. Final Answer:

    Semicolon after if condition causes unconditional block execution -> Option A
  4. Quick Check:

    Semicolon after if = unconditional block [OK]
Hint: No semicolon immediately after if(condition) [OK]
Common Mistakes:
  • Ignoring semicolon after if
  • Confusing data and status registers
  • Thinking variable must be initialized before if
5. You want to receive a byte over UART without blocking your program if no data is available. Which approach is best in embedded C?
hard
A. Reset UART peripheral before every read
B. Use a blocking read function that waits until data arrives
C. Read UART_DATA directly without checking status
D. Check UART status register for RX_READY before reading data

Solution

  1. Step 1: Understand non-blocking UART receive

    Non-blocking means program continues if no data; so check status first.
  2. Step 2: Choose correct method

    Checking RX_READY bit before reading ensures data is available and avoids waiting.
  3. Final Answer:

    Check UART status register for RX_READY before reading data -> Option D
  4. Quick Check:

    Check status before read to avoid blocking [OK]
Hint: Always check RX_READY before reading UART_DATA [OK]
Common Mistakes:
  • Using blocking read causing program to wait
  • Reading data without checking status
  • Resetting UART unnecessarily
Recommended

Ready to prove it?

Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

10 questions~5 mineasy hard