Unable to get AT-command response from RAK2011 using RAK4630 module

Greetings !

I am using the RAK4630 module integrated on a RAK5005 baseboard, which is being powered serially through a USB cable. And I am connecting the RAK2011 cellular shield (based on Quectel BG96) to RAK4630 via UART using J10 (RX,TX) pins on RAK5005 baseboard.

Following is the pin configuration between the baseboard and cellular shield pins:

RX1 (J10, RAK5005) -> TXD1 (RAK2011)
TX1 (J10, RAK5005) -> RXD1 (RAK2011)
GND (J10, RAK5005) -> GND (RAK2011)
IO1 (J11, RAK5005) -> PWRKEY (RAK2011)

The RAK2011 cellular shield is being powered separately from another USB cable.

However, I am not receiving response of the AT commands that are being sent to RAK2011 from RAK4630 module. Any assistance will be appreciated.


What Baud rate are you using?
Did you try to switch RX and TX?
How do you send the command and how do you wait for response?
How do you initialize the Serial1 on the RAK4631?


  • Baud rate is 115200
  • Yes, I tried switching RX and TX. It was still the same behavior.
  • I am using the following “unvarnished transmission” example for BG77 :
   @file BG77_Unvarnished_Transmission.ino
   @author rakwireless.com
   @brief BG77 unvarnished transmission via USB
   @version 0.1
   @date 2020-12-28
   @copyright Copyright (c) 2020
#include <Adafruit_TinyUSB.h>
#define BG77_POWER_KEY WB_IO1

void setup()
	time_t serial_timeout = millis();
	while (!Serial)
		if ((millis() - serial_timeout) < 5000)
	Serial.println("BG77 AT CMD TEST!");
	// Check if the modem is already awake
	time_t timeout = millis();
	bool moduleSleeps = true;
	//BG77 init
	while ((millis() - timeout) < 6000)
		if (Serial1.available())
			String result = Serial1.readString();
			Serial.println("Modem response after start:");
			moduleSleeps = false;
	if (moduleSleeps)
		// Module slept, wake it up
		pinMode(BG77_POWER_KEY, OUTPUT);
		digitalWrite(BG77_POWER_KEY, 0);
		digitalWrite(BG77_POWER_KEY, 1);
		digitalWrite(BG77_POWER_KEY, 0);
	Serial.println("BG77 power up!");

void loop()
	int timeout = 100;
	String resp = "";
	String snd = "";
	char cArr[128] = {0};
	while (timeout--)
		if (Serial1.available() > 0)
			resp += char(Serial1.read());
		if (Serial.available() > 0)
			snd += char(Serial.read());
	if (resp.length() > 0)
	if (snd.length() > 0)
		memset(cArr, 0, 128);
		snd.toCharArray(cArr, snd.length() + 1);
	resp = "";
	snd = "";

I checked by adding a if/else statement to see when Serial1.available() is true. It only returns true when I repeatedly send 3-4 commands/strings to the serial and response to those commands are some unknown characters.

  • For initializing Serial1 on the RAK4631, I’m not sure about this part. I am assuming that RX and TX pins on the baseboard are sufficient for the communication.

I do not have the RAK2011 (old board, no longer produced). But from the schematics, it seems you have to connect the IOREF pin to 3.3V of the RAK5005-O board.

RAK2011 was designed for 5V Arduino boards.
Because Arduino boards have usually 5V, there is a voltage converter on the RAK2011 that needs IOREF to be connected to the power supply of the RAK5005-O.

I did try the IOREF approach as well, let me do that again.

Other than that, try to use the other UART of the BG96

I attached IOREF (BG96) to VDD (3.3v) on RAK5005 baseboard and it’s working. I am able to get response of AT commands from BG96. Thanks.

Happy to help.
Please mark it as solution.

Good luck with your project.

This topic was automatically closed 2 days after the last reply. New replies are no longer allowed.