переменная 'LiquidCrystal_I2C lcd' имеет инициализатор, но неполный тип

У меня проблема с ЖК-дисплеем, у меня NUCLEO64 L746RG, к нему подключен ЖК-дисплей и I2C. Когда я проверяю код, он выдает длинную ошибку, и я не могу найти решение или причину этой ошибки:

In file included from C:\Users\User\AppData\Local\Arduino15\packages\STMicroelectronics\hardware\stm32\2.4.0\system/Drivers/CMSIS/Device/ST/STM32L4xx/Include/stm32l4xx.h:149,
                 from C:\Users\User\AppData\Local\Arduino15\packages\STMicroelectronics\hardware\stm32\2.4.0\cores\arduino/stm32/stm32_def.h:48,
                 from C:\Users\User\AppData\Local\Arduino15\packages\STMicroelectronics\hardware\stm32\2.4.0\cores\arduino/stm32/clock.h:19,
                 from C:\Users\User\AppData\Local\Arduino15\packages\STMicroelectronics\hardware\stm32\2.4.0\cores\arduino/wiring_time.h:23,
                 from C:\Users\User\AppData\Local\Arduino15\packages\STMicroelectronics\hardware\stm32\2.4.0\cores\arduino/wiring.h:38,
                 from C:\Users\User\AppData\Local\Arduino15\packages\STMicroelectronics\hardware\stm32\2.4.0\cores\arduino/Arduino.h:36,
                 from C:\Users\User\AppData\Local\Temp\arduino-sketch-B028C48DF91C28F6EAA5B0CE34D27EE2\sketch\Displaylcd1.ino.cpp:1:
C:\Users\User\AppData\Local\Arduino15\packages\STMicroelectronics\hardware\stm32\2.4.0\system/Drivers/CMSIS/Device/ST/STM32L4xx/Include/stm32l476xx.h:1326:29: error: expected identifier before '(' token
 1326 | #define LCD                 ((LCD_TypeDef *) LCD_BASE)
      |                             ^
c:\Users\User\Documents\Arduino\libraries\LiquidCrystal/LCD.h:169:7: note: in expansion of macro 'LCD'
  169 | class LCD : public Print
      |       ^~~
C:\Users\User\AppData\Local\Arduino15\packages\STMicroelectronics\hardware\stm32\2.4.0\system/Drivers/CMSIS/Device/ST/STM32L4xx/Include/stm32l476xx.h:1326:43: error: expected ')' before '*' token
 1326 | #define LCD                 ((LCD_TypeDef *) LCD_BASE)
      |                              ~            ^
c:\Users\User\Documents\Arduino\libraries\LiquidCrystal/LCD.h:169:7: note: in expansion of macro 'LCD'
  169 | class LCD : public Print
      |       ^~~
C:\Users\User\AppData\Local\Arduino15\packages\STMicroelectronics\hardware\stm32\2.4.0\system/Drivers/CMSIS/Device/ST/STM32L4xx/Include/stm32l476xx.h:1326:43: error: expected ')' before '*' token
 1326 | #define LCD                 ((LCD_TypeDef *) LCD_BASE)
      |                             ~             ^
c:\Users\User\Documents\Arduino\libraries\LiquidCrystal/LCD.h:169:7: note: in expansion of macro 'LCD'
  169 | class LCD : public Print
      |       ^~~
C:\Users\User\AppData\Local\Arduino15\packages\STMicroelectronics\hardware\stm32\2.4.0\system/Drivers/CMSIS/Device/ST/STM32L4xx/Include/stm32l476xx.h:1326:29: error: expected class-name before '(' token
 1326 | #define LCD                 ((LCD_TypeDef *) LCD_BASE)
      |                             ^
c:\Users\User\Documents\Arduino\libraries\LiquidCrystal/LiquidCrystal_I2C.h:38:34: note: in expansion of macro 'LCD'
   38 | class LiquidCrystal_I2C : public LCD
      |                                  ^~~
