1

我一直在为这个问题苦苦挣扎一段时间,这段代码

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

给我错误

初始化中的指针目标在符号上不同 [-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 通信。

4

2 回答 2

2

是的,这是 STM32 Cube 库的一个非常烦人的角落。有人应该给他们一个很大的线索,即随机只读缓冲区最好用const void *C 来表示……mumble。

因此,修复它:使用字符串文字很方便,因为数据是文本的。因此,请这样做,然后在调用中进行调用,而不是:

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

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

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

于 2018-02-22T09:46:11.000 回答
1

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

uint8_t *PMTK = (uint8_t *)"$PSIMIPR,W,115200*1C";
于 2018-02-22T09:49:44.397 回答