Skip to main content
Associate III
January 23, 2025
Solved

Getting AT commands in Configured mobile number

  • January 23, 2025
  • 2 replies
  • 3617 views

Hi,

I'm using STM32H745ZI for 4G LTE Communication Quectel EC200U-CN to transmit message using UART in Asynchronous mode, if I send continuous message then I'm getting this ................

AT
AT+CPIN?
AT+CMGF=1
AT+CMGD=1,4
AT+CSCS="GSM"
AT+CSCA="919849087001",145
ATE0
AT+CPIN?
AT+CMGS="+917981134448"
Hello from GSM!!

 

int main()

{

/*All initialize of UART and stuff*/

send4GSMS("Hello from GSM!!");

}



void send4GSMS(uint8_t *string)
{
//Enter CTRL+Z after sending the data, then the message will be sent
unsigned char asciiValue = 0x1A;

//Command to send a short message from TE to network
 uint8_t sendMsg[30] = "AT+CMGS=\"+917981134448\""; //Configured mobile number
//sends the message from TE to network
sendATCommand(sendMsg);
LL_mDelay(1);

// Send the data
while (*string != '\0') {
// Transmit one character at a time
LL_USART_TransmitData8(USART3, *string++);
// Wait until transmit is complete
while (!LL_USART_IsActiveFlag_TC(USART3));
// Clear the TC flag for the next byte transmission
LL_USART_ClearFlag_TC(USART3);
}
// Send carriage return and line feed
LL_USART_TransmitData8(USART3, CR);
while (!LL_USART_IsActiveFlag_TC(USART3));
LL_USART_TransmitData8(USART3, LF);
while (!LL_USART_IsActiveFlag_TC(USART3));
LL_USART_TransmitData8(USART3, asciiValue);
while (!LL_USART_IsActiveFlag_TC(USART3));

LL_mDelay(10);
}

void MX_USART3_UART_Init(void)
{
LL_USART_InitTypeDef USART_InitStruct = { 0 };
LL_GPIO_InitTypeDef GPIO_InitStruct = { 0 };

LL_RCC_SetUSARTClockSource(LL_RCC_USART234578_CLKSOURCE_PCLK1);

/* Peripheral clock enable */
LL_APB1_GRP1_EnableClock(LL_APB1_GRP1_PERIPH_USART3);

LL_AHB4_GRP1_EnableClock(LL_AHB4_GRP1_PERIPH_GPIOD);
/**USART3 GPIO Configuration
PD8 ------> USART3_TX
PD9 ------> USART3_RX
*/
GPIO_InitStruct.Pin = LL_GPIO_PIN_8 | LL_GPIO_PIN_9;
GPIO_InitStruct.Mode = LL_GPIO_MODE_ALTERNATE;
GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_LOW;
GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_PUSHPULL;
GPIO_InitStruct.Pull = LL_GPIO_PULL_NO;
GPIO_InitStruct.Alternate = LL_GPIO_AF_7;
LL_GPIO_Init(GPIOD, &GPIO_InitStruct);

/* USART3 interrupt Init */
NVIC_SetPriority(USART3_IRQn,
NVIC_EncodePriority(NVIC_GetPriorityGrouping(), 0, 0));
NVIC_EnableIRQ(USART3_IRQn);

USART_InitStruct.PrescalerValue = LL_USART_PRESCALER_DIV1;
USART_InitStruct.BaudRate = 115200;
USART_InitStruct.DataWidth = LL_USART_DATAWIDTH_8B;
USART_InitStruct.StopBits = LL_USART_STOPBITS_1;
USART_InitStruct.Parity = LL_USART_PARITY_NONE;
USART_InitStruct.TransferDirection = LL_USART_DIRECTION_TX_RX;
USART_InitStruct.HardwareFlowControl = LL_USART_HWCONTROL_NONE;
USART_InitStruct.OverSampling = LL_USART_OVERSAMPLING_16;
LL_USART_Init(USART3, &USART_InitStruct);

// USART3->BRR = 0x35B;

LL_USART_SetTXFIFOThreshold(USART3, LL_USART_FIFOTHRESHOLD_1_8);
LL_USART_SetRXFIFOThreshold(USART3, LL_USART_FIFOTHRESHOLD_1_8);
LL_USART_DisableFIFO(USART3);
LL_USART_ConfigAsyncMode(USART3);

LL_USART_Enable(USART3);
/* Polling USART3 initialisation */
while ((!(LL_USART_IsActiveFlag_TEACK(USART3)))
|| (!(LL_USART_IsActiveFlag_REACK(USART3)))) {
}
/* Initializing the USART3 Receive Interrupt */
LL_USART_ReceiveData8(USART3);
LL_USART_EnableIT_RXNE_RXFNE(USART3);
}

