大家帮忙看看到底是什么问题,谢谢了
俺在用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); //返回按键值
}
}
问题就出在黑色字体的地方(错误提示的位置),请大虾们指点一下,多谢 ! U0THR是UART的寄存器吗?你改成U0THR=c; return(c);试试看! 试过了不行啊 ,提示 SRC\UART.c(62): error:#141-D: unnamed prototyped parameters not allowed when body is present,估计是调用putchar 函数的时候出的问题,就是不知道为什么不行啊,各位帮帮忙啊,谢过了 SRC\UART.c(62): error:#79: expected a type specifier,同时提醒这句话,没有定义类型说明符,程序中我定义了整形了啊,就是不知道哪出错了,看别人这么用的没有问题啊,不过人家的开发环境是IAR,不知道和开发环境有没有关系 读那句话,
while (!(U0LSR & 0x20));
return (U0THR=c);
怎么这么别扭呢?
不能好好地写吗?
U0THR=c;
return (U0THR);
看看,是不是你的写法编译器拒绝接受?
其实我们根本没有必要写这么拗口的代码。编译器也很容易出现理解歧义的 代码是别扭一些?关键是,我调用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 调用stdio.h时,错误提示就是上面的黑体部分的错误,不明所以,忘大家指点 代码没有语法错误,要不就是那两个寄存器的名称有问题,U0LSR,U0THR。。。。。。光看代码是看不出来什么问题! 寄存器没有问题,我感觉是调用stdio.h的问题,给我个您的邮箱,我把工程文件发给您帮忙看一下? 帮顶 自己没用过 不过好多事情都是靠自己完成的 不是不帮忙 是力不从心啊 你去检查一下putchar(int c) 函数实体,可能是定义上没有对参数定类型。 都瞎说。
putchar 是库接口,而你在自己代码中又定义了一个putchar,所以定义重复。
把你自己的putchar改个名字就可以了。 你没有用到putchar,为什么定义这个函数,
你用的是UART0_PutChar 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]