2016-06-17 9 views
3

Ich programmiere ein paar Bibliotheken für ein Board mit einem integrierten PIC18F25K80. Im Moment versuche ich, die UART-Bibliothek zu programmieren, und ich habe alles versucht, aber ich kann es nicht funktionieren lassen, wenn es darum geht, eine Reihe von Zeichen zu senden.PIC18F25K80 Senden von String durch USART funktioniert nicht

Ich verwende den XC8 Compiler und ich habe den folgenden Code in der Bibliothek. (Ich habe nicht die Unterbrechungen noch programmiert, das ist, warum Sie nicht alles im Zusammenhang mit, dass im Code sehen

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

void UARTsendTEXT(unsigned char *text){ 

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

char UARTbusy(){ 
return TXSTA1bits.TRMT; 
} 

und dieser Code in der Hauptdatei:

int main() { 

    UARTconfig(_BR_19200, _RxINT_OFF, _TxINT_OFF, _8BIT); 

    unsigned char data[20] = "ABCDEFGHIJ"; 

    while(1){ 

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

    return 0; 
} 

Also, wenn ich getroffen ‚a‘, soll die Zeichenfolge, sondern sieht die Zeichenfolge gesendet werden, erhalte ich den ersten und letzten Brief, und manchmal einfach der erste Buchstabe

Ehrlich gesagt glaube ich, dass es ein wirklich grundlegendes Problem mit dem Code ist, aber ich habe alles versucht, woran ich denken konnte, und nichts hat funktioniert, vielleicht kann mir jemand hier helfen.

EDIT: für den Fall, müssen Sie es überprüfen:

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

Ich habe eine Bearbeitung eingereicht, die die Einrückung behebt und das C-Tag hinzufügt, was meiner Meinung nach sehr wichtig ist, um die Sichtbarkeit Ihrer Frage zu erhöhen. Leider sind nur 5 Tags erlaubt, also musste ich eins opfern. Ich wählte "Usart". Fühlen Sie sich frei, meine Änderung rückgängig zu machen, wenn Sie eine andere bevorzugen. –

+0

Müssen Sie sehen 'UARTbusy();' –

+0

Sorry, vergessen, UARTbusy(); char UARTbusy() { Rücksendung TXSTA1bits.TRMT; } –

Antwort

1

Die Funktion UARTbusy sollte Status warten, oder sollte seine Anrufer sein. Der Status des Übertragungsregisters wird jedoch einmal gelesen und ignoriert.

Es gibt normalerweise einen zweistufigen Puffer für übertragene Daten. Werte, die in das Schnittstellenregister geschrieben werden, werden gehalten, bis das Schieberegister leer ist, und das Gerät bleibt bis dahin "beschäftigt".

Wenn Sie die ersten Daten schreiben, wird es sofort in das Schieberegister übertragen, so dass das Schreiben der zweiten Daten sofort harmlos ist. Aber Sie überschreiben dann den Inhalt des Ausgaberegisters, bis es das letzte Zeichen Ihrer Nachricht enthält. Wenn das Schieberegister leer wird, wird das letzte Zeichen Ihrer Nachricht gesendet.

Denken Sie daran, dass das Schieberegister Bits relativ langsam verschiebt - bei der Baudrate. Deshalb muss das Status-Bit überprüft werden.