簡體   English   中英

如何正確地將字符串/數組傳遞給 function? (stm32)

[英]How to pass string/array to function correctly? (stm32)

我不是第一個,也不是最后一個,我的意思是)還有一個關於waring的問題:賦值使指針來自 integer 沒有強制轉換

我已經讀過這個這個這個這個這個,越來越多。

我有 NUCLEO-F070RB-STM32 開發套件。 我想在 PC 上發送不同的消息進行調試。

我使用這種結構:

uint8_t greeting[] = "Welcome to first circle of hell\n";
HAL_UART_Transmit(&huart2, greeting, sizeof(greeting)-1, 30); 
//"sizeof(greeting)-1" cut "\0" from string

這是一個描述:

/**
  * @brief Send an amount of data in blocking mode.
  * @note   When UART parity is not enabled (PCE = 0), and Word Length is configured to 9 bits (M1-M0 = 01),
  *         the sent data is handled as a set of u16. In this case, Size must indicate the number
  *         of u16 provided through pData.
  * @note   When UART parity is not enabled (PCE = 0), and Word Length is configured to 9 bits (M1-M0 = 01),
  *         address of user data buffer containing data to be sent, should be aligned on a half word frontier (16 bits)
  *         (as sent data will be handled using u16 pointer cast). Depending on compilation chain,
  *         use of specific alignment compilation directives or pragmas might be required
  *         to ensure proper alignment for pData.
  * @param huart   UART handle.
  * @param pData   Pointer to data buffer (u8 or u16 data elements).
  * @param Size    Amount of data elements (u8 or u16) to be sent.
  * @param Timeout Timeout duration.
  * @retval HAL status
  */

一切都完美無缺。

但我想要不同的信息。 我是一個很好的程序員。

uint8_t greeting[] = "Welcome to first circle of hell\n";
uint8_t str[] = "just for UART\r\n";

void send_to_uart (uint8_t);
void send_to_uart (uint8_t it_will_be_send)
{
    HAL_UART_Transmit(&huart2, it_will_be_send, sizeof(it_will_be_send)-1, 30);
}
int main(void)
{
   send_to_uart(greeting);
   wile (1)
   {
   send_to_uart(str);
   }

}

我有一個警告,我的屏幕上沒有數據。 壞壞壞程序員!

我理解指針中的魔鬼。 但是您能否為像我這樣的所有新手逐步解釋:如何將...n arrays 傳遞給函數。 討回公道

附言

/* USER CODE BEGIN 0 */

void send_to_uart (uint8_t);
void send_to_uart (uint8_t it_will_be_send)
{
    HAL_UART_Transmit(&huart2, it_will_be_send, sizeof(it_will_be_send)-1, 30);
}
/* USER CODE END 0 */

/**
  * @brief  The application entry point.
  * @retval int
  */
