Forum: Mikrocontroller und Digitale Elektronik USART von Microcontroller zu GSM Modul funktioniert nicht


von Sam_Oe1 (Gast)



Lesenswert?

Hallo,

im Bereich Embedded Systems bin ich relativ neu und für ein 
Studienprojekt sollen SMS-Nachrichten mittels einem Microcontroller via 
GSM versendet werden.

Dafür nutze ich einen Nucleo-STM32L476RGT6 Microcontroller und ein 
MIKROE LTE Cat.1 Click Board GSM Modul 
(https://www.mikroe.com/lte-cat1-eu-click-for-europe). Als 
Programmierumgebung nutze ich STM32CubeIDE.

Da GSM Module im Allgemeinen per "AT-Kommandos" kommunizieren, habe ich 
erstmal das GSM Modul per USB angeschlossen und die AT Kommandos über 
ein COM Terminal manuell eingegeben. Es hat funktioniert.

Nun war meine Idee: AT Befehle per HAL_UART_Transmit zu versenden und 
die Rückmeldung vom GSM Modul per HAL_UART_Receive zu empfangen.

Für das Erste möchte ich nur den Befehl "AT" senden um zu testen, ob der 
Befehl überhaupt ankommt und möchte diesen auch per Receive mit "OK" 
empfangen.

Hierfür benutze ich 2 USART's:
- USART2 für die Kommunikation mit dem Terminal (USB), Baudrate: 115200

- USART1 für die Kommunikation mit dem GSM Modul, Baudrate: 9600
   - PA10: USART1_RX
   - PA9:  USART1_TX

Die RX und TX Pins habe ich an die TX und RX Pins des GSM Moduls mit 5v 
und GND angeschlossen (Siehe Bild im Anhang: MC_GSM_Anschluss_UART).

Im Datasheet des Microcontrollers habe ich gelesen, dass die I/O 
Struktur der PA10 und PA9 Pins FT sind, also 5V tolerant. Laut der 
Schematic des GSM Moduls arbeiten die RX und TX Pins auch mit 3V3. Daher 
sollte das eigentlich kein Problem sein (Siehe Anhang).

Jedoch bekomme ich in der Konsole kein"OK" zurück bzw. es kommt gar 
nichts an. Daraus schließe ich, dass der Microcontroller den 
HAL_UART_Transmit(&huart1) Befehl mit "AT"  nicht an das GSM Modul 
übermittelt.

Woran könnte das liegen? Ich habe USART3 auch schon probiert jedoch mit 
dem gleichen Ergebnis.

Langsam weiß ich nicht mehr weiter.. ich bin für jede Hilfe wirklich 
sehr dankbar!

Das main.c Programm habe ich so aufgebaut:
1
/* USER CODE BEGIN Header */
2
/**
3
  ******************************************************************************
4
  * @file           : main.c
5
  * @brief          : Main program body
6
  ******************************************************************************
7
  * @attention
8
  *
9
  * Copyright (c) 2022 STMicroelectronics.
10
  * All rights reserved.
11
  *
12
  * This software is licensed under terms that can be found in the LICENSE file
13
  * in the root directory of this software component.
14
  * If no LICENSE file comes with this software, it is provided AS-IS.
15
  *
16
  ******************************************************************************
17
  */
18
/* USER CODE END Header */
19
/* Includes ------------------------------------------------------------------*/
20
#include "main.h"
21
22
23
/* Private variables ---------------------------------------------------------*/
24
 UART_HandleTypeDef huart1;
25
UART_HandleTypeDef huart2;
26
27
28
29
/* Private function prototypes -----------------------------------------------*/
30
void SystemClock_Config(void);
31
static void MX_GPIO_Init(void);
32
static void MX_USART2_UART_Init(void);
33
static void MX_USART1_UART_Init(void);
34
35
/* Private user code ---------------------------------------------------------*/
36
/* USER CODE BEGIN 0 */
37
char Test[]="AT";
38
char Reply[]="";
39
40
41
  
42
int main(void)
43
{
44
45
46
  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
47
  HAL_Init();
48
  SystemClock_Config();
49
50
 
51
  MX_GPIO_Init();
52
  MX_USART2_UART_Init();
53
  MX_USART1_UART_Init();
54
 
55
  while (1)
56
  {
57
    /* USER CODE END WHILE */
58
    
59
    HAL_UART_Transmit(&huart1,(uint8_t *)"AT",strlen("AT"),1000);     //Send AT Command
60
    HAL_UART_Receive(&huart1,(uint8_t *)Reply,5,1000);        //Receive AT Result 
61
62
    HAL_UART_Transmit(&huart2,(uint8_t *)Reply,strlen(Reply),1000);  //Send Result to Terminal
63
    
64
  }
65
  
66
}
67
68
/**
69
  * @brief System Clock Configuration
70
  * @retval None
71
  */
72
void SystemClock_Config(void)
73
{
74
  RCC_OscInitTypeDef RCC_OscInitStruct = {0};
75
  RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
76
77
  /** Configure the main internal regulator output voltage
78
  */
79
  if (HAL_PWREx_ControlVoltageScaling(PWR_REGULATOR_VOLTAGE_SCALE1) != HAL_OK)
80
  {
81
    Error_Handler();
82
  }
83
84
  /** Initializes the RCC Oscillators according to the specified parameters
85
  * in the RCC_OscInitTypeDef structure.
86
  */
87
  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;
88
  RCC_OscInitStruct.HSIState = RCC_HSI_ON;
89
  RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;
90
  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
91
  RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI;
92
  RCC_OscInitStruct.PLL.PLLM = 1;
93
  RCC_OscInitStruct.PLL.PLLN = 10;
94
  RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV7;
95
  RCC_OscInitStruct.PLL.PLLQ = RCC_PLLQ_DIV2;
96
  RCC_OscInitStruct.PLL.PLLR = RCC_PLLR_DIV2;
97
  if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
98
  {
99
    Error_Handler();
100
  }
101
102
  /** Initializes the CPU, AHB and APB buses clocks
103
  */
104
  RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
105
                              |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
106
  RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
107
  RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
108
  RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;
109
  RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;
110
111
  if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_4) != HAL_OK)
112
  {
113
    Error_Handler();
114
  }
115
}
116
117
/**
118
  * @brief USART1 Initialization Function
119
  * @param None
120
  * @retval None
121
  */
122
static void MX_USART1_UART_Init(void)
123
{
124
125
  /* USER CODE BEGIN USART1_Init 0 */
126
127
  /* USER CODE END USART1_Init 0 */
128
129
  /* USER CODE BEGIN USART1_Init 1 */
130
131
  /* USER CODE END USART1_Init 1 */
132
  huart1.Instance = USART1;
133
  huart1.Init.BaudRate = 9600;
134
  huart1.Init.WordLength = UART_WORDLENGTH_8B;
135
  huart1.Init.StopBits = UART_STOPBITS_1;
136
  huart1.Init.Parity = UART_PARITY_NONE;
137
  huart1.Init.Mode = UART_MODE_TX_RX;
138
  huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;
139
  huart1.Init.OverSampling = UART_OVERSAMPLING_16;
140
  huart1.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE;
141
  huart1.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT;
142
  if (HAL_UART_Init(&huart1) != HAL_OK)
143
  {
144
    Error_Handler();
145
  }
146
  /* USER CODE BEGIN USART1_Init 2 */
147
148
  /* USER CODE END USART1_Init 2 */
149
150
}
151
152
/**
153
  * @brief USART2 Initialization Function
154
  * @param None
155
  * @retval None
156
  */
