2016-04-08 10 views
1

Привет Я написал код для кода UART для PIC16F877A. Код не работает, и его показ ошибок как указатель требуется на MP LAB IDE.I хотят отправлять и получать символы на ПК гипер terminal.any один из вас меня ГПУ разрешить вопросыpic16f877a uart embedded 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

Взгляните на [данное руководство] (https://electrosome.com/uart-pic-microcontroller-mplab-xc8/). По крайней мере, вы должны установить скорость передачи в бодах, чтобы делать то, что хотите. Маленький наконечник. Попытайтесь выполнить короткую передачу TX и RX и начните работать. Для подключения к ПК вам также понадобится, по крайней мере, USB-кабель TTL UART (5V). – LPs

+1

Если ваш компилятор выдает диагностическое сообщение, вы должны указать точное сообщение в вопросе и указать, в какой строке было отправлено сообщение. – Clifford

+0

@ LPs: ПК с устаревшими последовательными портами по-прежнему доступны. Хотя тогда потребуется драйвер линии 232. Если на его компьютере установлен HyperTerminal по умолчанию, он должен быть довольно старым и, возможно, имеет 232 порта в любом случае. – Clifford

ответ

3

заявление в ваш while цикл не имеет смысла:

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

Это приводит к error: (981) pointer required ошибки вы получаете, так как вы разыменования не-указатель: *q++ возвращающую char, следовательно, вы пытаетесь разыменовывать char с наружной *.

Вместо этого, вы, вероятно, хотите, чтобы передать символ, который в данный момент указывает указатель (*q), а затем увеличить указатель (q++):

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

Это также может быть записан как

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

С этим кодом компилируетсяxc8), но я не подтвердил вашу настройку SFR - если код не work, дважды проверьте правильность настройки SFR. Смотрите ссылку предоставленную @LPs для получения дополнительной информации: https://electrosome.com/uart-pic-microcontroller-mplab-xc8/

+0

Спасибо. Я скомпилировал код без ошибок. Я проверю протест и вернусь к вам сэр. - – user1811790

2

В выражении:

*(*q++) ; 

Вы разыменования указателя, чтобы получить символ, к которому затем разыменования (*) снова; но вы не можете разыменовать не указатель.

Кроме того, вы, вероятно, также намеревались позвонить tx() в uart_string(), чтобы он мог сделать что-нибудь полезное.