0

我正在使用 MPLAB XC8 并尝试使用 USART 模块。但我有异常问题。这是我的代码,我在此之后解释。

#include <xc.h>
#include "conbits.h"

#include <stdbool.h>
#include <stdint.h>
#include <string.h>
#include <stdio.h>

#define _XTAL_FREQ 8000000


void UART_RX_INIT(void);
void UART_TX(uint8_t *s);
void usart_send_str(uint8_t s[]);

uint8_t rx_buffer[];
uint8_t UART_Buffer = 0;
int rx_index=0;
bool rx_reg_ok = false;
uint8_t data;


void main(void) {

    OSCCONbits.IRCF = 0X07;
    OSCCONbits.SCS = 0X03;

    while(OSCCONbits.HFIOFS !=1);

    RCONbits.IPEN = 1;
    ei();

    UART_RX_INIT();

    TRISD = 0X00;
    LATD = 0X00;

    while(1)
    {
        
    }

  
}

void UART_RX_INIT(){
    TRISCbits.TRISC7 = 1;
    TRISCbits.TRISC6 = 0;
    
    SPBRG = 51;
    
    RCSTAbits.CREN = 1;
    RCSTAbits.SPEN = 1;
    BAUDCON1bits.BRG16 = 0;
    
    TXSTA1bits.SYNC = 0;
    TXSTA1bits.BRGH = 1;
    TXSTAbits.TXEN = 1;
    
    IPR1bits.RCIP = 1;
    PIE1bits.RCIE = 1;
    
    IPR1bits.TXIP = 0;
    PIE1bits.TXIE = 1;
}


void __interrupt(high_priority) ISR(void){
    if(PIR1bits.RC1IF==1){
        UART_Buffer = RCREG1;
     
        if(UART_Buffer == 36 && rx_index==0)
        {
            memset(rx_buffer, 0, strlen(rx_buffer));
            rx_buffer[0] = UART_Buffer;
            rx_index++;
            rx_reg_ok=true;
        }
        else if(rx_reg_ok && UART_Buffer != 36)
        {
            rx_buffer[rx_index] = UART_Buffer;
            usart_send_str(rx_buffer);
            usart_send_str("\r\n");
            rx_index++;
        }
        else
        {
            usart_send_str("\r\nNot Registered\r\n");
        }
        if(UART_Buffer == 45)
        {
            usart_send_str("\r\n-----");
            usart_send_str(rx_buffer);
            usart_send_str("-----\r\n");
        }
        
        
        PIR1bits.RC1IF = 0;
        
    }
}

void __interrupt(low_priority) low_isr(void){
    INTCONbits.GIEH = 0;
    if(PIR1bits.TXIF){
        PIR1bits.TXIF=0;
    }
    INTCONbits.GIEH = 1;
}

///////////////////////////TRANSMIT
void UART_TX(uint8_t *s){
    TXREG = *s;
    while(TXSTA1bits.TRMT==0);
    
}
void usart_send_str(uint8_t s[]){

    int i=0;
    while(s[i]!='\0')
    {
        UART_TX(&s[i]);
        i++;
    }
}

首先关注高中断功能块内部,除非我按“$”字符发送。PIC18 响应只是“未注册”。在我按下 '$' 字符后,它会将下一个按下的字符添加到 rx_buffer 数组中。

我的问题就从那里开始。我按顺序按“1”、“2”的字符,他们向我发送“未注册”,我按“$”,他们开始添加到 rx_buffer 数组并显示给我。也用于检查缓冲区。如果我发送“-”字符,它会显示 rx_buffer。但是如果你看图片你可以看到。我按“$”第二个字符后的问题总是小数点后 2 位。我按'a'但它注册为'c'来缓冲。如果我在'$'之后按'1',它会注册'3'这个问题只会在'$'之后发生。我怎样才能解决这个问题?这是我的模拟输出。我按'1' - '2' - '$' - 'a' - 'b' - 'c' - '-'

我按'1' - '2' - '$' - 'a' - 'b' - 'c' - '-'

我按'1' - '2' - '$' - '1' - '2' - '3' - '-'

4

0 回答 0