int main(void)
{
  /* USER CODE BEGIN 1 */
 /* USER CODE BEGIN WHILE */
  uint8_t greeting[] = "\nWelcome to first circle of hell\n";

  uint8_t some_string[] = "some string to UART\r\n";


  send_to_uart(greeting);

  HAL_UART_Transmit(&huart2, greeting, sizeof(greeting)-1, 30);
  while (1)
  {
    HAL_UART_Transmit(&huart2, "\nHAL some string to UART\n" , 25, 30);
    send_to_uart(some_string);

    HAL_UART_Transmit(&huart2, some_string, sizeof(some_string)-1, 30);


    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */
}

make -j4 all 
arm-none-eabi-gcc "../Core/Src/main.c" -mcpu=cortex-m0 -std=gnu11 -g3 -DDEBUG -DUSE_HAL_DRIVER -DSTM32F070xB -c -I../Core/Inc -I../Drivers/STM32F0xx_HAL_Driver/Inc -I../Drivers/STM32F0xx_HAL_Driver/Inc/Legacy -I../Drivers/CMSIS/Device/ST/STM32F0xx/Include -I../Drivers/CMSIS/Include -O0 -ffunction-sections -fdata-sections -Wall -fstack-usage -MMD -MP -MF"Core/Src/main.d" -MT"Core/Src/main.o" --specs=nano.specs -mfloat-abi=soft -mthumb -o "Core/Src/main.o"
../Core/Src/main.c: In function 'send_to_uart':
../Core/Src/main.c:67:29: warning: passing argument 2 of 'HAL_UART_Transmit' makes pointer from integer without a cast [-Wint-conversion]
   67 |  HAL_UART_Transmit(&huart2, it_will_be_send, sizeof(it_will_be_send)-1, 30);
      |                             ^~~~~~~~~~~~~~~
      |                             |
      |                             uint8_t {aka unsigned char}
In file included from ../Core/Inc/stm32f0xx_hal_conf.h:288,
                 from ../Drivers/STM32F0xx_HAL_Driver/Inc/stm32f0xx_hal.h:30,
                 from ../Core/Inc/main.h:31,
                 from ../Core/Src/main.c:21:
../Drivers/STM32F0xx_HAL_Driver/Inc/stm32f0xx_hal_uart.h:1491:73: note: expected 'uint8_t *' {aka 'unsigned char *'} but argument is of type 'uint8_t' {aka 'unsigned char'}
 1491 | HAL_StatusTypeDef HAL_UART_Transmit(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout);
      |                                                                ~~~~~~~~~^~~~~
../Core/Src/main.c: In function 'main':
../Core/Src/main.c:112:16: warning: passing argument 1 of 'send_to_uart' makes integer from pointer without a cast [-Wint-conversion]
  112 |   send_to_uart(greeting);
      |                ^~~~~~~~
      |                |
      |                uint8_t * {aka unsigned char *}
../Core/Src/main.c:65:28: note: expected 'uint8_t' {aka 'unsigned char'} but argument is of type 'uint8_t *' {aka 'unsigned char *'}
   65 | void send_to_uart (uint8_t it_will_be_send)
      |                    ~~~~~~~~^~~~~~~~~~~~~~~
../Core/Src/main.c:117:29: warning: pointer targets in passing argument 2 of 'HAL_UART_Transmit' differ in signedness [-Wpointer-sign]
  117 |  HAL_UART_Transmit(&huart2, "\nHAL some string to UART\n" , 25, 30);
      |                             ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~
      |                             |
      |                             char *
In file included from ../Core/Inc/stm32f0xx_hal_conf.h:288,
                 from ../Drivers/STM32F0xx_HAL_Driver/Inc/stm32f0xx_hal.h:30,
                 from ../Core/Inc/main.h:31,
                 from ../Core/Src/main.c:21:
../Drivers/STM32F0xx_HAL_Driver/Inc/stm32f0xx_hal_uart.h:1491:73: note: expected 'uint8_t *' {aka 'unsigned char *'} but argument is of type 'char *'
 1491 | HAL_StatusTypeDef HAL_UART_Transmit(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout);
      |                                                                ~~~~~~~~~^~~~~
../Core/Src/main.c:118:15: warning: passing argument 1 of 'send_to_uart' makes integer from pointer without a cast [-Wint-conversion]
  118 |  send_to_uart(some_string);
      |               ^~~~~~~~~~~
      |               |
      |               uint8_t * {aka unsigned char *}
../Core/Src/main.c:65:28: note: expected 'uint8_t' {aka 'unsigned char'} but argument is of type 'uint8_t *' {aka 'unsigned char *'}
   65 | void send_to_uart (uint8_t it_will_be_send)
      |                    ~~~~~~~~^~~~~~~~~~~~~~~
arm-none-eabi-gcc -o "max6675_2.0.elf" @"objects.list"   -mcpu=cortex-m0 -T"C:\stm32\cubeMX_workspace\max6675_2.0\STM32F070RBTX_FLASH.ld" --specs=nosys.specs -Wl,-Map="max6675_2.0.map" -Wl,--gc-sections -static --specs=nano.specs -mfloat-abi=soft -mthumb -Wl,--start-group -lc -lm -Wl,--end-group
Finished building target: max6675_2.0.elf
 
arm-none-eabi-objdump -h -S  max6675_2.0.elf  > "max6675_2.0.list"
arm-none-eabi-objcopy  -O binary  max6675_2.0.elf  "max6675_2.0.bin"
arm-none-eabi-size   max6675_2.0.elf 
   text    data     bss     dec     hex filename
   8228      20    1804   10052    2744 max6675_2.0.elf
Finished building: default.size.stdout
 
Finished building: max6675_2.0.bin
 
Finished building: max6675_2.0.list
 

13:39:29 Build Finished. 0 errors, 4 warnings. (took 1s.941ms)

在此處輸入圖像描述

看這個:

void send_to_uart (uint8_t);

所以send_to_uart期望uint8_t類型的參數 - 很好。

現在看看這個:

uint8_t greeting[] = "Welcome to first circle of hell\n";

int main(void)
{
   send_to_uart(greeting);  <--- What is greeting?

那么greeting uint8_t嗎?

不,這不對。 這是一個數組,因此您不能將其傳遞給需要uint8_t的 function

試試看:

 for (int i = 0; i < strlen(greeting); ++i) send_to_uart(greeting[i]);

您可以將char類型用於字符串文字。 只需在HAL_UART_TRANSMIT中對它們進行類型轉換以避免編譯器警告。

char greeting[] = "Welcome to first circle of hell\n";
char str[] = "just for UART\r\n";

void send_to_uart (const char *);
void send_to_uart (const char *it_will_be_send)
{
    HAL_UART_Transmit(&huart2, (uint8_t *)it_will_be_send, strlen(it_will_be_send), 30);
}
int main(void)
{
   /* Initialize UART */
   /* ..... */

   send_to_uart(greeting);
   while (1)
   {
       send_to_uart(str);
   }

}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM