【发布时间】:2010-02-27 15:31:29
【问题描述】:
我正在尝试组织我的 UART 库并通过添加一些 #define 来稍微美化它,以便以后可以自定义它而无需深入研究代码,但我似乎无法获得以下内容代码工作:
#define FOSC 8000000
#define BAUDRATE 9600
#define BRGVAL (FOSC/2)/(16*BAUDRATE)-1
void uart_init(){
U1BRG = BRGVAL;
}
计算后 BRGVAL 变为 25.0416667,因为它不是整数,所以当我将其分配给 U1BRG 时,我收到以下警告:
UART.c:在函数“uart_init”中:
UART.c:24:警告:表达式中的整数溢出
...而且代码根本无法在目标硬件上运行。 (如果我手动输入 U1BRG = 25 它就像一个魅力)
有没有办法将该常量类型转换为整数以使编译器满意?
非常感谢, 哈姆扎。
【问题讨论】:
-
这个平台上的
sizeof(int)是什么? -
U1BRG 的类型是什么(以及该类型的大小)?
-
为什么你认为BRGVAL变成了25.0416667?宏中表达式中的所有组件都是整数,因此当宏被替换时,表达式将使用整数算术进行评估。编译器警告的问题是溢出,而不是浮点截断。
-
U!1BRG 是无符号整数(16 位),它是 MPLAB C30 编译器