HM-10 Modules Pair & Connect (Solid LED) but No Data Transmission Between Arduinos

Hi everyone,

I am having trouble with a pair of HM-10 Bluetooth 4.0 modules. I have two pairs (one set with black PCBs and one with blue PCBs). I am able to successfully pair and connect them—the status LED goes from blinking to solid on both—but I cannot send or receive any data between them through the Serial Monitor.

Hardware Setup:

  • Master: Arduino Mega 2560
  • Slave: Arduino UNO
  • Modules: HM-10 and AT09
  • Power: External 5V power supply for the modules with common GND shared with the Arduinos.
  • Level Shifting: I am using a voltage divider on the HM-10 RX pins to shift the Arduino's 5V TX signal to 3.3V.

Configuration Steps Taken:

  1. Master Setup: AT+ROLE1, AT+TYPE0.
  2. Slave Setup: AT+ROLE0, AT+TYPE0.
  3. Connection: I used AT+ADDR? to get the MAC address, then AT+INQ to find the device index, and finally AT+CONN[index] to connect.
  4. Result: The LEDs on both modules stay solid, indicating a successful connection.

The Problem: Despite the solid LED, when I type something in the Serial Monitor of the Master, nothing appears on the Slave's Serial Monitor, and vice versa.

What I have already tried:

  • Swapping TX/RX cables (to rule out cross-wiring issues).
  • Swapping Master/Slave roles between the boards.
  • Testing different module combinations (Blue-Blue, Black-Black, Blue-Black).
  • Using SoftwareSerial on different pins.
  • Using a "Blank Sketch" on the Arduinos to use them as USB-to-Serial converters.
  • Verified that both Serial Monitors are set to 9600 baud and Both NL & CR.

Wiring Diagram:

Serial Monitor Logs (AT Commands):

Code used for testing (SoftwareSerial):

#include <SoftwareSerial.h>

SoftwareSerial bluetooth(10, 11); // RX, TX

void setup() {
  Serial.begin(9600);
  bluetooth.begin(9600);
  Serial.println("Ready to send/receive data...");
}

void loop() {
  if (bluetooth.available()) {
    Serial.write(bluetooth.read());
  }
  if (Serial.available()) {
    bluetooth.write(Serial.read());
  }
}

Physical Modules: I am using two different versions of the HM-10 breakout boards to rule out hardware defects.

  • Model A: Blue PCB, labeled ZS-040 with a 3.3V/5V level converter.

  • Model B: Black PCB, labeled Bluetooth 4.0.

Is there any specific command like AT+START or a characteristic setting I am missing to allow transparent data transmission after the connection is established? Any help would be greatly appreciated.

SoftwareSerial bluetooth(10, 11); // RX, TX

  • The pins don’t agree.

You are correct, the pins in the diagram (0 and 1) don't match the SoftwareSerial bluetooth(10, 11) snippet. I should have clarified that.

The attached diagram represents a 'Hardware Bypass' test. I am using a blank sketch on the Arduinos to use the onboard USB-to-Serial converter to talk directly to the HM-10 modules via the Serial Monitor. For this specific configuration:

• Arduino RX (0) is connected to HM-10 RX (via voltage divider).

• Arduino TX (1) is connected to HM-10 TX.

I have also tested the SoftwareSerial configuration on pins 10 and 11 (crossing TX to RX) to rule out hardware serial conflicts, but the result remains the same: the modules show a solid 'Connected' LED, but no data is being bridged between them.

I didn't want to clutter the post with every single wiring variation I've tried, but I can confirm that even with a clear UART path and a shared GND, the transparent transmission is not occurring.

Arduino 5v TX goes through the voltage divider to the HM-10 3.3v RX.

The HM-10 3.3v TX goes directly to Arduino RX.

Thank you for pointing that out. I actually already tested the wiring configuration you mentioned (crossing TX to RX using pins 10 and 11 with SoftwareSerial) and I got the exact same results.

I switched back to the Hardware Bypass (blank sketch) just to eliminate any possible code-related latency or overhead, but the behavior is identical:

• Initial success: Occasionally, right after power-cycling the Master, I can see a single 'HELLO' or something I send on the Serial Monitor.

• Immediate freeze: Right after that first message, the communication dies. The LEDs remain solid (connected), but no more data passes through. This happens even with 'No line ending' selected.

I have already verified that the 5V TX from the Arduino is stepped down to 3.3V via the voltage divider and that all GNDs (external PSU and both Arduinos) are tied together. It seems like the UART buffer on the CC2541 is hanging or shifting states after the first packet is bridged.

Welcome Back!
Without a schematic and based on your picture, I suspect you have a power supply problem. You did not include a link to the HM-10 module, so I can only guess which version you are using.

My suggestion is to use a good external power supply. Arduinos typically provide poor power regulation and can cause problems like the ones you are seeing. You may notice random disconnects or pairing issues, AT commands not responding, shorter BLE range, and the module resetting during transmit bursts.

Some possible causes include transmit current spikes (around 20 to 30 mA), poor decoupling leading to voltage dips, and additional noise from breadboards or long wires.

Let us know how it works out for you.

The Martyn Currey tutorials are worth looking at.

https://www.martyncurrey.com/arduino-to-arduino-communication-using-hm-10s/

That would tell me the wiring was good or close, and missing something.

I like to put a "heartbeat" timer in my code to blink the LED_BUILTIN one time per loop to verify the code is advancing. That is to say, something like this...

unsigned long timer, timeout = 500;

// your configuration

void setup() {
  pinMode(LED_BUILTIN, OUTPUT);

  // your setup

}

void loop() {
  if (millis() - timer >= timeout) {
    timer = millis();
    digitalWrite(LED_BUILTIN, !digitalRead(LED_BUILTIN));
  }

  // your code

}