We send data one byte at a time using UART to communicate between devices like microcontrollers and computers.
Transmitting a byte over UART in Embedded C
void UART_Transmit(unsigned char data) {
while (!(UART_STATUS_REGISTER & TRANSMIT_READY_FLAG)) {
// wait until UART is ready to send
}
UART_DATA_REGISTER = data;
}The function waits until the UART hardware is ready before sending the byte.
Replace UART_STATUS_REGISTER, TRANSMIT_READY_FLAG, and UART_DATA_REGISTER with your device's specific register names.
UART_Transmit('A');unsigned char value = 0x55;
UART_Transmit(value);This program simulates sending two characters 'H' and 'i' over UART. It waits for UART to be ready before sending each byte.
#include <stdint.h> #include <stdbool.h> // Mock UART registers for example volatile uint8_t UART_STATUS_REGISTER = 0x02; // Bit 1 means ready volatile uint8_t UART_DATA_REGISTER = 0; #define TRANSMIT_READY_FLAG 0x02 void UART_Transmit(uint8_t data) { while (!(UART_STATUS_REGISTER & TRANSMIT_READY_FLAG)) { // wait until UART is ready } UART_DATA_REGISTER = data; // Simulate UART busy after sending UART_STATUS_REGISTER &= ~TRANSMIT_READY_FLAG; } int main() { // Simulate UART ready UART_STATUS_REGISTER = TRANSMIT_READY_FLAG; UART_Transmit('H'); UART_STATUS_REGISTER = TRANSMIT_READY_FLAG; // Ready again UART_Transmit('i'); // For demonstration, print what was sent // In real embedded, you can't print like this // Here we just show the last byte sent return UART_DATA_REGISTER; }
UART transmission is usually slow compared to CPU speed, so waiting for ready is important.
Registers and flags differ by microcontroller, always check your device datasheet.
In real embedded systems, you often use interrupts or DMA for efficient UART transmission.
UART sends data one byte at a time using hardware registers.
Always wait until UART is ready before sending a byte.
Use your microcontroller's datasheet to find correct register names and flags.
Practice
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 DQuick Check:
Wait for buffer empty = prevent data loss [OK]
- Ignoring the transmit buffer status
- Confusing transmit and receive buffers
- Trying to send bytes too fast
data using a register UART_STATUS with bit 5 as TX_READY flag?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 AQuick Check:
Wait until TX_READY set, then send [OK]
- Using if instead of while to wait
- Sending data before waiting
- Checking wrong bit or wrong condition
UART_STATUS initially has bit 5 cleared and then set after some time?while (!(UART_STATUS & (1 << 5))) {
// wait
}
UART_DATA = 0xAB;Solution
Step 1: Analyze the while loop condition
The loop waits while bit 5 of UART_STATUS is 0 (not ready). Initially bit 5 is cleared, so it waits.Step 2: Consider bit 5 changing to set
When bit 5 becomes set, the condition becomes false, loop exits, and UART_DATA is assigned 0xAB.Final Answer:
The byte 0xAB is sent after waiting for TX_READY -> Option BQuick Check:
Wait loop exits when ready, then send byte [OK]
- Assuming immediate send without waiting
- Thinking loop never ends
- Confusing bit set/clear logic
UART_DATA = data;
while (!(UART_STATUS & (1 << 5))) {
// wait
}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 CQuick Check:
Send only after waiting for TX_READY [OK]
- Writing data before waiting
- Checking wrong status bit
- Missing wait loop entirely
data[5] = {0x10, 0x20, 0x30, 0x40, 0x50} over UART. Which code snippet correctly transmits all bytes ensuring no data loss?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 AQuick Check:
Wait before each send to avoid data loss [OK]
- Sending bytes without waiting
- Waiting after sending bytes
- Ignoring transmit buffer status
Ready to prove it?
Pass the test and this pattern moves unknown