void sendATCommand(const uint8_t *command)
{
// Clearing the rxBuffer before sending a new command
//(void) memset(&uart3_Buf, 0, sizeof(uart3_Buf));

// Send the command
while (*command != '\0') {
// Transmit one character at a time
LL_USART_TransmitData8(USART3, *command++);
// Wait until transmit is complete
while (!LL_USART_IsActiveFlag_TC(USART3));
// Clear the TC flag for the next byte transmission
LL_USART_ClearFlag_TC(USART3);
}

// Send carriage return and line feed
LL_USART_TransmitData8(USART3, CR);
while (!LL_USART_IsActiveFlag_TC(USART3));
LL_USART_TransmitData8(USART3, LF);
while (!LL_USART_IsActiveFlag_TC(USART3));

LL_mDelay(1);
}
Best answer by Andrew Neil

@Lucifer37 wrote:

It would be difficult to segregate those stuff


It shouldn't be - they all follow the basic AT Command protocol.

See the Quectel documentation for specific details.

V.250 is the ITU standard which formalises the so-call "AT Command " structure.

 

See: https://www.avrfreaks.net/s/topic/a5C3l000000UYptEAG/t147703?comment=P-1410250

and: https://www.avrfreaks.net/s/topic/a5C3l000000UYptEAG/t147703?comment=P-1410258

and: https://www.avrfreaks.net/s/topic/a5C3l000000UYptEAG/t147703?comment=P-1410260 

 


@Lucifer37 wrote:

any function or method to do so


The AT Command interface can work in a number of states (Interactive commands, Connected, etc) - so a State Machine would probably be a good approach...

 

2 replies

mƎALLEm
Technical Moderator
January 23, 2025

Hello,

This is not a STM32 question but it's related to the module you are using and the issue is not clear.

What do you mean by:


@Lucifer37 wrote:

if I send continuous message then I'm getting this ................

AT
AT+CPIN?
AT+CMGF=1
AT+CMGD=1,4
AT+CSCS="GSM"
AT+CSCA="919849087001",145
ATE0
AT+CPIN?
AT+CMGS="+917981134448"
Hello from GSM!!

 

What do you mean by "this"? the text in bold? is it an AT answer from the 4G modem?

"To give better visibility on the answered topics, please click on ""Accept as Solution"" on the reply which solved your issue or answered your question."
Andrew Neil
Super User
January 23, 2025

@Lucifer37 wrote:

if I send continuous message


What do you mean by that?

You should never just send continuous AT commands - you must always wait for the reply to one command before sending the next.

 


@Lucifer37 wrote:

I'm using STM32H745ZI for 4G LTE Communication Quectel EC200U-CN

Please show your schematic.

See: How to write your question to maximize your chances to find a solution

A complex system that works is invariably found to have evolved from a simple system that worked.A complex system designed from scratch never works and cannot be patched up to make it work.
mƎALLEm
Technical Moderator
January 23, 2025

@Andrew Neil wrote:
you must always wait for the reply to one command before sending the next.

Indeed.

"To give better visibility on the answered topics, please click on ""Accept as Solution"" on the reply which solved your issue or answered your question."