无法对齐 "pointer targets signedness"

Can't align "pointer targets signedness"

这段代码

让我在这个问题上苦苦挣扎了一段时间
uint8_t *PMTK = "$PSIMIPR,W,115200*1C";

给我错误

pointer targets in initialization differ in signedness [-Wpointer-sign]

仅将其更改为 char *unsigned char * 没有任何区别,并且 const char * 会导致程序在应该使用 PMTK 的地方进一步抱怨,如下所示代码:

if (HAL_UART_Transmit(&huart3, PMTK, 32, 2000) != HAL_TIMEOUT)
          {
              HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_7);
              HAL_Delay(500);
              HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_7);
          }
          else
          { ....

该程序应该使用 HAL 驱动程序建立从 STM32F0xx 到 GPS 接收器 (SIM33ELA) 的 uart 通信。

是的,那是 STM32 Cube 库中一个非常烦人 的角落。有人应该给他们一个重要的线索,即随机 read-only 缓冲区在 C 中最好表示为 const void * ... 咕哝。

所以,要解决这个问题:使用字符串文字很方便,因为数据是文本的。所以,这样做,然后在调用中转换,而不是:

const char PMTK[] = "$PSIMIPR,W,115200*1C";

if (HAL_UART_Transmit(&huart3, (uint8_t *) PMTK, strlen(PMTK), 2000) != HAL_TIMEOUT)

注意使用 strlen() 来获得正确的长度,硬编码文字值从来都不是正确的选择并且在这里被破坏了(字符串不是 32 个字符长)。我们也可以使用 sizeof(毕竟它是一个数组),但是 error-prone 有点多,因为您必须为终止符减去 1。无论如何,我很确定编译器会优化这个 strlen() 调用。

c 字符串被编译器视为 char[]。如果您在 String 之前向 (uint8_t *) 添加强制转换,则警告会消失。

uint8_t *PMTK = (uint8_t *)"$PSIMIPR,W,115200*1C";