Forum: Mikrocontroller und Digitale Elektronik STM32WBA55 - BLE_p2pServer - Wie kann ich Daten an die UART weiterleiten?


von M. G. (ixil96)


Lesenswert?

Ich verwende das BLE_p2pServer Beispiel als Grundlage und möchte die 
übertragenen Daten direkt an die UART1 Schnittstelle weiterleiten. Meine 
Idee wäre hier (in p2p_server_app.c) eine HAL_UART_Transmit_DMA() 
Funktion zu verwenden, allerdings scheitere ich beim Zugriff auf die 
Daten aufgrund einer fehlerhaften Typkonvertierung.
1
case P2P_SERVER_LED_C_WRITE_NO_RESP_EVT:
2
      /* USER CODE BEGIN Service1Char1_WRITE_NO_RESP_EVT */
3
      if(p_Notification->DataTransfered.p_Payload[1] == 0x01)
4
      {
5
      // HAL_UART_Transmit_DMA(huart, pData, Size);...Hier sollen Daten weitergeleitet werden
6
        BSP_LED_On(LED_BLUE);
7
        LOG_INFO_APP("-- P2P APPLICATION SERVER : LED1 ON\n"); 
8
        P2P_SERVER_APP_Context.LedControl.Led1 = 0x01; /* LED1 ON */
9
      }
10
      if(p_Notification->DataTransfered.p_Payload[1] == 0x00)
11
      {
12
        BSP_LED_Off(LED_BLUE);
13
        LOG_INFO_APP("-- P2P APPLICATION SERVER : LED1 OFF\n"); 
14
        P2P_SERVER_APP_Context.LedControl.Led1 = 0x00; /* LED1 OFF */
15
      }
16
      /* USER CODE END Service1Char1_WRITE_NO_RESP_EVT */
17
      break;
Die Typdefinitionen befinden sich in p2p_server.h:
1
typedef struct
2
{
3
  uint8_t *p_Payload;
4
  uint8_t Length;
5
} P2P_SERVER_Data_t;
6
7
typedef struct
8
{
9
  P2P_SERVER_OpcodeEvt_t       EvtOpcode;
10
  P2P_SERVER_Data_t             DataTransfered;
11
  uint16_t                ConnectionHandle;
12
  uint16_t                AttributeHandle;
13
  uint8_t                 ServiceInstance;
14
} P2P_SERVER_NotificationEvt_t;
Kann mir jemand weiter helfen?

: Verschoben durch Moderator
von Harald K. (kirnbichler)


Lesenswert?

M. G. schrieb:
> allerdings scheitere ich beim Zugriff auf die
> Daten aufgrund einer fehlerhaften Typkonvertierung.

Welche Daten willst Du denn übertragen? Das, was in p_Payload drinsteht?

Oder nur einen Teil davon?

Wo ist Deine "fehlerhafte Typkonvertierung"?

Nachtrag:

Du hast den falschen Forenbereich ausgesucht, um Deine Frage zu 
stellen.

: Bearbeitet durch User
von M. G. (ixil96)


Lesenswert?

Ich habe es jetzt mal so hin bekommen dass ich Daten mittels 
APP_DBG_MSG("...") an die UART1 übertragen kann.

