赞
踩
做单片机应用时,会遇到写外部文件的应用,于是我就想到了写入SD卡,在我连好线路,就连测试代码都跑通的情况下,我发现ESP32的这个SD卡读写有毛病,具体表现是
在setup里面初始化了SD,但是在loop中使用SD的时候未能正常使用,经检查是loop中SD未初始化。
在论坛寻找大神的解决方案未果后(大佬们都不知道这个问题,而且还说是不是内存卡有问题,就离谱),只能自己着手看代码,解决这个问题了。
在Arduino IDE中查看定义只能查看到头文件中,而对应CPP文件中的定义却无法看到,这是前期无法解决这个问题的主要原因,我一查看这个SD变量的定义就跳到了这里
// SD.h
extern fs::SDFS SD;
using namespace fs;
typedef fs::File SDFile;
typedef fs::SDFS SDFileSystemClass;
#define SDFileSystem SD
#endif /* _SD_H_ */
这段代码只说明了导出SD
变量,并没有说明SD
变量是什么,所以我在VScode中配好环境,用它来进行调试,这次是跳到了SD.cpp
中,也就是下面这个地方
bool SDFS::readRAW(uint8_t *buffer, uint32_t sector) {
return sd_read_raw(_pdrv, buffer, sector);
}
bool SDFS::writeRAW(uint8_t *buffer, uint32_t sector) {
return sd_write_raw(_pdrv, buffer, sector);
}
SDFS SD = SDFS(FSImplPtr(new VFSImpl()));
可以看到,每次调用这个SD
的时候,都会new一个对象,这才导致到loop中无法使用,为了解决这个问题,那就只能是全局共用一个SD对象。
我写了个单例的类来解决这个问题
class LogModule
{
private:
// 禁用外部构造
LogModule();
// 禁用外部析构
~LogModule();
// 禁用外部拷贝构造
LogModule(
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。