157
static void MX_USART2_UART_Init(void)
158
{
159
160
  /* USER CODE BEGIN USART2_Init 0 */
161
162
  /* USER CODE END USART2_Init 0 */
163
164
  /* USER CODE BEGIN USART2_Init 1 */
165
166
  /* USER CODE END USART2_Init 1 */
167
  huart2.Instance = USART2;
168
  huart2.Init.BaudRate = 115200;
169
  huart2.Init.WordLength = UART_WORDLENGTH_8B;
170
  huart2.Init.StopBits = UART_STOPBITS_1;
171
  huart2.Init.Parity = UART_PARITY_NONE;
172
  huart2.Init.Mode = UART_MODE_TX_RX;
173
  huart2.Init.HwFlowCtl = UART_HWCONTROL_NONE;
174
  huart2.Init.OverSampling = UART_OVERSAMPLING_16;
175
  huart2.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE;
176
  huart2.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT;
177
  if (HAL_UART_Init(&huart2) != HAL_OK)
178
  {
179
    Error_Handler();
180
  }
181
  /* USER CODE BEGIN USART2_Init 2 */
182
183
  /* USER CODE END USART2_Init 2 */
184
185
}
186
187
/**
188
  * @brief GPIO Initialization Function
189
  * @param None
190
  * @retval None
191
  */
192
static void MX_GPIO_Init(void)
193
{
194
  GPIO_InitTypeDef GPIO_InitStruct = {0};
195
196
  /* GPIO Ports Clock Enable */
197
  __HAL_RCC_GPIOC_CLK_ENABLE();
198
  __HAL_RCC_GPIOH_CLK_ENABLE();
199
  __HAL_RCC_GPIOA_CLK_ENABLE();
200
  __HAL_RCC_GPIOB_CLK_ENABLE();
201
202
  /*Configure GPIO pin Output Level */
203
  HAL_GPIO_WritePin(LD2_GPIO_Port, LD2_Pin, GPIO_PIN_RESET);
204
205
  /*Configure GPIO pin : B1_Pin */
206
  GPIO_InitStruct.Pin = B1_Pin;
207
  GPIO_InitStruct.Mode = GPIO_MODE_IT_FALLING;
208
  GPIO_InitStruct.Pull = GPIO_NOPULL;
209
  HAL_GPIO_Init(B1_GPIO_Port, &GPIO_InitStruct);
210
211
  /*Configure GPIO pin : LD2_Pin */
212
  GPIO_InitStruct.Pin = LD2_Pin;
213
  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
214
  GPIO_InitStruct.Pull = GPIO_NOPULL;
215
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
216
  HAL_GPIO_Init(LD2_GPIO_Port, &GPIO_InitStruct);
217
218
}
219
220
/* USER CODE BEGIN 4 */
221
222
/* USER CODE END 4 */
223
224
/**
225
  * @brief  This function is executed in case of error occurrence.
226
  * @retval None
227
  */
228
void Error_Handler(void)
229
{
230
  /* USER CODE BEGIN Error_Handler_Debug */
231
  /* User can add his own implementation to report the HAL error return state */
232
  __disable_irq();
233
  while (1)
234
  {
235
  }
236
  /* USER CODE END Error_Handler_Debug */
237
}
238
239
#ifdef  USE_FULL_ASSERT
240
/**
241
  * @brief  Reports the name of the source file and the source line number
242
  *         where the assert_param error has occurred.
243
  * @param  file: pointer to the source file name
244
  * @param  line: assert_param error line source number
245
  * @retval None
246
  */
247
void assert_failed(uint8_t *file, uint32_t line)
248
{
249
  /* USER CODE BEGIN 6 */
250
  /* User can add his own implementation to report the file name and line number,
251
     ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */
252
  /* USER CODE END 6 */
253
}
254
#endif /* USE_FULL_ASSERT */

von NichtWichtig (Gast)


Lesenswert?

Schon mal per debugger durch gestept?

von Thomas W. (Gast)


Lesenswert?

Wichtige Regeln - erst lesen, dann posten!

    Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang


Hat schon seinen Grund.

Dieser AT-Kommandos kommen aus der Zeit, als Daten mit Modems verschickt 
wurden. Daher sind einige Sachen etwas archaisch:
- AT oder ATZ sind ueberlicherweise AT\r\n oder ATZ\r\n, Du musst den 
Zeilentrenner mitschicken. Sonst wartet das Modem.

- char Test[]="AT"; ein \0 als String-Trenner waere nicht schlecht.

- Du musst im Endeffekt einen Ringbuffer implementieren. Du koenntest 
mal bei Controllers Tech gucken, wie man das so macht (der Autor hat ein 
Video genau fuer Deinen Fall gemacht).

https://controllerstech.com/ring-buffer-using-head-and-tail-in-stm32/
https://github.com/controllerstech/stm32-uart-ring-buffer

Gruesse

Th.

von DerEgon (Gast)


Lesenswert?

Thomas W. schrieb:
> char Test[]="AT"; ein \0 als String-Trenner waere nicht schlecht.

Das \0 steht da. Das ist implizit, wenn ein char-Array mit einer 
Stringkonstanten initialisiert wird.

sizeof Test ist hier 3, nicht 2.

von Frank K. (fchk)


Lesenswert?

Sam_Oe1 schrieb:

> Dafür nutze ich einen Nucleo-STM32L476RGT6 Microcontroller und ein
> MIKROE LTE Cat.1 Click Board GSM Modul
> (https://www.mikroe.com/lte-cat1-eu-click-for-europe). Als
> Programmierumgebung nutze ich STM32CubeIDE.

Erster Haken: Diese Module können kurzzeitig (innerhalb einiger ms) 
einige Ampere ziehen. Wenn die die nicht bekommen, dann geht entweder 
gar nichts oder manchmal nichts oder oder oder. Ich weiß nicht ganz, ob 
Dein Nucleo-Board diese Anforderung erfüllt. Dass da ein passender 
Steckplatz drauf ist, sagt erstmal überhaupt nichts aus.

Schritt 1 ist also die Stromversorgung. Ohne die geht gar nichts.

> Nun war meine Idee: AT Befehle per HAL_UART_Transmit zu versenden und
> die Rückmeldung vom GSM Modul per HAL_UART_Receive zu empfangen.

sollte funktionieren.

> Hierfür benutze ich 2 USART's:
> - USART2 für die Kommunikation mit dem Terminal (USB), Baudrate: 115200
>
> - USART1 für die Kommunikation mit dem GSM Modul, Baudrate: 9600
>    - PA10: USART1_RX
>    - PA9:  USART1_TX

Hier darfst/solltest Du die Baudrate auch auf 115200 setzen.

> Jedoch bekomme ich in der Konsole kein"OK" zurück bzw. es kommt gar
> nichts an. Daraus schließe ich, dass der Microcontroller den
> HAL_UART_Transmit(&huart1) Befehl mit "AT"  nicht an das GSM Modul
> übermittelt.

Diese Schlussfolgerung ist möglicherweise falsch. Besorge Dir einen 
Logicanalyzer. Suche bei Amazon nach "logic analyzer 24mhz 8ch" und nimm 
irgendeinen davon. Das sind alles Nachbauten von einem 
Originalhersteller. Preis so zwischen 10 und 15€. Damit kannst Du dann 
nachschauen, was wirklich auf dem seriellen Bus abgeht. Die Software 
decodiert Dir auch die Bytes usw. Dieses kleine Teil ist ein Must-Have 
für Dich.

Schritt 3: Nimm als Gegenstelle einen PC mit USB-UART Interface. Da 
weißt Du, dass das funktioniert. Schau, dass Deine Hardware funktioniert 
und Du Bytes senden und empfangen kannst und dass die auch tatsächlich 
auf dem Logic Analyzer auftauchen.

Schritt 4: Jetzt erst kommt das Modem ins Spiel.

Anmerkung: AT-Befehle fangen immer mit "AT" oder "at" an und enden 
grundsätzlich mit einem CR ('\r', Character Code dezimal 13 = hex 0x0d). 
Ohne das '\r' bekommst Du kein OK.

fchk

von Harry L. (mysth)


Lesenswert?

Bei deinem AT-String fehlt das CR am Ende.
Bei Receive blockierend zu warten bis 5 Zeichen eingetroffen sind, ist 
auch keine besonders gute Idee.

von Volker B. (Firma: L-E-A) (vobs)


Lesenswert?

Harry L. schrieb:

> Bei Receive blockierend zu warten bis 5 Zeichen eingetroffen sind, ist
> auch keine besonders gute Idee.

Vor allem, wenn die genutzte Puffer-Variable Reply[] nur Platz für 1 
Byte hat.
Zitat:
1
char Reply[]="";

Grüßle
Volker

: Bearbeitet durch User
von Helmut -. (dc3yc)


Lesenswert?

Du kannst auch erst mal einen Loopback-Test machen, indem du Sender und 
Empfänger des Nucleos kurzschließt und schaust, ob deine gesendeten 
Zeichen wieder rückgelesen werden.

von Samet Ö. (sam_oe1)


Lesenswert?

Vielen Dank für die Antwort.

Bezüglich der Stromversorgung: Sobald ich den Microcontroller an das 
Breadboard mit 5V und GND und das GSM Modul an das Breadboard 
anschließe, leuchten am Modul 2 LED's (PWI und PWR). Kann ich daraus 
schließen, dass die Stromversorgung soweit passt?

> Hier darfst/solltest Du die Baudrate auch auf 115200 setzen.
>
Die Baudrate habe ich soweit angepasst.

> Suche bei Amazon nach "logic analyzer 24mhz 8ch" und nimm
> irgendeinen davon.
>
Sehr guter Hinweis, werde ich mir gleich bestellen.

> Schritt 3: Nimm als Gegenstelle einen PC mit USB-UART Interface. Da
> weißt Du, dass das funktioniert. Schau, dass Deine Hardware funktioniert
> und Du Bytes senden und empfangen kannst und dass die auch tatsächlich
> auf dem Logic Analyzer auftauchen.

Ich habe HAL_UART_Transmit(&huart2, XX) mit "TEST\r\n" in der IDE 
getestet und ich empfange ein "TEST" im Terminal.
Zusätzlich habe ich das GSM Modul über USB angeschlossen und "AT" 
manuell über die PuTTY (COM5) Konsole eingegeben. Ich bekomme ein "OK" 
zurück.

> Anmerkung: AT-Befehle fangen immer mit "AT" oder "at" an und enden
> grundsätzlich mit einem CR ('\r', Character Code dezimal 13 = hex 0x0d).
> Ohne das '\r' bekommst Du kein OK.

Ich habe es mit "AT\r\n" probiert, leider ohne Erfolg.

Grüße
Sam_oe1

von Samet Ö. (sam_oe1)


Lesenswert?

Danke für die Antwort!

Thomas W. schrieb:
> - Du musst im Endeffekt einen Ringbuffer implementieren. Du koenntest
> mal bei Controllers Tech gucken, wie man das so macht (der Autor hat ein
> Video genau fuer Deinen Fall gemacht).
>
> https://controllerstech.com/ring-buffer-using-head-and-tail-in-stm32/
> https://github.com/controllerstech/stm32-uart-ring-buffer

Das mit dem Ringbuffer werde ich gleich testen.

Grüße
Sam_oe1

von Frank K. (fchk)


Lesenswert?

Samet Ö. schrieb:

> Bezüglich der Stromversorgung: Sobald ich den Microcontroller an das
> Breadboard mit 5V und GND und das GSM Modul an das Breadboard
> anschließe, leuchten am Modul 2 LED's (PWI und PWR). Kann ich daraus
> schließen, dass die Stromversorgung soweit passt?

Nein, das sagt gar nichts aus.

Hier ist das Hardware-Datenblatt für das nackte Modul.
https://cdn.papouch.com/data/user-content/products/gsm-els61-e2n/els61-e_hid_v01.000.pdf

Das Modul will kurzzeitig 2.3A sehen, wenn es sendet. Dafür musst Du 
direkt an den Versorgungspins Kondensatoren als Puffer plazieren, 
mindestens einen keramischen mit 4.7 bis 10uF (gerne mehrere kleinere 
anstelle eines großen) und 16V Nennspannung und einen Tantal mit 
220uF/10V. Das Netzteil sollte also 3A nur für das Modul sicher liefern 
können.

Nachprüfen mit Oszi gemäß Hardwarebeschreibung.

> Ich habe HAL_UART_Transmit(&huart2, XX) mit "TEST\r\n" in der IDE
> getestet und ich empfange ein "TEST" im Terminal.

Und die Gegenrichtung geht auch?

> Zusätzlich habe ich das GSM Modul über USB angeschlossen und "AT"
> manuell über die PuTTY (COM5) Konsole eingegeben. Ich bekomme ein "OK"
> zurück.
ok, das sagt jetzt nichts aus.

>> Anmerkung: AT-Befehle fangen immer mit "AT" oder "at" an und enden
>> grundsätzlich mit einem CR ('\r', Character Code dezimal 13 = hex 0x0d).
>> Ohne das '\r' bekommst Du kein OK.
>
> Ich habe es mit "AT\r\n" probiert, leider ohne Erfolg.

Dann liegt es daran nicht.

fchk

von Samet Ö. (sam_oe1)


Lesenswert?

Samet Ö. schrieb:
> Danke für die Antwort!
>
> Thomas W. schrieb:
>> - Du musst im Endeffekt einen Ringbuffer implementieren. Du koenntest
>> mal bei Controllers Tech gucken, wie man das so macht (der Autor hat ein
>> Video genau fuer Deinen Fall gemacht).
>>
>> https://controllerstech.com/ring-buffer-using-head-and-tail-in-stm32/
>> https://github.com/controllerstech/stm32-uart-ring-buffer
>
> Das mit dem Ringbuffer werde ich gleich testen.
>
> Grüße
> Sam_oe1

Ich habe das Beispiel mit dem Ringbuffer getestet und es hat nicht 
funktioniert. Bei diesem Projekt wird nur ein UART Anschluss verwendet 
bzw. eine Kommunikation mit einem zweiten Modul findet hier nicht statt.

Zudem werden die Zeichen über die Tastatur am COM Terminal eingegeben. 
Ich möchte diese Zeichen per HAL_UART_Transmit automatisiert übertragen. 
Im Programm gab es zusätzlich Komplikationen bezüglich den zwei UARTs. 
Mein Professor meinte ein Ringbuffer wäre in diesem Fall nicht 
notwendig.

Ich werde es weiter probieren. Notfalls werde ich versuchen das GSM 
Modul via I2C oder SPI anzuschließen.

Dennoch danke für die Hilfe.

von Stefan F. (Gast)


Lesenswert?

Samet Ö. schrieb:
> Kann ich daraus schließen, dass die Stromversorgung soweit passt?

Das sollte in der Anleitung des Moduls stehen. Wenn du keine hast, frage 
den Händler. Es ist nicht unser Job, die Arbeit des Händler zu 
erledigen. Schließlich ist er derjenige, der den Gewinn kassiert.

Besorge dir wie gesagt einen Logic Analyzer, mit dem kannst du die 
serielle Kommunikation analysieren.

Laut Beschreibung unterstützt das Modul Handshake Leitungen an zwei 
seriellen ports, welche per AT Befehl konfiguriert werden müssen. Hast 
du das gemacht? Wenn dabei die Handshake Leitungen aktiviert wurden, 
muss man sie auch passend ansteuern.

Es wäre aber auch durchaus vorstellbar, dass die aktuell installierte 
Firmware nur den USB Port unterstützt. Ich hatte mal Bluetooth Module 
die hatten ebenfalls viele Schnittstellen, aber nur eine davon konnte 
mit der Firmware genutzt werden.

Du brauchst die Bedienungsanleitung von genau der Firmware, die sich in 
dem Modul befindet.

von Samet Ö. (sam_oe1)



Lesenswert?

Hallo,

vielen Dank für die vielen Antworten. Ich habe es hinbekommen. Am GSM 
Modul hat nur das USB-Kabel gefehlt. D.h. ich musste sowohl die RX, TX, 
5V und GND Pins als auch das USB Kabel für die externe Stromversorgung 
an einem zweiten USB-Port anschließen.

Nun funktioniert die Kommunikation des Microcontrollers mit dem GSM 
Modul über
1
HAL_UART_Transmit(&huart1,(uint8_t *)"AT\r\n",strlen("AT\r\n"),1000);
.
Das "OK" Signal empfange ich mit
1
HAL_UART_Receive(&huart1,(uint8_t *)Reply,sizeof(Reply),1000);
 und gebe es am Terminal aus mit
1
HAL_UART_Transmit(&huart2,(uint8_t *)Reply,sizeof(Reply),1000);
.

Vielen Dank für die Hilfe!

Grüße
Sam_oe1

von Stefan F. (Gast)


Lesenswert?

Samet Ö. schrieb:
> D.h. ich musste sowohl die RX, TX,
> 5V und GND Pins als auch das USB Kabel für die externe Stromversorgung
> an einem zweiten USB-Port anschließen.

Na ob da alles mit rechten Dinge zugeht? Ich meine, das sollte auch ohne 
USB Verbindung funktionieren, wie bei allen anderen Modulen auch.

Ein kleiner Tipp zum Programmierstil:
1
HAL_UART_Transmit(&huart1,(uint8_t *)"AT\r\n",strlen("AT\r\n"),1000);

Das ist ziemlich fehlerträchtig, wenn du später mal den String änderst. 
Außerdem ist strlen() eine Funktion die zur Laufzeit ausgeführt wird. Da 
die Länge des String aber unveränderlich ist, vergeudest du damit 
unfassbar viel Rechenleistung die das Klima kaputt macht und uns alle in 
den Weltuntergang reißt.

Vorschlag:
1
const char[] command_at="AT\r\n";
2
HAL_UART_Transmit(&huart1,(uint8_t *)command_at,sizeof(command_at),1000);

von STK500-Besitzer (Gast)


Lesenswert?

Stefan ⛄ F. schrieb:
> Vorschlag:
1
 const char[] command_at="AT\r\n";
2
 HAL_UART_Transmit(&huart1,(uint8_t *)command_at,sizeof(command_at)-1,1000);

strlen zählt die Zeichen im String, aber nicht das Endezeichen.
sizof liefert die komplette Arraylänge inkl. Endezeichen.

von Stefan F. (Gast)


Lesenswert?

STK500-Besitzer schrieb:
> strlen zählt die Zeichen im String, aber nicht das Endezeichen.
> sizof liefert die komplette Arraylänge inkl. Endezeichen.

Ja stimmt. Danke für die Korrektur

von avr (Gast)


Lesenswert?

Und abgesehen davon ist es schlechter Stil an den Stellen sizeof 
einzusetzen, nicht umgekehrt. strlen wird genau an diesen Stellen zur 
Compilezeit ausgewertet. Wenn man nicht zu 100% weiß was man tut, sollte 
man immer die leserliche Variante bevorzugen.

Also bitte nicht mit sizeof-1 Konstrukten anfangen.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.