Я пытаюсь отправить строку переменной длины через 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;
}