STM32WBA55 - BLE_p2pServer - Wie kann ich Daten an die UART weiterleiten?

OP #7747986
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?

OP #7748520
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?

#7748522
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
#7748606
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?

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.