переменная '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 часов, НО НЕ МОГУ ПОНЯТЬ, В ЧЕМ ПРОБЛЕМА, ПОЖАЛУЙСТА, помогите
@kristian311, 👍-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. Было бы жаль, если бы вы приложили все усилия, чтобы выяснить, что вы даже не смотрели в ту библиотеку.
- Конфликт I2C с двумя ардуино
- NodeMCU с RFID RC522 и LCD-модулем интерфейса I2C вместе
- ЖК-дисплей I2C отображает странные символы
- Экран LCD 16*02 I2C показывает только первый напечатанный символ
- Sainsmart LCD 2004 - проблема с библиотекой LiquidCrytal_I2C, не удается скомпилировать
- Что означают цифры позади lcd (0x27)?
- Как перевести Arduino Nano в спящий режим с низким энергопотреблением (<0,05 мА)
- ATtiny85 I2C ЖК
ПОЧЕМУ ТЫ КРИЧИШЬ?, @VE7JRO
пожалуйста, отформатируйте журнал ошибок так же, как код, @jsotola