2014-11-03 100 views
2

我可以用下面的代码接收,但不幸的是,没有任何回应。我究竟做错了什么?UART没有响应

#include <pic18f25k80.h> 
#include "config.h" 
#include <usart.h> 

int i = 0; 
unsigned char MessageBuffer[200]; 

void main() { 
    OSCCONbits.IRCF = 0b110; // 8MHz 
    TRISB6 = 0;     // TX set as output 
    TRISB7 = 0;     // RX set as output 

    // Clear TX interrupt 
    // Set RX interrupt 
    // 8-bit Asynch. mode 
    // BRGH = 1 = high baud mode 
    // 51 = ((8MHz/baud)/16)-1 with baud = 9600 

    Open2USART(USART_TX_INT_OFF & USART_RX_INT_ON & USART_ASYNCH_MODE 
      & USART_EIGHT_BIT & USART_BRGH_HIGH, 51); 

    RC2IF = 0;     // reset RX2 flag 
    RC2IP = 0;     // not high priority 
    RC2IE = 1;     // Eneble RX2 interrupt 
    INTCONbits.PEIE = 1;  // enable peripheral interrupts 
    INTCONbits.GIE = 1;   // enable interrupts 
    RCSTA2bits.SPEN = 1;  // enable USART 

    while(1){ 
    } 
} 

void interrupt ISR() { 
    if(PIR3bits.RC2IF == 1) { 
     if(i<200) {    // buffer size 
      MessageBuffer[i] = Read2USART();  // read byte from RX reg 
      if (MessageBuffer[i] == 0x0D) {   // check for return key 
       puts2USART(MessageBuffer); 
       for(;i>0;i--) 
        MessageBuffer[i] = 0x00;  // clear array 
       i=0; 
       return; 
      } 
      i++; 
      RC2IF = 0;        // clear RX flag 
     } else { 
      puts2USART(MessageBuffer); 
      for(;i>0;i--) 
       MessageBuffer[i] = 0x00;   // clear array 
      i = 0; 
      return; 
     } 
    } 
} 

我发送0x41十六进制代码,我检查了范围,看看是否正在接收。根据我的代码,接收到的数据应该被回送。当我检查TX引脚时,什么都没有发生。

+0

尝试了'printf()'来查看代码的哪些部分运行? – 2014-11-03 13:19:15

+1

您可能想要将RX引脚设置为输入 – rm5248 2014-11-03 13:31:45

+0

将RX引脚设置为输入或不是由它决定,它不是由端口外设声明,而是由UART本身声明。 它看起来像'puts2USART'是不正确的数据传输功能。我试过'TXREG2 = RCREG2;'。所以接收到的所有内容都发送到Transmit寄存器,并且工作。但仍然在寻找一个功能,可以做'发送':'文本''' – 2014-11-03 13:58:13

回答

0

将USART_CONT_RX添加到Open2USART以启用连续接收。

另外,最好在中断服务程序中进行必要的最小操作。考虑类似于:

void interrupt ISR() { 
    char data; 

    if(PIR3bits.RC2IF == 1) { 
    data = Read2USART();  // always read byte from RX reg (clears RC2IF) 
    if(i<200) {     // buffer size 
     MessageBuffer[i] = data; // read byte from RX reg 
     i++; 
    } 
    else{ 
     // flag buffer full error 
    } 
    } 
} 

并在while(1)循环中执行其余的操作。