본문 바로가기

아두이노/문제해결

🔧 HC-05 ERROR(0) 발생 시 확인해 볼 것

반응형

아두이노에서 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 모드 진입 방법 요약

  1. EN (또는 KEY) 핀을 HIGH 상태로 둡니다.
  2. 전원을 인가하면 LED가 느리게 (약 2초 간격) 점멸합니다.
  3. 아두이노 시리얼 모니터를 열고 통신속도를 38400bps, 개행(New Line) 설정으로 변경합니다.
  4. 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) 문제를 해결할 수 있으며,
필요한 설정도 안정적으로 변경할 수 있을 것입니다.

 

 

반응형