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

MSP430与HC05串口无响应求助:AT指令无法获取设备信息

问题描述

我尝试通过MSP-EXP430G2ET开发板向HC-05蓝牙模块发送AT指令,以获取周边蓝牙设备的名称及RSSI值。硬件连接情况如下:

  • MSP430的RX引脚(P1.1)连接HC-05的TX引脚
  • MSP430的TX引脚(P1.2)连接HC-05的RX引脚
  • 两者GND共地,HC-05使用3.3V供电
  • HC-05的EN、STATE引脚未连接

使用ChatGPT生成的代码后,Code Composer Studio(CCS)的串口监视器无任何输出;尝试将HC-05的EN引脚接3.3V、改用PuTTY终端测试后,问题仍未解决。请问是否必须使用USB-TTL转换器才能完成测试?

代码片段
#include <msp430.h>

// HC-05 baud rate
#define BAUD_RATE 9600

// Buffer length for UART communication
#define BUFFER_LENGTH 20

// HC-05 UART pins
#define HC05_TX BIT1
#define HC05_RX BIT2

// Delay function
void delay(unsigned int d) {
    volatile unsigned int i;
    for(i=0; i<d; i++);
}

// Initialize UART
void uart_init() {
    P1SEL |= HC05_TX + HC05_RX;
    P1SEL2 |= HC05_TX + HC05_RX;
    UCA0CTL1 |= UCSSEL_2;
    UCA0BR0 = 104;
    UCA0BR1 = 0;
    UCA0MCTL = UCBRS0;
    UCA0CTL1 &= ~UCSWRST;
}

// Send a character through UART
void uart_send_char(char c) {
    while(!(IFG2 & UCA0TXIFG));
    UCA0TXBUF = c;
}

// Send a string through UART
void uart_send_string(char* str) {
    int i;
    for(i=0; str[i]!=0; i++) {
        uart_send_char(str[i]);
    }
}

// Receive a character through UART
char uart_receive_char() {
    while(!(IFG2 & UCA0RXIFG));
    return UCA0RXBUF;
}

// Receive a string through UART
void uart_receive_string(char* buffer) {
    int i;
    for(i=0; i<BUFFER_LENGTH; i++) {
        buffer[i] = uart_receive_char();
        if(buffer[i] == '\r') {
            break;
        }
    }
    buffer[i] = 0;
}

// Send an AT command and wait for response
void hc05_send_at_command(char* command, char* response) {
    char buffer[BUFFER_LENGTH];
    int i;

    uart_send_string(command);
    delay(100000);
    uart_receive_string(buffer);
    for(i=0; buffer[i]!=0; i++) {
        response[i] = buffer[i];
    }
    response[i] = 0;
}

int main(void) {
    WDTCTL = WDTPW + WDTHOLD;

    uart_init();

    char response[BUFFER_LENGTH];

    // Send AT command to HC-05 and wait for response
    hc05_send_at_command("AT\r\n", response);

    // Print response
    uart_send_string("Response: ");
    uart_send_string(response);

    while(1);

    return 0;
}
分析与解决方案

是否需要USB-TTL转换器?

不一定必须,但USB-TTL转换器会大幅降低调试难度,建议优先使用它验证HC-05模块本身的可用性:

  1. 直接用USB-TTL连接HC-05:TTL的TX接HC-05 RX,TTL的RX接HC-05 TX,共地,EN接3.3V(进入AT模式),用PuTTY发送AT\r\n,查看是否返回OK。这一步可快速排除HC-05模块故障、波特率不匹配等核心问题。
  2. 若直接用MSP430调试,需明确:CCS串口监视器监听的是MSP430调试器自带的虚拟串口,而非代码中连接HC-05的UART引脚。现有代码仅实现了MSP430与HC-05的通信,未将HC-05的响应转发到调试串口,因此监视器无输出。

现有代码的核心问题

  1. 串口输出方向错误:代码中uart_send_string("Response: ...")是通过连接HC-05的UCA0串口发送的,而非调试器的虚拟串口(通常对应P1.6/P1.7引脚的UCA1),因此CCS无法捕获输出。
  2. AT模式进入逻辑缺失:多数HC-05需在未配对状态下将EN引脚接3.3V,才能进入AT指令响应模式(默认波特率9600),未接EN时模块处于普通通信模式,无法响应AT指令。
  3. 延时函数不可靠:delay(100000)的延时长度依赖MSP430的时钟频率,默认1MHz DCO下仅约100ms,可能不足以等待HC-05返回响应,易导致接收超时或无数据。
  4. 接收逻辑存在阻塞风险:uart_receive_string若未收到\r会一直阻塞在uart_receive_char,导致程序卡死,需添加超时机制。

快速修复建议

  1. 先验证HC-05模块:用USB-TTL完成模块有效性测试,确认能正常响应AT\r\n。若失败,检查供电(HC-05峰值电流可能超出3.3V LDO能力,建议5V供电转3.3V)、引脚交叉连接(TX-RX、RX-TX)是否正确。
  2. 修改MSP430代码:添加调试串口初始化与转发逻辑,将HC-05的响应发送到调试串口,示例如下:
// 初始化调试串口(连接电脑的虚拟串口)
void debug_uart_init() {
    P1SEL |= BIT6 + BIT7;
    P1SEL2 |= BIT6 + BIT7;
    UCA1CTL1 |= UCSSEL_2;
    UCA1BR0 = 104;
    UCA1BR1 = 0;
    UCA1MCTL = UCBRS0;
    UCA1CTL1 &= ~UCSWRST;
}

// 调试串口发送字符串
void debug_send_string(char* str) {
    int i;
    for(i=0; str[i]!=0; i++) {
        while(!(IFG2 & UCA1TXIFG));
        UCA1TXBUF = str[i];
    }
}

在main函数中调用debug_uart_init(),并将原有的uart_send_string("Response: ...")替换为debug_send_string("Response: ..."),即可在CCS监视器中看到HC-05的响应。

内容的提问来源于stack exchange,提问作者Mert Yavuz

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 09:37:47