C:\Users\User\AppData\Local\Arduino15\packages\STMicroelectronics\hardware\stm32\2.4.0\system/Drivers/CMSIS/Device/ST/STM32L4xx/Include/stm32l476xx.h:1326:29: error: expected '{' before '(' token
 1326 | #define LCD                 ((LCD_TypeDef *) LCD_BASE)
      |                             ^
c:\Users\User\Documents\Arduino\libraries\LiquidCrystal/LiquidCrystal_I2C.h:38:34: note: in expansion of macro 'LCD'
   38 | class LiquidCrystal_I2C : public LCD
      |                                  ^~~
C:\Users\User\AppData\Local\Arduino15\packages\STMicroelectronics\hardware\stm32\2.4.0\system/Drivers/CMSIS/Device/ST/STM32L4xx/Include/stm32l476xx.h:1326:43: error: expected ')' before '*' token
 1326 | #define LCD                 ((LCD_TypeDef *) LCD_BASE)
      |                              ~            ^
c:\Users\User\Documents\Arduino\libraries\LiquidCrystal/LiquidCrystal_I2C.h:38:34: note: in expansion of macro 'LCD'
   38 | class LiquidCrystal_I2C : public LCD
      |                                  ^~~
C:\Users\User\AppData\Local\Arduino15\packages\STMicroelectronics\hardware\stm32\2.4.0\system/Drivers/CMSIS/Device/ST/STM32L4xx/Include/stm32l476xx.h:1326:43: error: expected ')' before '*' token
 1326 | #define LCD                 ((LCD_TypeDef *) LCD_BASE)
      |                             ~             ^
c:\Users\User\Documents\Arduino\libraries\LiquidCrystal/LiquidCrystal_I2C.h:38:34: note: in expansion of macro 'LCD'
   38 | class LiquidCrystal_I2C : public LCD
      |                                  ^~~
C:\Users\User\Documents\Arduino\Displaylcd1\Displaylcd1.ino:2:22: error: variable 'LiquidCrystal_I2C lcd' has initializer but incomplete type
    2 | LiquidCrystal_I2C lcd(0x27,16,2);  /*I2C scanned address defined + I2C screen size*/
      |                      ^
Multiple libraries were found for "LiquidCrystal_I2C.h"
  Used: C:\Users\User\Documents\Arduino\libraries\LiquidCrystal
  Not used: C:\Users\User\Documents\Arduino\libraries\LiquidCrystal_I2C
exit status 1

Compilation error: variable 'LiquidCrystal_I2C lcd' has initializer but incomplete type

Это мой код:

#include <LiquidCrystal_I2C.h>  /*include LCD I2C Library*/
LiquidCrystal_I2C lcd(0x27,16,2);  /*I2C scanned address defined + I2C screen size*/
void setup() {
  lcd.init();  /*LCD display initialized*/
  lcd.clear();     /*Clear LCD Display*/
  lcd.backlight();      /*Turn ON LCD Backlight*/
  lcd.setCursor(2,0);   /*Set cursor to Row 1*/
  lcd.print("I2C LCD Nano"); /*print text on LCD*/
  lcd.setCursor(2,1);   /*set cursor on row 2*/
  lcd.print("Linuxhint.com"); /*print message on LCD*/
}
void loop() {
}

Я не знаю почему, я ничего не включаю, так почему это выдает мне эту ошибку?

ПОЖАЛУЙСТА, ПОМОГИТЕ, Я РАБОТАЮ НАД ЭТИМ уже 8 часов, НО НЕ МОГУ ПОНЯТЬ, В ЧЕМ ПРОБЛЕМА, ПОЖАЛУЙСТА, помогите

, 👍-1

Обсуждение

ПОЧЕМУ ТЫ КРИЧИШЬ?, @VE7JRO

