Методы чтения данных UART на PIC16F877A с помощью MPLAB XC8

“mplab xc8 uart read pic16f877a” — запрос, связанный с чтением данных UART (универсального асинхронного приемника-передатчика) на микроконтроллере PIC16F877A с помощью компилятора MPLAB XC8. Вот несколько методов с примерами кода:

Метод 1: Метод опроса

#include <xc.h>
void UART_Init() {
    // Configure UART settings
    // ...
}
char UART_Read() {
    while (!PIR1bits.RCIF);  // Wait for data to be received
    return RCREG;            // Return received data
}
void main() {
    UART_Init();

    while (1) {
        char data = UART_Read();  // Read UART data
        // Process the received data
        // ...
    }
}

Метод 2: Метод прерывания

#include <xc.h>
void UART_Init() {
    // Configure UART settings
    // ...

    // Enable UART receive interrupt
    PIE1bits.RCIE = 1;     // Enable UART receive interrupt
    INTCONbits.PEIE = 1;   // Enable peripheral interrupts
    INTCONbits.GIE = 1;    // Enable global interrupts
}
void interrupt ISR() {
    if (PIR1bits.RCIF) {
        char data = RCREG;  // Read received data
        // Process the received data
        // ...
    }
}
void main() {
    UART_Init();

    while (1) {
        // Main program logic
        // ...
    }
}

Метод 3: метод кольцевого буфера

#include <xc.h>
#define UART_BUFFER_SIZE 64
// Circular buffer implementation
char uartBuffer[UART_BUFFER_SIZE];
int uartBufferHead = 0;
int uartBufferTail = 0;
void UART_Init() {
    // Configure UART settings
    // ...

    // Enable UART receive interrupt
    PIE1bits.RCIE = 1;     // Enable UART receive interrupt
    INTCONbits.PEIE = 1;   // Enable peripheral interrupts
    INTCONbits.GIE = 1;    // Enable global interrupts
}
void UART_Enqueue(char data) {
    int next = (uartBufferHead + 1) % UART_BUFFER_SIZE;
    if (next != uartBufferTail) {
        uartBuffer[uartBufferHead] = data;
        uartBufferHead = next;
    }
}
char UART_Dequeue() {
    char data = uartBuffer[uartBufferTail];
    uartBufferTail = (uartBufferTail + 1) % UART_BUFFER_SIZE;
    return data;
}
void interrupt ISR() {
    if (PIR1bits.RCIF) {
        char data = RCREG;  // Read received data
        UART_Enqueue(data); // Enqueue data in the buffer
    }
}
void main() {
    UART_Init();

    while (1) {
        if (uartBufferHead != uartBufferTail) {
            char data = UART_Dequeue();  // Dequeue data from the buffer
            // Process the received data
            // ...
        }
// Main program logic
        // ...
    }
}