Die Übertragung mittels HAL_UART_Transmit_DMA() funktioniert hier aber 
nicht.
1
void P2P_SERVER_Notification(P2P_SERVER_NotificationEvt_t *p_Notification)
2
{
3
  /* USER CODE BEGIN Service1_Notification_1 */
4
5
  /* USER CODE END Service1_Notification_1 */
6
  switch(p_Notification->EvtOpcode)
7
  {
8
    /* USER CODE BEGIN Service1_Notification_Service1_EvtOpcode */
9
  uint8_t myData = 0;
10
  uint8_t myBuffer[1];
11
    /* USER CODE END Service1_Notification_Service1_EvtOpcode */
12
13
    case P2P_SERVER_LED_C_READ_EVT:
14
      /* USER CODE BEGIN Service1Char1_READ_EVT */
15
16
      /* USER CODE END Service1Char1_READ_EVT */
17
      break;
18
19
    case P2P_SERVER_LED_C_WRITE_NO_RESP_EVT:
20
      /* USER CODE BEGIN Service1Char1_WRITE_NO_RESP_EVT */
21
      if(p_Notification->DataTransfered.p_Payload[1] == 0x01)
22
      {
23
      myData = p_Notification->DataTransfered.p_Payload[1];   // store the 2nd byte of p_Payload in myData
24
      myBuffer[0] = myData;
25
26
      if(HAL_UART_Transmit_DMA(&huart1, myBuffer, sizeof(myBuffer)) == HAL_OK)
27
      {
28
        APP_DBG_MSG("-- HAL_UART_Transmit_DMA OK");   // this line will never be executed
29
      }
30
31
      APP_DBG_MSG("-- value of myData = 0x%x\n",myData);
32
33
        BSP_LED_On(LED_BLUE);
34
        LOG_INFO_APP("-- P2P APPLICATION SERVER : LED1 ON\n");
35
        P2P_SERVER_APP_Context.LedControl.Led1 = 0x01; /* LED1 ON */
36
      }
37
      if(p_Notification->DataTransfered.p_Payload[1] == 0x00)
38
      {
39
        myData = p_Notification->DataTransfered.p_Payload[1];   // store the 2nd byte of p_Payload in myData
40
        myBuffer[0] = myData;
41
42
      APP_DBG_MSG("-- value of myData = 0x%x\n",myData);
43
        BSP_LED_Off(LED_BLUE);
44
        LOG_INFO_APP("-- P2P APPLICATION SERVER : LED1 OFF\n"); 
45
        P2P_SERVER_APP_Context.LedControl.Led1 = 0x00; /* LED1 OFF */
46
      }
47
      /* USER CODE END Service1Char1_WRITE_NO_RESP_EVT */
48
      break;
49
50
    case P2P_SERVER_SWITCH_C_NOTIFY_ENABLED_EVT:
51
      /* USER CODE BEGIN Service1Char2_NOTIFY_ENABLED_EVT */
52
      P2P_SERVER_APP_Context.Switch_c_Notification_Status = Switch_c_NOTIFICATION_ON;
53
      LOG_INFO_APP("-- P2P APPLICATION SERVER : NOTIFICATION ENABLED\n"); 
54
      LOG_INFO_APP(" \n\r");
55
      /* USER CODE END Service1Char2_NOTIFY_ENABLED_EVT */
56
      break;
57
58
    case P2P_SERVER_SWITCH_C_NOTIFY_DISABLED_EVT:
59
      /* USER CODE BEGIN Service1Char2_NOTIFY_DISABLED_EVT */
60
      P2P_SERVER_APP_Context.Switch_c_Notification_Status = Switch_c_NOTIFICATION_OFF;
61
      LOG_INFO_APP("-- P2P APPLICATION SERVER : NOTIFICATION DISABLED\n"); 
62
      LOG_INFO_APP(" \n\r");
63
      /* USER CODE END Service1Char2_NOTIFY_DISABLED_EVT */
64
      break;
65
66
    default:
67
      /* USER CODE BEGIN Service1_Notification_default */
68
69
      /* USER CODE END Service1_Notification_default */
70
      break;
71
  }
72
  /* USER CODE BEGIN Service1_Notification_2 */
73
74
  /* USER CODE END Service1_Notification_2 */
75
  return;
76
}
Frage an Harald K. (kirnbichler): Welcher Forenbereich wäre dafür 
passend? µC und Elekronik?

von Wastl (hartundweichware)


Lesenswert?

M. G. schrieb:
> Frage an Harald K. (kirnbichler): Welcher Forenbereich wäre dafür
> passend? µC und Elekronik?

Bei dieser Gelegenheit lernen wir auch gleich (nach kaum
mehr als zehn Jahren Forums-Mitgliedschaft) was ein "längerer
Sourcecode" ist: einer der länger als eine Bildschirmseite
ist bzw. diese signifikant überschreitet.
1
Wichtige Regeln - erst lesen, dann posten!
2
3
    Groß- und Kleinschreibung verwenden
4
    Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

von Harald K. (kirnbichler)


Lesenswert?

M. G. schrieb:
> if(HAL_UART_Transmit_DMA(&huart1, myBuffer, sizeof(myBuffer)) ==
> HAL_OK)

Der hier übergebene Puffer ist eine automatische Variable, die nur zur 
Laufzeit Deiner Funktion P2P_SERVER_Notification auf dem Stack 
existiert, genauer, sogar nur zur Laufzeit Deines 
switch/case-Statements. Das könnte zu interessanten Effekten führen, 
denn DMA-Übertragung ist ein nebenläufiger Prozess.

Mach da wenigstens 'ne statische Variable draus.

Statt eines Arrays mit einem Element kannst Du auch ein einzelnes Byte 
verwenden:
1
  uint8_t myBuffer[1];
2
3
  uint8_t myByte;
und dessen Adresse Deinem Funktionsaufruf übergeben:
1
  if(HAL_UART_Transmit_DMA(&huart1, myBuffer, sizeof(myBuffer)) ==  HAL_OK)
2
3
4
  if(HAL_UART_Transmit_DMA(&huart1, &myByte, sizeof(myByte)) ==  HAL_OK)
Was sagt die Dokumentation der Funktion HAL_UART_Transmit_DMA darüber 
aus, wie übergebene Objekte im Speicher angeordnet sein müssen 
("Alignment")?

Was sagt die Dokumentation zu möglichen Fehlercodes oder -Ursachen?

Darf man die Funktion aufrufen, wenn bereits ein DMA-Transfer aktiv und 
noch nicht abgeschlossen ist?

Und warum überhaupt versuchst Du, einzelne Bytes an eine UART per DMA zu 
übertragen?

Mit welcher Baudrate arbeitest Du?

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.
Lade...