this post was submitted on 04 Nov 2025
17 points (100.0% liked)

Ask Electronics

3879 readers
20 users here now

For questions about component-level electronic circuits, tools and equipment.

Rules

1: Be nice.

2: Be on-topic (eg: Electronic, not electrical).

3: No commercial stuff, buying, selling or valuations.

4: Be safe.


founded 2 years ago
MODERATORS
 

So I am working on an Arduino project and have trouble communicating over UART.

I have a SIM7600G-H 4G Module from Waveshare and hooked it up to an Arduino Nano ESP32. The connections are as follows:

SIM7600<->Nano ESP32

TXD<->RX0

RXD<->TX0

VIN<->VUSB

GND<->GND

CTS<->D3

RTS<->D12

It mostly works, I can send AT commands and receive responds. However sometimes I only receive parts and chunks are missing or being send to the next command. I strongly suspect RSPs ("unsolicited result code") to be the reason behind it. As documented in the manual RSPs are being send without an implicit action and happens for example if the module receives a call or SMS.

I have read about hardware flow control which seems to theoretically solve the problem of those module talking over each other and have connected the CTS and RTS pins to generic digital pins. According the manual the SIM Module it has hardware flow control enabled as an default.

On the Arduino side of things I have added these lines in hopes of enabling it, however I do not see a change, they do not return any error but I still see data missing. I have also tried swapping CTS and RTS just for fun, but without any luck.

Serial0.setPins(-1,-1,12,3);
Serial0.setHwFlowCtrlMode(UART_HW_FLOWCTRL_CTS_RTS);

Here are the logs which shows some responds being cut off.

20:57:47.991 -> Send AT command: AT
20:57:47.991 -> Response: AT
20:57:47.991 -> OK
20:57:47.991 -> 
20:57:47.992 -> Send AT command: AT+CPIN=1234
20:57:47.992 -> Response: AT+CPIN=1234      <- This responds ending is cut off
20:57:47.992 -> Send AT command: AT+CSQ
20:57:48.025 -> Response:                    <- This responds start is cut off
20:57:48.025 -> OK
20:57:48.025 -> 
20:57:48.025 -> Send AT command: AT+CREG=1
20:57:48.059 -> Response: AT+CREG=1
20:57:48.059 -> OK
20:57:48.059 -> 

And this is my function to send those commands.

char* SIMClass::send(const char* command) {
  // Clear buffer
  while (Serial0.available() > 0) Serial0.read();
  Serial.print("Send AT command: ");
  Serial.println(command);

  unsigned long timeout = millis() + 10000;
  char* response = (char*)malloc(1024 * sizeof(char));
  uint16_t index = 0;

  Serial0.print(command);
  Serial0.print("\r");


  while (Serial0.available() == 0) {
    if (millis() > timeout) {
      response[index] = '\0';
      return response;
    }
  }

  while (Serial0.available() > 0) {
    response[index++] = Serial0.read();
    timeout = millis() + 1000;
  }
  response[index] = '\0';
  Serial.print("Response: ");
  Serial.println(response);
  return response;
}

After enabling hardware flow control unsing Serial0.setHwFlowCtrlMode(UART_HW_FLOWCTRL_CTS_RTS) I expected Serial0.print(message) to wait until the SIM module is not busy and vice versa. Am I wrong in that assumption? Am I missing something else or is it maybe recommend to implement the hardware flow yourself?

you are viewing a single comment's thread
view the rest of the comments
[–] j4k3@lemmy.world 1 points 2 days ago

This is the one you want with 16 channels