# SIM800 GSM module understanding the commands help

#### zazas321

Joined Nov 29, 2015
926
Hey. I am using TinyGSM library to perform OTA firmware update for my ESP32 device using GSM. I have got it to work but I still have some questions that I want to understand.

I am using debugging mode which allows me to check all executed AT commands and the responses I get. I have gone through each AT command one by one and I feel like most of the commands are not necessary. I am hoping that someone who knows more about GSM modules ( SIM800L in particular because thats the one I am using) will be able to comment a little bit and help me figure out why does this library use so many commands.

I am also including a word document which contains all the AT commands used in this program. I really cant grasp my does it require so many AT commands to perform this simple task.

#### Attachments

• 15.6 KB Views: 0
Last edited:

#### zazas321

Joined Nov 29, 2015
926
I am not able to add my arduino code for some reason. The forum does not allow pasting code within code tags and also it does not allow to attach .ino file.

#### Ya’akov

Joined Jan 27, 2019
6,279
The initialization of the modem is to ensure it is in a known state before using it. The library is being conservative and not assuming the modem is in the expected configuration.

#### zazas321

Joined Nov 29, 2015
926
Since I cannot understand the reason why most functions are being used in that library. I am developing my own GSM setup function:
Code:
void custom_modem_startup(){
uint8_t res=0;
Serial.println("Sending AT command to test the module");
modem.sendAT(GF(""));
modem.waitResponse();
Serial.println("Setting up module in normal working mode");
modem.sendAT(GF("+CFUN=1,1"));
modem.waitResponse(20000L);
delay(3000);

Serial.println("test AT command after restart");
// this will keep sending AT commands until it receives a good response. It may not response at first attempt because CFUN command restart the modem
modem.sendAT(GF(""));
res = modem.waitResponse(10000L);
while(!res){
modem.sendAT(GF(""));
res = modem.waitResponse(10000L);
delay(1000);
}

Serial.println("setting up time stamp");
modem.sendAT(GF("+CLTS=1"));
modem.waitResponse(10000L);

Serial.println("testing AT command one last time to make sure all OK");
modem.sendAT(GF(""));
modem.waitResponse();
}
My custom GSM setup will execute following commands:
1. AT
2.AT+CFUN=1,1
3.AT+CLTS=1

I dont see why I would need anything else

whereas the library executes:
• AT
• AT&W (not sure what this command does)
• AT+CFUN=0 why use this funciton if the following command sets the mode
• AT+CFUN=1,1 (set phone functionality to full)
• AT (at test)
• ATE0 (turn of at command echo)
• AT+CMEE=0 dont understand what this command does
• AT+CLTS=1 (turn on local timestamp)
• AT+CPIN? dont need this command for my application because I dont use password

Perhaps someone has an idea whether there will be any difference between my setup and tinygsm library setup

#### Ya’akov

Joined Jan 27, 2019
6,279
You seem to be doing things backwards. While it is possible that some of the setup is not needed, since you say, explicitly, you don’t understand why what appear to be redundant commands are being set, shouldn’t you leave them until such time as you know?

Many of these things are empirical. Through use people add things to deal with idiosyncratic behavior. It may well be, for example, setting CFUN to 0 is a way of clearing the setting to ensure the following setting to 1,1 is successful. If these things were done as bug fixes, how will you properly test that removing them doesn’t cause some boundary condition failure.

Something works, you don’t know why it’s done that way, so you want to change it because you can’t understand it? This just goes against all my experience. I’d certainly advise against fixing something that isn’t broken.

#### zazas321

Joined Nov 29, 2015
926
From my experience, using a code that you cannot fully understand can bring a lot of problems in the future. I would not worry too much if that was my little hobby project but that is not the case for this project. For example if you encounter a problem, you may not even know where to look for an error because you simply dont understand whet the code does. I need to know exactly what each command does and how it affects the modem before I am confident enough to put this code for production.

While the setup function may be fine, the part where it is setting up gprs for the tcp connection confuses my even more.

I am reading SIM800L module datasheet where it explains how to make a tcp connection ( starting at page 6 )

And the explained procedure in the datasheet is quite a bit different compared to what the library is doing. That concerns me the most.

#### Ya’akov

Joined Jan 27, 2019
6,279
But you are using code you can't understand. Modifying it to code you also don't understand doesn't make it better.

Contact the library author, find a product specific forum, research the issue further—but cut out what you don't understand because you don't know why it is there? This is odd.

You might be right, it could be cruft or the result of previous cargo cult programming. It could be remnants of workarounds that are no longer needed, or, it could be stuff that was added as boundary condition failures occurred.

Your principle is correct, but can you find any indication the library is not reliable? If you don't understand it why would you think you are qualified to refactor it?

#### zazas321

Joined Nov 29, 2015
926
I will keep learning more about the GSM module and use the library code for now since it seems to be working fine. The issue with the library is that the community has been very silent for the last couple of months. No new issues being solved on github as well as no one is chatting on gitter from what I have seen.

#### Ya’akov

Joined Jan 27, 2019
6,279
I will keep learning more about the GSM module and use the library code for now since it seems to be working fine. The issue with the library is that the community has been very silent for the last couple of months. No new issues being solved on github as well as no one is chatting on gitter from what I have seen.
I'd just be careful about ripping things out you don't understand. Unless you can find some evidence the library is flaky or poorly written, I would work from the assumption it was put there for a reason.

#### Ya’akov

Joined Jan 27, 2019
6,279
I don't know if you've seen this, but this article claims to provide a barebones initialization for GPRS use:

https://exploreembedded.com/wiki/Setting_up_GPRS_with_SIM800L

It makes sense, but it is exactly because the widely used library does so many additional and apparently contradictory things that I am concerned they were added empirically for some reason.

On the other hand, it could be a poorly written library, but it is so widely used it seems it would have been fixed by now.