STM32 HAL_UART_Передача динамической строки - PullRequest
0 голосов
/ 21 сентября 2018

Я пытаюсь отправить строку переменной длины через UART, используя функцию HAL.Нет способа отправить строку, которая изменяет время выполнения, я пробовал с различными объявлениями внутри и снаружи цикла while, но если я не объявляю строку фиксированной длины (например, char buffer [30]), HALне принимает это.символ буфер;char buffer [] = "", даже char buffer = malloc (sizeof (char)), ничего не работает.У меня на терминале только какой-то символ или ничего.

Есть ли способ передать строку переменной длины в HAL?

Спасибо.

int main(void)
{
  /* USER CODE BEGIN 1 */

  /* USER CODE END 1 */

  /* MCU Configuration----------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_USART2_UART_Init();
  /* USER CODE BEGIN 2 */


    uint32_t index1 = 0, index2 = 0;
    const char message[] = "Hello from Nucleo64";
    const char message2[] = "Pressed!";

  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {

  /* USER CODE END WHILE */

  /* USER CODE BEGIN 3 */
        if(HAL_GPIO_ReadPin(B1_GPIO_Port, B1_Pin)){

            char *buffer;
            sprintf(buffer, "%s - index=%d\n", message, index1);
            HAL_UART_Transmit(&huart2, (uint8_t *)buffer, sizeof(buffer)-1, 10);
            index1 += 1;
        } else 
            {
                char *buffer2;
                sprintf(buffer2, "%s - index=%d\n", message2, index2);
                HAL_UART_Transmit(&huart2, (uint8_t *)buffer2, sizeof(buffer2)-1, 10);
                index2 += 1;
            }

        HAL_GPIO_TogglePin(LD2_GPIO_Port, LD2_Pin);
        HAL_Delay(500);


  }
  /* USER CODE END 3 */

}

Какпредложил, я попробовал также snprintf, на терминале я не вижу ничего, кроме [00], когда я сбрасываю, то ничего не передается.

uint32_t index1 = 0, index2 = 0;
    char message[] = "Hello from Nucleo64";
    char message2[] = "Pressed!";

  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {

  /* USER CODE END WHILE */

  /* USER CODE BEGIN 3 */
        if(HAL_GPIO_ReadPin(B1_GPIO_Port, B1_Pin)){

            size_t needed = snprintf(NULL, 0, "%s - index=%d\n", message, index1) + 1;
            char  *buffer = malloc(needed);
            snprintf(buffer, needed, "%s - index=%d\n", message, index1);

            HAL_UART_Transmit(&huart2, (uint8_t *)buffer, strlen(buffer), 10);
            index1 += 1;
            free(buffer);
        } else 
            {
                size_t needed = snprintf(NULL, 0, "%s - index=%d\n", message2, index2) + 1;
                char  *buffer2 = malloc(needed);
                snprintf(buffer2, needed, "%s - index=%d\n", message2, index2);

                HAL_UART_Transmit(&huart2, (uint8_t *)buffer2, strlen(buffer2), 10);
                index2 += 1;
                free(buffer2);
            }

        HAL_GPIO_TogglePin(LD2_GPIO_Port, LD2_Pin);
        HAL_Delay(500);


  }
  /* USER CODE END 3 */

}

решено *****************************

Использовал printf после объявления проотипа GNUC

#ifdef __GNUC__

    #define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
#else
    #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)

#endif

и передачи его в HAL_UART_Trasmit

PUTCHAR_PROTOTYPE
    {
        HAL_UART_Transmit(&huart2, (uint8_t *)&ch, 1, 0xFFFF);
        return ch;
    }
...