2012-04-20 2 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

들여 쓰기 (당신을 위해 편집 됨)에 익숙해지고 좋은 코딩 스타일을 선택하십시오. –

+0

마이크로 컨트롤러 용입니까? 언제 "버퍼 오버로딩"에 대한 오류가 발생합니까? –

+0

getU2 코드 조각이 불완전한 것처럼 보입니다. 나는 return 문을 보지 않는다. "buffer"변수의 선언은 무엇입니까? – user957902

답변

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; 

은 버퍼 나 큐에 바이트를 배치 인터럽트 핸들러 만들기 : 당신의 init 함수에서

#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; 
} 
:

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 
} 

귀하의 큐 코드는이 라인을 따라입니다

명백히 오버 플로우를 방지하기 위해 FIFO 기능을 강화해야하며 빈 q ueue 등

+3

또한 인터럽트와 일반 코드간에 공유되는 변수에 volatile 키워드를 추가해야합니다. (변수 pbBuffer가 결코 편집되지 않기 때문에 여기서는 문제가되지 않지만, 일반적으로 말하면) –

+0

@Nathan : 뛰어난 점. –