我正在使用 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' - '-'