Giải thuật Ring_Buffer ( Circular Buffer ) cho UART

tienchuan

Trứng gà
Chào mọi người.
Mình đang làm phần UART trong modun USCI của MSP430FG4618 liên quan đến giải thuật Ring_buffer.
Mình search trên mạng nhưng họ nói chung chung quá, chưa so sánh được so với kiểu bình thường và đưa ra được giải thuật để code tiếp ( hay tại cùi mía quá cũng có :D)
Hiện tại minh đã làm xong các hàm gởi, nhận kí tự, gởi chuỗi, nhưng yêu cầu thêm trong bài tập của mình là phải áp dụng giải thuật ring_buffer để xử lý.
Vậy ACE nào có biết hay làm qua cái này rồi thì chỉ cho minh vs ( thuật toán thôi cũng đc :D)
Thnks ACE 4rum :)
 

tungbk

Cố Vấn CLB
Staff member
Bạn tham khảo code này thử hiểu về Buffer vòng không nhe.

Code:
typedef enum
{
    FALSE = 0,
    TRUE = 1
}BOOL;
 
#define BUFFER_SIZE    100
unsigned char Buffer[BUFFER_SIZE];
unsigned char WriteIndex = 0;
unsigned char ReadIndex = 0;
 
/*--------------------------------------------------
* Ghi mot chuoi "pChar" co do dai "len" vao buffer
---------------------------------------------------*/
void BufferWrite(unsigned char * pChar, unsigned char len)
{
    /*
    * WriteIndex tang tu 0-->BUFFER_SIZE-->0-->BUFFER_SIZE
    * va chi dung lai khi bang ReadIndex
    * Do do duoc goi la buffer vong
    */
    int i;
    for (i = 0; i < len; i++)
    {
        if (IsBufferFull() == TRUE)
        {
            break;
        }
        Buffer[WriteIndex] = pChar[i];
        WriteIndex = (WriteIndex + 1) % BUFFER_SIZE;
    }
}
 
/* -----------------------------------------------------
* Doc toan bo data hien co trong buffer ra chuoi "pChar"
* va tra lai do dai chuoi nay vao bien "len"
------------------------------------------------------*/
void BufferRead(unsigned char * pChar, unsigned char * pLen)
{
    /*
    * Khi lay data trong buffer thi co the lay tuy y
    * O day vi du la moi lan doc se doc het toan bo data co trong buffer
    * ReadIndex cung di tu 0-->BUFFER_SIZE-->0-->BUFFER_SIZE
    * va chi dung lai khi bang WriteIndex
    */
    while( IsBufferEmpty() == FALSE)
    {
        *pChar = Buffer[ReadIndex];
        pChar++;
        ReadIndex = (ReadIndex + 1) % BUFFER_SIZE;
        (*pLen) = (*pLen) + 1;
    }
}
 
/*-----------------------------------------------
* Kiem tra buffer co full data hay khong
* Tra ve TRUE neu da full khong ghi them duoc nua
-----------------------------------------------*/
BOOL IsBufferFull()
{
    if( (WriteIndex + 1) % BUFFER_SIZE) == ReadIndex)
    {
        return TRUE;
    }
    else
    {
        return FALSE;
    }
}
 
/*-----------------------------------
* Kiem tra buffer co trong hay khong
* Tra ve TRUE neu khong con data
-------------------------------------*/
BOOL IsBufferEmpty(void)
{
    if (WriteIndex == ReadIndex)
    {
        return TRUE;
    }
    else
    {
        return FALSE;
    }
}
 
Top