아두이노에서 HC-05 블루투스 모듈의 설정을 변경하기 위해 AT 명령어 모드를 사용할 때,
가끔 ERROR(0) 이라는 메시지가 발생할 수 있습니다.
이 문제는 주로 시리얼 데이터 전송 타이밍 또는 버퍼 처리 방식 때문인데,
아래 내용을 참고하여 점검해보시면 대부분 해결됩니다.
🧩 기본 AT 명령어 송신 코드
먼저, 일반적으로 많이 사용하는 기본 코드입니다.
이 코드는 시리얼 모니터에서 입력한 데이터를 HC-05로 그대로 전달하고,
HC-05의 응답을 다시 시리얼 모니터에 출력합니다.
#include <SoftwareSerial.h>
//핀 설정
#define BT_TXD 2
#define BT_RXD 3
//소프트웨어 UART 설정
SoftwareSerial btSerial(BT_RXD, BT_TXD);
void setup(){
Serial.begin(115200);
btSerial.begin(38400);
}
void loop(){
if (btSerial.available()){
Serial.write(btSerial.read());
}
if (Serial.available()){
btSerial.write(Serial.read());
}
}
⚠️ ERROR(0)이 발생하는 경우
위 코드를 사용하다 보면 간헐적으로
시리얼 모니터에 ERROR(0) 메시지가 나타나는 경우가 있습니다.
이는 HC-05 모듈이 AT 명령 전체를 받지 못하고 중간에 끊겨버릴 때 발생하는 현상으로,
아두이노에서 문자 단위로 전송이 너무 빨라 버퍼가 꼬이는 경우에 자주 발생합니다.
✅ 개선된 코드 (문자열 버퍼링 방식)
아래는 이 문제를 방지하기 위해
개행 문자('\n')가 입력될 때까지 데이터를 모았다가 한 번에 전송하는 방식의 코드입니다.
#include <SoftwareSerial.h>
//핀 설정
#define BT_TXD 2
#define BT_RXD 3
//소프트웨어 UART 설정
SoftwareSerial btSerial(BT_RXD, BT_TXD);
void setup(){
Serial.begin(115200);
btSerial.begin(38400);
}
char str[255];
int strLen=0;
void loop(){
if (btSerial.available()){
Serial.write(btSerial.read());
}
if (Serial.available()){
char ch = Serial.read();
str[strLen] = ch;
if(++strLen >= 255){
strLen = 0;
}
if(ch == '\n') {
btSerial.write(str, strLen);
strLen = 0;
}
}
}
💡 동작 원리
이 코드는 시리얼 모니터에서 입력된 데이터가
줄바꿈(New Line, \n) 을 포함할 때까지 버퍼(str[])에 저장해두었다가,
완전한 명령어가 입력되면 HC-05로 한 번에 전송합니다.
즉, AT+NAME=HC05\n 과 같이 입력해야
모듈이 정확히 인식하여 응답하게 됩니다.
🧠 추가 팁
- HC-05 모듈의 AT 모드는 일반적으로 38400bps 속도를 사용합니다.
(보통 AT 모드 진입 시 LED가 2초 간격으로 점멸합니다.) - AT 모드 전환 방법:
- EN(또는 KEY) 핀을 HIGH 상태로 두고 전원 인가
- “OK” 응답이 안 올 때:
- RX/TX 배선이 교차되어 있는지 확인
- 전원(5V) 공급이 안정적인지 점검
- SoftwareSerial 핀 번호를 다른 디지털 핀으로 변경해 테스트
🧾 HC-05 모듈의 AT 명령어 리스트 정리
HC-05 블루투스 모듈은 AT(Command) 명령어를 통해
이름, 비밀번호, 연결 모드, 역할(Master/Slave) 등을 설정할 수 있습니다.
아래 표는 자주 사용하는 명령어와 설명입니다.
| AT | 통신 테스트 (응답: OK) | AT | 연결 확인용 기본 명령 |
| AT+VERSION? | 펌웨어 버전 확인 | AT+VERSION? | OKlinvorV1.8 등으로 응답 |
| AT+NAME? | 현재 모듈 이름 확인 | AT+NAME? | OK+NAME:HC-05 |
| AT+NAME=xxxx | 블루투스 이름 변경 | AT+NAME=HIGENIS_BT | OKsetname |
| AT+PSWD? | 연결 비밀번호 확인 | AT+PSWD? | OK+PSWD:1234 |
| AT+PSWD=xxxx | 연결 비밀번호 변경 | AT+PSWD=4321 | OKsetpswd |
| AT+UART? | UART 속도, 스톱비트, 패리티 확인 | AT+UART? | OK+UART:38400,0,0 |
| AT+UART=baud,stop,parity | UART 설정 변경 | AT+UART=9600,0,0 | 8N1 기준 |
| AT+ROLE? | 현재 역할 확인 | AT+ROLE? | OK+ROLE:0 (0: Slave, 1: Master) |
| AT+ROLE=0/1 | 역할 설정 (Slave/Master) | AT+ROLE=1 | Master로 설정 |
| AT+ADDR? | 모듈 주소 확인 | AT+ADDR? | OK+ADDR:98D3:31:FD5B64 |
| AT+BIND=addr | 특정 주소로 자동 연결 설정 | AT+BIND=98D3,31,FD5B64 | Master 모드 필요 |
| AT+CMODE? | 연결 모드 확인 (0=고정,1=임의) | AT+CMODE? | OK+CMODE:0 |
| AT+CMODE=0/1 | 연결 모드 설정 | AT+CMODE=1 | 모든 기기 연결 허용 |
| AT+RESET | 모듈 재시작 | AT+RESET | 변경사항 적용 시 필요 |
| AT+ORGL | 공장 초기화 | AT+ORGL | 모든 설정 초기화 |
💡 HC-05 AT 모드 진입 방법 요약
- EN (또는 KEY) 핀을 HIGH 상태로 둡니다.
- 전원을 인가하면 LED가 느리게 (약 2초 간격) 점멸합니다.
- 아두이노 시리얼 모니터를 열고 통신속도를 38400bps, 개행(New Line) 설정으로 변경합니다.
- AT 입력 후 OK 응답이 오면 정상적으로 AT 모드에 진입한 것입니다.
✅ 자주 발생하는 문제와 해결법
| ERROR(0) | 명령어가 중간에 끊겨 전송됨 | 문자열 버퍼링 코드 사용 (위 예제 참고) |
| 응답이 없음 | AT 모드 미진입 또는 RX/TX 반대 연결 | EN 핀 상태 및 배선 확인 |
| “OK” 대신 깨진 문자 출력 | 보레이트(baud rate) 불일치 | 38400bps로 설정 후 재시도 |
| 설정이 저장되지 않음 | AT+RESET 미호출 | 설정 후 반드시 AT+RESET 수행 |
✅ 정리
| 기본 통신 속도 | 38400bps |
| 주 오류 원인 | 명령어 끊김, 버퍼 오버런 |
| 해결 방법 | 개행 문자 단위 전송 (위 개선 코드 참고) |
| AT 모드 진입 조건 | KEY 핀 HIGH 상태에서 전원 인가 |
HC-05를 처음 설정할 때는 이런 단순한 버퍼링 문제로도 오류가 날 수 있으니,
개선된 코드로 교체한 뒤 테스트해보세요.
“OK” 응답이 정상적으로 출력되면 AT 명령 통신이 완전히 성공한 것입니다.
🧠 마무리
HC-05 모듈은 구조가 단순하지만, AT 명령의 전송 타이밍과
시리얼 설정(baud rate, 개행 문자 등) 에 따라 정상 동작 여부가 달라집니다.
이 글의 코드를 활용하면 대부분의 ERROR(0) 문제를 해결할 수 있으며,
필요한 설정도 안정적으로 변경할 수 있을 것입니다.