📖 Scenario: You are working on a small embedded system that communicates with other devices using UART (Universal Asynchronous Receiver/Transmitter). Your task is to send a single byte of data over UART.
🎯 Goal: Build a simple program that sets up a byte variable and sends it over UART using a function call.
📋 What You'll Learn
Create a variable to hold the byte to send
Create a variable for the UART port number
Call the UART transmit function with the correct parameters
Print a confirmation message after transmission
💡 Why This Matters
🌍 Real World
Embedded systems often communicate with sensors, displays, or other devices using UART. Sending bytes correctly is essential for data exchange.
💼 Career
Understanding UART communication is important for embedded software engineers working on hardware interfaces and device drivers.
Progress0 / 4 steps
1
Create the byte data to send
Create a variable called data_byte of type unsigned char and set it to 0xAB.
Embedded C
Hint
Use unsigned char to hold one byte and assign it the hexadecimal value 0xAB.
2
Set the UART port number
Create an int variable called uart_port and set it to 1.
Embedded C
Hint
Use an integer variable to represent the UART port number.
3
Transmit the byte over UART
Call the function uart_transmit with arguments uart_port and data_byte to send the byte.
Embedded C
Hint
Use the function uart_transmit with the UART port and data byte as parameters.
4
Print confirmation message
Write a printf statement to print "Byte 0xAB sent on UART port 1\n".
Embedded C
Hint
Use printf to show the message exactly as given.
Practice
(1/5)
1. What is the main purpose of waiting for the UART transmit buffer to be empty before sending a byte?
easy
A. To change the baud rate
B. To reset the UART hardware
C. To clear the receive buffer
D. To ensure the previous byte has been sent and avoid data loss
Solution
Step 1: Understand UART transmit buffer role
The UART transmit buffer holds the byte to be sent. It must be empty before loading a new byte.
Step 2: Reason why waiting is necessary
If you send a byte before the buffer is empty, the previous byte might be overwritten, causing data loss.
Final Answer:
To ensure the previous byte has been sent and avoid data loss -> Option D
Quick Check:
Wait for buffer empty = prevent data loss [OK]
Hint: Always wait for transmit buffer empty before sending [OK]
Common Mistakes:
Ignoring the transmit buffer status
Confusing transmit and receive buffers
Trying to send bytes too fast
2. Which of the following code snippets correctly waits for the UART transmit buffer to be ready before sending a byte data using a register UART_STATUS with bit 5 as TX_READY flag?
easy
A. while (!(UART_STATUS & (1 << 5))); UART_DATA = data;
B. if (UART_STATUS & (1 << 5)) UART_DATA = data;
C. UART_DATA = data; while (!(UART_STATUS & (1 << 5)));
D. while (UART_STATUS & (1 << 5)) UART_DATA = data;
Solution
Step 1: Understand the TX_READY flag meaning
Bit 5 set means transmit buffer is ready (empty), so wait until it is set.
Step 2: Analyze each code snippet
while (!(UART_STATUS & (1 << 5))); UART_DATA = data; waits in a loop until bit 5 is set, then sends data. This is correct. if (UART_STATUS & (1 << 5)) UART_DATA = data; sends data only if ready once, no wait. UART_DATA = data; while (!(UART_STATUS & (1 << 5))); sends data before waiting, risking overwrite. while (UART_STATUS & (1 << 5)) UART_DATA = data; loops while bit 5 is set, which is opposite logic.
Final Answer:
while (!(UART_STATUS & (1 << 5))); UART_DATA = data; -> Option A
Quick Check:
Wait until TX_READY set, then send [OK]
Hint: Use while loop to wait for TX_READY bit set [OK]
Common Mistakes:
Using if instead of while to wait
Sending data before waiting
Checking wrong bit or wrong condition
3. Given the following code snippet, what will be the output if UART_STATUS initially has bit 5 cleared and then set after some time?
B. The while loop condition is incorrect, should check bit 4 instead
C. The data is sent before checking if UART is ready, risking overwrite
D. The code correctly waits before sending data
Solution
Step 1: Check order of operations
The code writes data to UART_DATA before waiting for TX_READY flag.
Step 2: Understand risk of overwriting
If UART is not ready, writing data first can overwrite previous byte, causing data loss.
Final Answer:
The data is sent before checking if UART is ready, risking overwrite -> Option C
Quick Check:
Send only after waiting for TX_READY [OK]
Hint: Always wait before writing UART_DATA [OK]
Common Mistakes:
Writing data before waiting
Checking wrong status bit
Missing wait loop entirely
5. You want to send an array of bytes data[5] = {0x10, 0x20, 0x30, 0x40, 0x50} over UART. Which code snippet correctly transmits all bytes ensuring no data loss?
hard
A. for (int i = 0; i < 5; i++) { while (!(UART_STATUS & (1 << 5))); UART_DATA = data[i]; }
B. for (int i = 0; i < 5; i++) { UART_DATA = data[i]; while (!(UART_STATUS & (1 << 5))); }
C. int i = 0; while (i < 5) { UART_DATA = data[i]; i++; }
D. for (int i = 0; i < 5; i++) { UART_DATA = data[i]; }
Solution
Step 1: Understand the need to wait before sending each byte
Each byte must be sent only after UART transmit buffer is ready to avoid overwriting.
Step 2: Analyze each option
for (int i = 0; i < 5; i++) { while (!(UART_STATUS & (1 << 5))); UART_DATA = data[i]; } waits before sending each byte, ensuring safe transmission. for (int i = 0; i < 5; i++) { UART_DATA = data[i]; while (!(UART_STATUS & (1 << 5))); } sends byte first then waits, risking overwrite. int i = 0; while (i < 5) { UART_DATA = data[i]; i++; } sends bytes without waiting. for (int i = 0; i < 5; i++) { UART_DATA = data[i]; } sends all bytes without any wait, causing data loss.
Final Answer:
for (int i = 0; i < 5; i++) { while (!(UART_STATUS & (1 << 5))); UART_DATA = data[i]; } -> Option A
Quick Check:
Wait before each send to avoid data loss [OK]
Hint: Wait before sending each byte in loop [OK]
Common Mistakes:
Sending bytes without waiting
Waiting after sending bytes
Ignoring transmit buffer status
Recommended
Ready to prove it?
Pass the test and this pattern moves unknownstrongwhile earning +1 Grip toward your certificate.