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模块本身的可用性:
- 直接用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模块故障、波特率不匹配等核心问题。 - 若直接用MSP430调试,需明确:CCS串口监视器监听的是MSP430调试器自带的虚拟串口,而非代码中连接HC-05的UART引脚。现有代码仅实现了MSP430与HC-05的通信,未将HC-05的响应转发到调试串口,因此监视器无输出。
现有代码的核心问题
- 串口输出方向错误:代码中
uart_send_string("Response: ...")是通过连接HC-05的UCA0串口发送的,而非调试器的虚拟串口(通常对应P1.6/P1.7引脚的UCA1),因此CCS无法捕获输出。 - AT模式进入逻辑缺失:多数HC-05需在未配对状态下将EN引脚接3.3V,才能进入AT指令响应模式(默认波特率9600),未接EN时模块处于普通通信模式,无法响应AT指令。
- 延时函数不可靠:
delay(100000)的延时长度依赖MSP430的时钟频率,默认1MHz DCO下仅约100ms,可能不足以等待HC-05返回响应,易导致接收超时或无数据。 - 接收逻辑存在阻塞风险:
uart_receive_string若未收到\r会一直阻塞在uart_receive_char,导致程序卡死,需添加超时机制。
快速修复建议
- 先验证HC-05模块:用USB-TTL完成模块有效性测试,确认能正常响应
AT\r\n。若失败,检查供电(HC-05峰值电流可能超出3.3V LDO能力,建议5V供电转3.3V)、引脚交叉连接(TX-RX、RX-TX)是否正确。 - 修改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
相关产品推荐
相关产品推荐

