Arduino Nano 33 powering off when GND connected to reset

Hello everyone,
I have troubles using the serial port of my arduino nano 33 : no problem with the other functions of the board, I've been able to upload code to send datas through BLE, connect it to SD card adapter etc.
But then I tried to use it with a GPS, which means receiving datas on D0 (RX), and this doesn't seem to work. I tried using the GPS with an Arduino Mega, : it worked perfectly and printed all the GPS datas on the serial monitor.
I then tried the loopback test on the arduino nano (by connecting GND to RESET, and TX to RX), and I don't get any echo, but the main issue is that connecting GND to RESET makes the board power off, which I don't understand. The led goes off and the board is no more recognized by the PC. Again, this test worked perfectly on the other board.

I wasn't able to find someone else having the same issue on the internet, does someone have an idea of what is happening ?

Do you think there is a way to use the board despite of that, for example creating a SoftwareSerial on other pins to use it instead of the TX/RX ? (I know the library SoftwareSerial doesn't work on arduino nano, but maybe there is another library I can use to do something like that ?)

Thanks for your help

krauthl:
But then I tried to use it with a GPS, which means receiving datas on D0 (RX), and this doesn't seem to work. I tried using the GPS with an Arduino Mega, : it worked perfectly and printed all the GPS datas on the serial monitor.

Please describe exactly how the GPS module is wired to the Nano 33 BLE and post your code.

krauthl:
I then tried the loopback test on the arduino nano (by connecting GND to RESET, and TX to RX), and I don't get any echo, but the main issue is that connecting GND to RESET makes the board power off, which I don't understand. The led goes off and the board is no more recognized by the PC. Again, this test worked perfectly on the other board.

The Nano 33 BLE is significantly different than the Arduino Mega in that the Nano 33 BLE has native USB capabilities, meaning it can communicate directly with the computer over USB. The Arduino Mega's ATmega2560 microcontroller does not have native USB, and so must use a separate USB to serial adapter chip to communicate with the computer. Due to this difference, the loopback test does not apply to the Nano 33 BLE and the results you're seeing are normal and expected.

Thank you for the quick answer ! The GPS I use is Gooouu Tech GT-U7
Here is my code :

/* VCC - Arduino 3.3v
GND - Arduino GND
TXD - Arduino D0
RXD - No connect
PPS - No connect
*/

char nmeaSentence[68];
String latitude;    //Latitude
String longitude;   //Longitude
String lndSpeed;    //Speed
String gpsTime;   //UTC time, Kuala Lumpur is 8
String klTime;    //KL Time

//#define GPSSerial Serial

void setup()
{
  Serial.begin(9600);
  Serial.println("Waiting...");
}

void loop()
{

  // For one second we parse GPS data and report some key values
  for (unsigned long start = millis(); millis() - start < 1000;)  //Scan for GPS each second
  {
    while (Serial.available())
    {
      char c = Serial.read(); 

      switch(c)         
      {
      case '

It’s wired as written in code :
VCC - Arduino 3.3v
GND - Arduino GND
TXD - Arduino D0

As for the difference with the Mega, I’m happy to learn that the results of the loopback test are normal, but I’m not sure to get it. What do you mean by “communicate directly with the computer over USB” ?:        //data divided by $
        Serial.readBytesUntil(’*’, nmeaSentence, 67);    //Store data in nmeaSentence
        Serial.println(nmeaSentence);
        latitude = parseGprmcLat(nmeaSentence); //Get Latitude
        longitude = parseGprmcLon(nmeaSentence); //Get Longitude
        lndSpeed = parseGprmcSpeed(nmeaSentence); //Get Speed
        gpsTime = parseGprmcTime(nmeaSentence); //Get GPS time

if(latitude > “”)  //Print if not null
        {
          Serial.println("------------------------------------");
          Serial.println("latitude: " + latitude);
        }

if(longitude > “”)    //Print if not null
        {
          Serial.println("longitude: " + longitude);
        }

if(lndSpeed > “”)  //Print if not null
        {
          Serial.println("Speed (knots): " + lndSpeed);
        }

if(gpsTime > “”)    //Print if not null
        {
          Serial.println("gpsTime: " + gpsTime);
          klTime = getklTime(gpsTime);  //KL Time
          Serial.println("klTime: " + klTime);       
        } 
      }
    }
  }
}

String getklTime(String s)
{
  int hour = s.substring(0,2).toInt();
  int minute = s.substring(2,4).toInt();
  int second = s.substring(4,6).toInt();

hour += 8;

if(hour > 24)
    hour -= 24;
  s = String(hour) +":"+String(minute) +":"+ String(second);
  return s;
}

//Parse GPRMC NMEA sentence data from String
//String must be GPRMC or no data will be parsed
//Return Latitude
String parseGprmcLat(String s)
{
  int pLoc = 0; //paramater location pointer
  int lEndLoc = 0; //lat parameter end location
  int dEndLoc = 0; //direction parameter end location
  String lat;
  /*make sure that we are parsing the GPRMC string.
  Found that setting s.substring(0,5) == “GPRMC” caused a FALSE.
  There seemed to be a 0x0D and 0x00 character at the end. */
  if(s.substring(0,4) == “GPRM”)
  {
    for(int i = 0; i < 5; i++)
    {
      if(i < 3)
      {
        pLoc = s.indexOf(’,’, pLoc+1);
      }
      if(i == 3)
      {
        lEndLoc = s.indexOf(’,’, pLoc+1);
        lat = s.substring(pLoc+1, lEndLoc);
      }
      else
      {
        dEndLoc = s.indexOf(’,’, lEndLoc+1);
        lat = lat + " " + s.substring(lEndLoc+1, dEndLoc);
      }
    }
    return lat;
  }
}

//Parse GPRMC NMEA sentence data from String
//String must be GPRMC or no data will be parsed
//Return Longitude
String parseGprmcLon(String s)
{
  int pLoc = 0; //paramater location pointer
  int lEndLoc = 0; //lat parameter end location
  int dEndLoc = 0; //direction parameter end location
  String lon;

/*make sure that we are parsing the GPRMC string.
  Found that setting s.substring(0,5) == “GPRMC” caused a FALSE.
  There seemed to be a 0x0D and 0x00 character at the end. */
  if(s.substring(0,4) == “GPRM”)
  {
    for(int i = 0; i < 7; i++)
    {
      if(i < 5)
      {
        pLoc = s.indexOf(’,’, pLoc+1);
      }
      if(i == 5)
      {
        lEndLoc = s.indexOf(’,’, pLoc+1);
        lon = s.substring(pLoc+1, lEndLoc);
      }
      else
      {
        dEndLoc = s.indexOf(’,’, lEndLoc+1);
        lon = lon + " " + s.substring(lEndLoc+1, dEndLoc);
      }
    }
    return lon;
  }
}

//Parse GPRMC NMEA sentence data from String
//String must be GPRMC or no data will be parsed
//Return Longitude
String parseGprmcSpeed(String s)
{
  int pLoc = 0; //paramater location pointer
  int lEndLoc = 0; //lat parameter end location
  int dEndLoc = 0; //direction parameter end location
  String lndSpeed;

/*make sure that we are parsing the GPRMC string.
  Found that setting s.substring(0,5) == “GPRMC” caused a FALSE.
  There seemed to be a 0x0D and 0x00 character at the end. */
  if(s.substring(0,4) == “GPRM”)
  {
    for(int i = 0; i < 8; i++)
    {
      if(i < 7)
      {
        pLoc = s.indexOf(’,’, pLoc+1);
      }
      else
      {
        lEndLoc = s.indexOf(’,’, pLoc+1);
        lndSpeed = s.substring(pLoc+1, lEndLoc);
      }
    }
    return lndSpeed;
  }
}

//Parse GPRMC NMEA sentence data from String
//String must be GPRMC or no data will be parsed
//Return Longitude
String parseGprmcTime(String s)
{
  int pLoc = 0; //paramater location pointer
  int lEndLoc = 0; //lat parameter end location
  int dEndLoc = 0; //direction parameter end location
  String gpsTime;

/*make sure that we are parsing the GPRMC string.
  Found that setting s.substring(0,5) == “GPRMC” caused a FALSE.
  There seemed to be a 0x0D and 0x00 character at the end. */
  if(s.substring(0,4) == “GPRM”)
  {
    for(int i = 0; i < 2; i++)
    {
      if(i < 1)
      {
        pLoc = s.indexOf(’,’, pLoc+1);
      }
      else
      {
        lEndLoc = s.indexOf(’,’, pLoc+1);
        gpsTime = s.substring(pLoc+1, lEndLoc);
      }
    }
    return gpsTime;
  }
}

// Turn char array into String object
String charToString(char *c)
{

String val = “”;

for(int i = 0; i <= sizeof(c); i++)
  {
    val = val + c[i];
  }

return val;
}


It's wired as written in code :
VCC - Arduino 3.3v
GND - Arduino GND
TXD - Arduino D0

As for the difference with the Mega, I'm happy to learn that the results of the loopback test are normal, but I'm not sure to get it. What do you mean by "communicate directly with the computer over USB" ?

krauthl:
As for the difference with the Mega, I'm happy to learn that the results of the loopback test are normal, but I'm not sure to get it. What do you mean by "communicate directly with the computer over USB" ?

The Arduino Nano 33 BLE handles the Serial by creating a virtual serial connection over USB. For this the Arduino needs to run. You cannot keep the board in reset. When the board is held in reset the USB stack no longer runs and your PC will recognize this and stop the USB driver and therefore the COM port will no longer be available.

You do not need software serial. The board also has a regular hardware serial. It is called Serial1. So, connect your GPS to TX and RX and then use Serial1 for the GPS and Serial for the Serial Monitor.

Thank you very much for the answer ! It wasn't clear enough in my head. I fixed the problem by using Serial1 and Serial as you said