UART没有回应

时间:2014-11-03 13:15:59

标签: c microcontroller pic 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引脚时,什么也没发生。

1 个答案:

答案 0 :(得分: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)循环中完成剩下的工作。