platformio / platform-espressif8266

Espressif 8266: development platform for PlatformIO
https://registry.platformio.org/platforms/platformio/espressif8266
Apache License 2.0
325 stars 219 forks source link

Problem in FS after updating the core #148

Closed lucasromeiro closed 5 years ago

lucasromeiro commented 5 years ago

Hello, I'm using PlatformIO in its latest version. I have now updated to use the Arduino 2.5.1 core to use ESP8266 12-F and now my code does not compile anymore! Accuses error in FS. I do not understand why. It worked before updating. I can not find the problem. Can someone help me?

Captura de Tela 2019-05-15 às 09 19 37 Captura de Tela 2019-05-15 às 09 20 33

Thank you

lucasromeiro commented 5 years ago

core 2.4.2 work fine: platform = espressif8266@1.8.0

core 2.5.1 don't work: platform = espressif8266

why??

ivankravets commented 5 years ago

Unification of SPIFFS and SD, into single compatible FS, File, and Dir objects

See https://github.com/esp8266/Arduino/pull/5525

@earlephilhower do you have any migrating guide?

earlephilhower commented 5 years ago

There is no migration. They are compatible AFAIK and per many other users and the original SD.h examples, even.

ivankravets commented 5 years ago

@lucasromeiro could you share a simple project to reproduce this issue?

lucasromeiro commented 5 years ago

@lucasromeiro could you share a simple project to reproduce this issue?

Sure!

include "Arduino.h"

include

include //Biblioteca responsável por criar o Sistema de manipulação de arquivos

void setup() { SPIFFS.begin(); //Inicializa sistema de arquivos }

void loop() {

File carregaArquivos = SPIFFS.open("/log.txt", "a"); char charState = '1'; carregaArquivos.write(charState); carregaArquivos.close(); }

Captura de Tela 2019-05-15 às 15 26 03
earlephilhower commented 5 years ago

fs::write takes a pointer and length, or a c-string, or a String, not a char.

lucasromeiro commented 5 years ago

fs::write takes a pointer and length, or a c-string, or a String, not a char.

If I use String it also does not work! String charState = "1";

lucasromeiro commented 5 years ago

I do not understand why this worked in the previous version and now it does not work.

earlephilhower commented 5 years ago

Actually, I think I see the issue.

FS::File never had a File::write(char) method, but it did have a File::write(uint8_t) method. Print(the superclass of File) never supported Print::write(char).

So in the old versions you were getting silent conversions of char->uint8_t (I think you'll get a warning if you go strict enough).

Now, since your call doesn't match any exactly, it is using the template which is for writing Stream children, only.

earlephilhower commented 5 years ago

Try the change in https://github.com/esp8266/Arduino/pull/6101 . I'm not sure if it will break anything else, but it re-enabled the usage.

lucasromeiro commented 5 years ago

Actually, I think I see the issue.

FS::File never had a File::write(char) method, but it did have a File::write(uint8_t) method. Print(the superclass of File) never supported Print::write(char).

So in the old versions you were getting silent conversions of char->uint8_t (I think you'll get a warning if you go strict enough).

Now, since your call doesn't match any exactly, it is using the template which is for writing Stream children, only.

Got it, so if I switch char to uint8_t it should work the same, right? I'll try.

lucasromeiro commented 5 years ago

Actually, I think I see the issue.

FS::File never had a File::write(char) method, but it did have a File::write(uint8_t) method. Print(the superclass of File) never supported Print::write(char).

So in the old versions you were getting silent conversions of char->uint8_t (I think you'll get a warning if you go strict enough).

Now, since your call doesn't match any exactly, it is using the template which is for writing Stream children, only.

Its work!

uint8_t charState = '1';

Thanks!