You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 10:30:41