printf для p89v664 печатает ненужные символы с реального микроконтроллера

Я пытаюсь напечатать сообщение на последовательном терминале от p89v664, используя следующий код,

#include<P89V66x.H>
#include<stdio.h>
char putchar(char c) {

if (c == '\n')  {   
    while (!TI);   
    TI = 0;   
    S0BUF = 0x0d;   
}   
TI = 0;
S0BUF = c;    
while (!TI);
return c;

}

int printf(char*str) {

unsigned int cnt = 0;
while(*str != '\0')
{
    putchar(*str);
    cnt++;
    str++;
}
}

void delay(unsigned int i) {
int d = 100;
for(;i!=0;i--) {
    for(;d!=0;d--);
    d = 100;
}
}

int main(void) {
/**Serial init*/
S0CON  = 0x50;                   /* SCON: mode 1, 8-bit UART, enable rcvr    */
TMOD |= 0x20;                   /* TMOD: timer 1, mode 2, 8-bit reload      */
TH1   = 0xF6;                   /* TH1:  reload value for 9600 baud         */
TR1   = 1;                    /* TR1:  timer 1 run                        */
TI = 1;
while(1) {
    printf("Hello\n");
    delay(300);
    printf("Hello World\n");
    delay(10000);
}
}

вышеуказанная программа работает нормально, пока время определения функции printf в этой программе не прокомментировано. Если функция printf в вышеприведенной программе прокомментирована для использования printf из стандартной библиотеки, то ненужные символы печатаются на последовательной консоли. (я использовал замазку). Я использовал компилятор Keil uVision V4.14.4.0.

Чего-то не хватает? Я не понимаю, что не так с этой программой.

1 ответ

Решение

После некоторых экспериментов я обнаружил, что проблема связана с оценочной версией keil uVision4. Я скомпилировал этот код с помощью sdcc и запустил его, и он заработал. Может быть, ограничение версии теста Keil создает проблему. Большое спасибо вам, Mellowcandle, за все ответы.

Редактировать:

#include <P89V66x.H>
#include<stdio.h>

void putchar(char c) {

TI = 0;
S0BUF = c;  
if (c == '\n')  {   
    while (!TI);   
    TI = 0;   
    S0BUF = 0x0d;   
}
while (!TI);
}
int main(void) {

/**Serial init*/
unsigned short int c = 65334;
S0CON  = 0x50;                /* SCON: mode 1, 8-bit UART, enable rcvr    */
TMOD |= 0x20;                 /* TMOD: timer 1, mode 2, 8-bit reload      */
/**For 11.0592 crystal
value should TH = -3 or
TH1 = FD*/
TH1   = 0xF6;                 /* TH1:  reload value for 9600 baud  for 
                              18 Mhz cyrstal */
TR1   = 1;                    /* TR1:  timer 1 run                        */

while(1) {
    printf("Hello %u\n", c);
    delay(300);
    printf("Hello World %u\n" ,c);
    delay(10000);
}
}

Команда, используемая для компиляции этого кода,

sdcc {имя файла}

Другие вопросы по тегам