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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren