PIC18F25K80通过USART发送字符串不起作用

时间:2016-06-17 09:43:10

标签: c string pic uart pic18

我为一块内置PIC18F25K80的电路板编写了几个库。现在我正在尝试对UART库进行编程,我已经尝试了所有的东西,但是当发送一串字符时我无法使其工作。

我使用的是XC8编译器,我在库中有以下代码:(我还没有对中断进行编程,这就是为什么你看不到任何相关内容的原因在代码中。

void UARTsend(char data){
    UARTbusy();
    TXREG1 = data;
}

void UARTsendTEXT(unsigned char *text){

    while(*text != '\0'){
        UARTsend(*(text++));
    }
}

char UARTbusy(){
return TXSTA1bits.TRMT;
}

这段代码在主文件中:

int main() {

    UARTconfig(_BR_19200, _RxINT_OFF, _TxINT_OFF, _8BIT);

    unsigned char data[20] = "ABCDEFGHIJ";

    while(1){

        if(UARTrxREAD() == 'a'){
            UARTsendTEXT(data);
        }
    }

    return 0;
}

所以,当我点击' a'时,应该发送字符串,但不是看到字符串,而是收到第一个和最后一个字母,有时只收到第一个字母。

老实说,我相信这是代码中一个非常基本的问题,但是我尝试了所有我能想到的东西,没有任何效果,所以也许有人可以帮助我。

编辑:以防你需要检查出来:

void UARTconfig(unsigned int BaudRate, unsigned int RxINT, unsigned int         TxINT, unsigned int BIT){

int br_data;

//Clock configuration at 16MHz
OSCCONbits.IRCF = 0b111;

//9-bit transmit enable bit.
if(BIT == 1) {
  RCSTA1bits.RX9 = 1; //Reception 9-bit.
  TXSTA1bits.TX9 = 1; //Transmission 9-bit.
}
else {
  RCSTA1bits.RX9 = 0; //Reception 8-bit. 
  TXSTA1bits.TX9 = 0; //Transmission 8-bit.
}


//Enable serial port.
RCSTA1bits.SPEN = 1;                       

//Enable continuous reception.
RCSTA1bits.CREN = 1;

//Setting asynchronous mode.
TXSTA1bits.SYNC = 0;

//Enable transmission
TXSTA1bits.TXEN = 1;                         

//Setting Rx/Tx pins as output.
TRISC7 = 0;                                  
TRISC6 = 0;    

//Baud rate configuration
BAUDCON1bits.BRG16 = 1;                       //16bit Baud Rate generator
TXSTA1bits.BRGH = 0;                          //Low speed BR.

switch(BaudRate){
    case 0:
        br_data=415;
        break;
    case 1:
        br_data=103;
        break;
    case 2:
        br_data=51;
        break;
    case 3:
        br_data=16;
        break;
    case 4:
        br_data=8;         
} 
SPBRGH1:SPBRG1 = br_data;

}

1 个答案:

答案 0 :(得分:1)

函数UARTbusy应该等待状态,或者它的调用者应该是。但是发送寄存器状态被读取一次并被忽略。

传输数据通常有两级缓冲区。写入接口寄存器的值将保持不变,直到移位寄存器为空,并且器件在此之前保持“忙”状态。

当您写入第一个数据时,它会立即传输到移位寄存器,因此立即写入第二个数据是无害的。但是,然后继续覆盖输出寄存器的内容,直到它保存消息的最后一个字符。然后,当移位寄存器变空时,将发送消息的最后一个字符。

请记住,移位寄存器正在以相对较慢的速度移出位 - 以波特率。这就是需要检查状态位的原因。