пожалуйста, отформатируйте журнал ошибок так же, как код, @jsotola


1 ответ


1

Обычно я бы не ответил на этот вопрос, но ошибка не совсем в вашем коде, а (по крайней мере, на первый взгляд) в двух общих вещах в экосистеме Arduino.

Грубо говоря, библиотека, которую вы пытаетесь использовать, несовместима с используемой вами поддержкой платы STM32.

Сообщение об ошибке говорит об этом. Это может помочь прочитать его задом наперед:

<sketchbook>\libraries\LiquidCrystal/LCD.h:169:7: note: in expansion of macro 'LCD'
  169 | class LCD : public Print
      |       ^~~

Итак, это в вашей установленной библиотеке LiquidCrystal, пытающейся обработать определение класса LCD, и возникла проблема с LCD, а точнее в раскрытии макроса 'LCD'. Итак, есть макрос под названием LCD, который он пытается расширить в этот момент, что должно быть красным флажком.

В верхней части у самого компилятора возникают проблемы с расширением макроса, что вызывает более фундаментальную ошибку, ошибка: ожидаемый идентификатор перед токеном '('. Это связано с тем, что он пытается вставить определение макроса прямо туда, где оно было найдено, что приводит к тому, что этот код становится эффективным после предварительной обработки:

class ((LCD_TypeDef *) LCD_BASE) : public Print

это бред. Он указывает на первую открытую скобку и говорит ожидаемый идентификатор, где идентификатор — это имя класса, которое он ожидал увидеть, а не это приведение и другие вещи, которые следуют. Кто бы ни написал вашу библиотеку LiquidCrystal, он не ожидал, что LCD уже будет определен как нечто с помощью макроса. Это одна из многих причин, по которым макросы ненавидят.

Большая часть этого указывает, как макрос попал туда, откуда он пришел, и куда он попал. Макрос начался в stm32l4xx.h в CMSIS и перешел в заголовок LiquidCrystal через Arduino.h и все, что между ними:

In file included from <Arduino15>\<STM32boardSupport>\system/Drivers/CMSIS/Device/ST/STM32L4xx/Include/stm32l4xx.h:149,
                 from <Arduino15>\<STM32boardSupport>\cores\arduino/stm32/stm32_def.h:48,
                 from <Arduino15>\<STM32boardSupport>\cores\arduino/stm32/clock.h:19,
                 from <Arduino15>\<STM32boardSupport>\cores\arduino/wiring_time.h:23,
                 from <Arduino15>\<STM32boardSupport>\cores\arduino/wiring.h:38,
                 from <Arduino15>\<STM32boardSupport>\cores\arduino/Arduino.h:36,
                 from <Temp>\arduino-sketch-B028C48DF91C28F6EAA5B0CE34D27EE2\sketch\Displaylcd1.ino.cpp:1:

Проще говоря, CMSIS — это полустандартные заголовочные файлы, которые должны предоставлять производители микросхем ARM, которые, среди прочего, определяют аппаратные регистры. Хотя я не исследовал это, кажется вероятным, что любой чип, который вы используете, имеет встроенный драйвер ЖК-дисплея, и поэтому есть вещи, а именно макросы, которые имеют "ЖК-экран". во имя. К сожалению для вас, один только что назвал LCD.

Вы можете попробовать переименовать все варианты использования LCD в библиотеке LiquidCrystal, которые у вас есть, на другое имя. Или вы можете попробовать вставить #undef LCD после включения Arduino.h в заголовок LCD.h в попытке отменить определение макроса, чтобы LCD в определении класса не расширялся. Но я бы искал разные версии библиотеки и удостоверился, что это именно та библиотека, о которой вы думаете, потому что все и их собаки, кажется, в тот или иной момент создали какую-то библиотеку под названием LiquidCrystal. Было бы жаль, если бы вы приложили все усилия, чтобы выяснить, что вы даже не смотрели в ту библиотеку.

,