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 {имя файла}