ATmega32串口蓝牙模块连接报错:数字常量前缺少;、,或)
串口初始化代码编译错误解决方法
错误根源是宏定义名和函数参数名冲突:你定义了#define BAUD_RATE 9600,同时又把函数参数命名为BAUD_RATE。预编译阶段,编译器会把函数声明里的参数名BAUD_RATE替换成宏值9600,导致函数声明变成void USART_init(long 9600),这明显违反C语法规则,触发你看到的错误。
修正方案
方案1:支持动态传入波特率
修改函数参数名避免和宏重名,同时在函数内用传入参数计算预分频值:
#define F_CPU 16000000UL // 需根据你的MCU实际时钟频率修改 #define BAUD_RATE_DEFAULT 9600 void USART_init(long baud_rate){ unsigned int baud_pres = ((F_CPU / (baud_rate * 16UL)) - 1); UCSRB |= (1 << RXEN ) | (1 << TXEN ) ; UCSRC |= (1 << URSEL) | (1 << UCSZ0) | (1 << UCSZ1) ; UBRRH = (baud_pres >> 8); UBRRL = baud_pres; }
方案2:使用固定波特率
如果不需要动态调整波特率,直接移除函数参数,用宏定义的固定值:
#define F_CPU 16000000UL // 需根据你的MCU实际时钟频率修改 #define BAUD_RATE 9600 #define BAUD_PreS (((F_CPU / (BAUD_RATE * 16UL))) - 1) void USART_init(void){ UCSRB |= (1 << RXEN ) | (1 << TXEN ) ; UCSRC |= (1 << URSEL) | (1 << UCSZ0) | (1 << UCSZ1) ; UBRRH = (BAUD_PreS >> 8); UBRRL = BAUD_PreS; }
注意:必须确保F_CPU已正确定义,它代表MCU的系统时钟频率,否则波特率计算会出现偏差。
内容的提问来源于stack exchange,提问作者Mihiranga Silva
相关产品推荐
相关产品推荐

