hengheng1217 发表于 2010-12-15 00:00

大家帮忙看看到底是什么问题,谢谢了

俺在用keil调试LPC2132的串口的时候,调用#include <stdio.h>中的printf 函数会提示错误,SRC\UART.c(62): error:#141-D: unnamed prototyped parameters not allowed when body is present。把代码贴出来大家帮忙看看,多谢了

#define UART_BPS 115200
#include "..\inc\config.h"
#include <stdio.h>

/**********************延时子函数****************************************/
void wait()
{
    U32 i = 10;      
//U8counter = 0;//此处如果设置的延时因子i>5则发送回去的信息会丢失,越打丢失的越多,最多时丢失到只剩2位为止
while(i--);
/*{
for(i = 5000;i--;i >0 );
} */
}
/**********************串口0初始化****************************************/
void UART0_Init ()
{
   U16 Fdiv;
   U0LCR = 0x83;            // DLAB = 1,可设置波特率
   Fdiv = (Fpclk / 16)/ UART_BPS;         // 设置波特率
   U0DLM = Fdiv / 256;      
   U0DLL = Fdiv % 256;
   U0LCR = 0x03;
}
/***************************从串口0接收数据*********************************/
char UART0_GetChar ( void )
{
U8 Rcv_Data;
while((U0LSR&0x01)==0);                  //等待有效数据
Rcv_Data=U0RBR;                        //读取数据
return(Rcv_Data);
}
/***************************从串口0接收字符串*********************************/
void UART0_GetString ( U8 *s,U32 n )
{
for(;n>0;n++)
{
    *s++=UART0_GetChar();
}
}
int putchar(int c)
{
while (!(U0LSR & 0x20));
return (U0THR=c);
}
/***************************向串口0发送数据*********************************/
void UART0_PutChar ( U32 data)
{
U0THR = data;       // 发送数据
while( (U0LSR&0x40)==0 );   // 等待数据发送完毕
}
/***************************向串口0发送字符串*********************************/
voidUART0_PutString(char *str)
{
while(*str !='\0')
{
    UART0_PutChar(*str++);
}
}
/*****************************PLL初始化**************************************/
void PLL_Init(void)
{
/* 设置系统各部分时钟 */
    PLLCON = 1;
#if ((Fcclk / 4) / Fpclk) == 1
VPBDIV = 0;
#endif
#if ((Fcclk / 4) / Fpclk) == 2
VPBDIV = 2;
#endif
#if ((Fcclk / 4) / Fpclk) == 4
VPBDIV = 1;
#endif
#if (Fcco / Fcclk) == 2
PLLCFG = ((Fcclk / Fosc) - 1) | (0 << 5);
#endif
#if (Fcco / Fcclk) == 4
PLLCFG = ((Fcclk / Fosc) - 1) | (1 << 5);
#endif
#if (Fcco / Fcclk) == 8
PLLCFG = ((Fcclk / Fosc) - 1) | (2 << 5);
#endif
#if (Fcco / Fcclk) == 16
PLLCFG = ((Fcclk / Fosc) - 1) | (3 << 5);
#endif
PLLFEED = 0xaa;
PLLFEED = 0x55;
while((PLLSTAT & (1 << 10)) == 0);
PLLCON = 3;
PLLFEED = 0xaa;
PLLFEED = 0x55;
}
/***************************主函数*********************************/
void main( void )
{
U8 command;
PINSEL0 = 0x00000005;   // 设置I/O连接到UART0
PINSEL1 = 0x00000000;


PLL_Init();

UART0_Init();         //UART0初始化
UART0_PutString(" \n heng UART Test\n");
printf(" \nPrint a number: %d\n",200);
printf(" \nPrint a float number: %f\n",11.0592);
while ( 1 )   
    {
command = UART0_GetChar(); //接收按键值
   
      UART0_PutChar(command);         //返回按键值
   
    }
}
问题就出在黑色字体的地方(错误提示的位置),请大虾们指点一下,多谢 !

areshan 发表于 2010-12-15 09:36

U0THR是UART的寄存器吗?你改成U0THR=c; return(c);试试看!

hengheng1217 发表于 2010-12-15 23:31

试过了不行啊 ,提示 SRC\UART.c(62): error:#141-D: unnamed prototyped parameters not allowed when body is present,估计是调用putchar 函数的时候出的问题,就是不知道为什么不行啊,各位帮帮忙啊,谢过了

hengheng1217 发表于 2010-12-15 23:42

SRC\UART.c(62): error:#79: expected a type specifier,同时提醒这句话,没有定义类型说明符,程序中我定义了整形了啊,就是不知道哪出错了,看别人这么用的没有问题啊,不过人家的开发环境是IAR,不知道和开发环境有没有关系

airwill 发表于 2010-12-16 10:10

读那句话,
while (!(U0LSR & 0x20));
return (U0THR=c);
怎么这么别扭呢?
不能好好地写吗?

U0THR=c;
return (U0THR);

看看,是不是你的写法编译器拒绝接受?
其实我们根本没有必要写这么拗口的代码。编译器也很容易出现理解歧义的

hengheng1217 发表于 2010-12-21 21:49

代码是别扭一些?关键是,我调用stdio.h的时候就出问题,难道这个头文件就有错误????
C:\Keil\ARM\RV31\INC\stdio.h(659): error:#79: expected a type specifier
#ifdef __cplusplus
    inline int putchar(int __c) { return putc(__c, stdout); }
#else
    #define putchar(c) putc(c, stdout)
    extern _ARMABI int putchar (int /*c*/);#endif

hengheng1217 发表于 2010-12-21 21:50

调用stdio.h时,错误提示就是上面的黑体部分的错误,不明所以,忘大家指点

areshan 发表于 2010-12-23 16:01

代码没有语法错误,要不就是那两个寄存器的名称有问题,U0LSR,U0THR。。。。。。光看代码是看不出来什么问题!

hengheng1217 发表于 2010-12-23 22:38

寄存器没有问题,我感觉是调用stdio.h的问题,给我个您的邮箱,我把工程文件发给您帮忙看一下?

soonli 发表于 2010-12-25 11:02

帮顶   自己没用过   不过好多事情都是靠自己完成的   不是不帮忙   是力不从心啊

SHMILY200912 发表于 2011-11-30 09:20

你去检查一下putchar(int c) 函数实体,可能是定义上没有对参数定类型。

hall919 发表于 2012-12-13 18:37

都瞎说。
putchar 是库接口,而你在自己代码中又定义了一个putchar,所以定义重复。
把你自己的putchar改个名字就可以了。

hall919 发表于 2012-12-13 19:06

你没有用到putchar,为什么定义这个函数,
你用的是UART0_PutChar

glj0526 发表于 2024-11-13 13:57

Keil和IAR用printf重定向的方式不一样
keil用fputc
IAR用putchar
要想IAR和KEIL通用可以用
#ifdef __GNUC__
#define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
#else
#define PUTCHAR_PROTPTYPE int fputc(int ch,FILE* f)
#endif
PUTCHAR_PROTPTYPE
{
    while (!M0P_UART2->ISR_f.TXE)
    {
    };                                                          //检查发送缓存是否为空
    return (M0P_UART2->SBUF = ch); //UARTx_SBUF 写入下一个发送数据
}
页: [1]
查看完整版本: 大家帮忙看看到底是什么问题,谢谢了