2016-04-08 14 views
1

Hallo Ich habe Code für UART-Code für PIC16F877A geschrieben. Der Code funktioniert nicht und die den Fehler wie Zeiger erforderlich bei MP LAB IDE.I zeigt möchten senden und die Zeichen an den PC Hyper terminal.any ein empfangen von Ihnen, mich hep die Probleme zu lösenpic16f877a uart eingebettet c code

#include<pic.h> 

void pic_init(void) 
{ 
    TRISC7=1; 
    TRISC6=0; 
} 

void uart_init(void) 
{ 
    TXSTA=0x20; 
    RCSTA=0x90; 
    SPBRG=15; 
} 

void tx(unsigned char byte) 
{ 
    int i; 
    TXREG=byte; 
    while(!TXIF); 
    for(i=0;i<400;i++); 
} 

void string_uart(char *q) 
{ 
    while(*q) 
    { 
     *(*q++); 
    } 
} 

unsigned char rx() 
{ 
    while(!RCIF); 
    return RCREG; 
} 

void main() 
{ 
    char *q; 
    pic_init(); 
    uart_init(); 
    tx('N'); 
    rx(); 
    string_uart("test program"); 
} 
+0

Werfen Sie einen Blick auf [diese Anleitung] (https://electrosome.com/uart-pic-microcontroller-mplab-xc8/). Zumindest müssen Sie die Baudrate einstellen, um das zu tun, was Sie tun möchten. Ein kleiner Tipp. Versuchen Sie, den TX- und RX-Pin zu kurzzuschließen und beginnen Sie, damit es funktioniert. Zum Anschluss an den PC benötigen Sie mindestens ein USB-zu-TTL-UART-Kabel (5V). – LPs

+1

Wenn Ihr Compiler eine Diagnosemeldung ausgibt, sollten Sie die genaue Nachricht in die Frage aufnehmen und genau angeben, auf welcher Zeile die Nachricht ausgegeben wurde. – Clifford

+0

@LPs: PCs mit älteren seriellen Ports sind weiterhin verfügbar. Allerdings wird dann ein 232-Linien-Treiber benötigt. Wenn auf seinem PC HyperTerminal standardmäßig installiert ist, muss es ziemlich alt sein und möglicherweise über 232 Ports verfügen. – Clifford

Antwort

3

Die Aussage innerhalb Ihre while Schleife macht keinen Sinn:

while(*q) { 
    *(*q++); 
} 

Diese im error: (981) pointer required Fehler führt Sie bekommen, da Sie einen nicht-Zeiger sind dereferencing: *q++ ein char zurückgibt, damit Sie dereferenzieren ein char mit dem äußeren versuchen *.

Stattdessen möchten Sie wahrscheinlich den Charakter, auf die der Zeiger momentan Punkte (*q), senden und dann den Zeiger erhöhen (q++):

while(*q) { 
    tx(*q); 
    q++; 
} 

Dies mag auch

geschrieben werden konnte
while(*q) { 
    tx(*q++); 
} 

Damit kompiliert Ihr Code (mit xc8), aber ich habe Ihre SFR-Setup nicht verifiziert - wenn der Code nicht Arbeit, überprüfen Sie, dass Sie die SFRs richtig eingerichtet haben. Siehe den Link von @LPs für weitere Informationen zur Verfügung gestellt: https://electrosome.com/uart-pic-microcontroller-mplab-xc8/

+0

Vielen Dank. Ich habe den Code ohne Fehler kompiliert. Ich werde in Proteus und überprüfen und kommen Sie zurück, Herr. - – user1811790

2

Im Ausdruck:

*(*q++) ; 

Sie den Zeiger dereferenzieren ein Zeichen zu erhalten, auf die Sie dann dereferenzieren (*) wieder; aber Sie können einen Nicht-Zeiger nicht dereferenzieren.

Abgesehen davon, Sie wahrscheinlich auch tx() in uart_string() aufrufen, damit es etwas Sinnvolles tun.