2015-05-01 81 views
1

我正在使用RN42-XV藍牙模塊從計算機向PIC24F發送字符。 模塊正確連接/配對,發送的字符也正確(用示波器)。UART緩衝區未在PIC24F上產生標誌

這是它是如何被初始化:

void initUART(){ 

    //Peripheral Pin Mapping 
    RPINR19bits.U2RXR = 5; //pin 14 UART Receive 
    RPOR5bits.RP11R = 3; //pin 17 UART Transmit 

    //Configuring the UART 
    U2BRG = BRGVAL; 
    U2MODEbits.UARTEN = 1; 
    U2MODEbits.UEN = 0; 
    U2MODEbits.PDSEL = 0;// 8 bit no parity 
    U2MODEbits.STSEL = 0; // 1 stop bit 
    U2STAbits.UTXEN = 0; 
    U2STAbits.URXISEL = 0; 

    //Putting the UART interrupt flag down. 
    IFS1bits.U2RXIF = 0; 
} 

我也是用這個函數來獲得緩衝區的內容:

int waitForChar(){ 
    int receivedChar; 
    // Use the UART RX interrupt flag to wait until we recieve a character. 
    while(IFS1bits.U2RXIF == 1){ 
     // Clear the UART RX interrupt flag to we can detect the reception 
     // of another character. 
     IFS1bits.U2RXIF = 0; 
     // U2RXREG stores the last character received by the UART. Read this 
     // value into a local variable before processing. 
     receivedChar = U2RXREG; 
    } 
return receivedChar; 
} 

的問題是,該計劃從未進入while函數在waitForChar()函數內循環,因爲UART中斷標誌永遠不會被硬件產生。 我已經嘗試過不同的PIC24F,但都遇到同樣的問題。

回答

0

UART的初始化代碼缺少這一行:

AD1PCFG = 0xFFFF 

的ADC旗UART具有優先權。這行禁用它們。

0

我注意到兩件事:

  1. 你完全配置之前啓用該模塊(UARTEN)。

  2. 不應該使用U2STA.URXDA作爲標誌來測試接收嗎?

  3. 您不必在兩個寄存器中配置幾個位。沒關係,但是如果你確定啓動狀態是你喜歡的。

1

函數類型聲明爲void,所以它不返回任何東西。如果您嘗試分配其返回值,您應該收到編譯器警告。而且它不會等待字符。它是「非阻塞」的,無論如何它都會返回,但是你需要一個返回值來告訴你它是否有char或者它是否有。如果你想讓它等待,並返回一個char,它可以像這樣

int waitForChar(){       // declare a return type 
    int receivedChar; 
    while(IFS1bits.U2RXIF == 0);    // wait 
    receivedChar = U2RXREG; 
    IFS1bits.U2RXIF = 0;      // clear status 
    return receivedChar; 
} 
+0

是的,這被改爲返回int。這並沒有幫助緩衝區讀取任何內容。 –