2012-04-20 78 views
1

我發送這樣的字符串正確接收的字符串: $ 13 -14,283,4,-4,17,6,-240,-180#如何從UART

但並不是因爲顯示出來緩衝區是'超載',我怎樣才能接收整個字符串,或者如何在每次讀取字節後清除它?

// get a character string 
char *getsU2(char *s, int len) { 
    char *p = s; // copy the buffer pointer 
    do { 
     *s = getU2(); // get a new character 
     if ((*s=='\r') || (*s=='\n')) // end of line... 
      break; // end the loop s++; 

     // increment the buffer pointer 
     len--; 
    } while (len>1); // until buffer is full 

    *s = '\0'; // null terminate the string 

    return p; // return buffer pointer 
} 


// get a character string 
char *getsU2(char *s, int len) { 
    char *p = s; // copy the buffer pointer 
    do { 
     *s = getU2(); // get a new character 

     if ((*s=='\r') || (*s=='\n')) // end of line... 
      break; // end the loop 

     s++;  

     // increment the buffer pointer 
     len--; 
    } while (len>1); // until buffer is full 

    *s = '\0'; // null terminate the string  

    return p; // return buffer pointer 
} 



char getU2(void) { 
if(U2STAbits.OERR == 1) 
{  U2STAbits.OERR = 0; } 
while (!U2STAbits.URXDA); // wait for new character to arrive return U2RXREG; 
          // read character from the receive buffer } 

getsU2(buffer,sizeof(buffer)); 
+3

請熟悉縮進(爲您進行編輯),選擇自己良好的編碼風格。 – 2012-04-20 12:28:38

+0

這是用於微控制器嗎?你什麼時候得到關於「緩衝區過載」的錯誤? – 2012-04-20 13:21:40

+0

它看起來像getU2代碼片段可能不完整。我點沒有看到一個返回聲明。什麼是「緩衝區」變量的聲明? – user957902 2012-04-20 15:28:45

回答

3

嘗試使用UART接收中斷。下面的代碼是針對PIC24H的;適當修改。

在您的初始化函數:

IFS0bits.U1RXIF = 0;  // clear rx interrupt flag 
IFS0bits.U1TXIF = 0;  // clear tx interrupt flag 

IEC0bits.U1RXIE = 1;  // enable Rx interrupts 
IPC2bits.U1RXIP = 1; 
IEC0bits.U1TXIE = 1;  // enable tx interrupts 
IPC3bits.U1TXIP = 1; 

創建中斷處理程序會將字節到緩衝區或隊列:

void __attribute__((__interrupt__, auto_psv)) _U1RXInterrupt(void) 
{ 
    char bReceived; 

    // Receive Data Ready 
    // there is a 4 byte hardware Rx fifo, so we must be sure to get all read bytes  
    while (U1STAbits.URXDA) 
    { 
     bReceived = U1RXREG; 

     // only usethe data if there was no error 
     if ((U1STAbits.PERR == 0) && (U1STAbits.FERR == 0)) 
     { 
      // Put your data into a queue 
      FIFOPut(bReceived); 

     } 

    }  

    IFS0bits.U1RXIF = 0;  // clear rx interrupt flag 
} 

您的隊列代碼是沿着這些線路:

#define FIFO_SIZE 64 

char pbBuffer[FIFO_SIZE]; 
char *pbPut; 
char *pbGet; 

void FIFOInit(void) 
{ 
    pbPut = pbBuffer; 
    pbGet = pbBuffer; 
} 

void FIFOPut(char bInput) 
{ 
    *pbPut = bInput; 
    pbPut++; 

    if (pbPut >= (pbBuffer + FIFO_SIZE)) 
     pbPut = pbBuffer; 
} 

char FIFOGet(void) 
{ 
    char bReturn; 

    bReturn = *pbGet; 
    pbGet++; 

    if (pbGet>= (pbBuffer + FIFO_SIZE)) 
     pbGet= pbBuffer; 
} 

顯然,應該加強FIFO函數以防止溢出,在空q上返回錯誤ueue等

+3

另外,您應該在中斷和普通代碼之間共享的任何變量上添加volatile關鍵字。 (這裏不是一個問題,因爲變量pbBuffer從不編輯,但一般來說) – 2012-05-03 04:25:17

+0

@Nathan:優點。 – 2012-05-03 15:40:42