我为一块内置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;
}
答案 0 :(得分:1)
函数UARTbusy
应该等待状态,或者它的调用者应该是。但是发送寄存器状态被读取一次并被忽略。
传输数据通常有两级缓冲区。写入接口寄存器的值将保持不变,直到移位寄存器为空,并且器件在此之前保持“忙”状态。
当您写入第一个数据时,它会立即传输到移位寄存器,因此立即写入第二个数据是无害的。但是,然后继续覆盖输出寄存器的内容,直到它保存消息的最后一个字符。然后,当移位寄存器变空时,将发送消息的最后一个字符。
请记住,移位寄存器正在以相对较慢的速度移出位 - 以波特率。这就是需要检查状态位的原因。