我正在研究一些专门用于处理串行闪存的Arduino兼容代码,但是我遇到了一个关于if()语句和程序条件流的更普遍的问题。这是一种我以前从未见过的新技术。可以在此处访问原始代码:https://github.com/LAtimes2/DataLogger/blob/master/DataLogger.ino
这段代码运行正常,并且做了它打算做的事情,这不是问题所在......仅供参考。
我很难理解的代码,在void loop()中如下:
logging = true;
if (logging) {
logString = valueToLogString (temperature, currentTime);
if (!dataLogger.writeData (logString.c_str(), logString.length())) {
if (!flashFull) {
Serial.print ("Flash data is full - stopped writing\n");
flashFull = true;
}
}
// also print to serial port
Serial.print(logString);
}
}
上面代码中调用的函数dataLogger.writeData如下:
bool SerialFlashDataLogger::writeData (const void *buf, uint32_t wrlen) {
uint32_t lengthWritten = 0;
lengthWritten = dataFile.write (buf, wrlen);
// return false if all the data was not written
return (lengthWritten == wrlen);
}
我很难理解if()语句:
if(!dataLogger.writeData(logString.c_str(),logString.length()))
代码用于连续记录数据,为什么会有if(!dataLogger.writeData .....) - 它读取if(“NOT”dataLogger.writeData ....)
我认为这与定义“writeData”函数的方式以及它返回布尔值的事实有关,但我似乎无法理解这有助于writeData函数持续接受输入为了写入内存芯片?
我在逻辑中缺少一些东西。
我知道这可能是一个令人困惑的帖子......希望有人能说清楚; 0
答案 0 :(得分:0)
当expr
类型为bool
时,if (!expr)
与if (!expr == true)
或if (expr == false)
相同。
所以,它说的是什么。
// return false if all the data was not written
然后条件是查看"是否所有数据都未写入"。
if
中的代码仅在"所有数据未写入"时执行。
答案 1 :(得分:0)
writeData函数返回一个布尔值,你可以看到bool SerialFlashDataLogger::writeData
。这个布尔值告诉你是否所有数据都已被写入,所以你可以在条件语句中的布尔表达式中使用它
答案 2 :(得分:0)
闪存中有一个日志文件,由变量dataFile
:
lengthWritten = dataFile.write (buf, wrlen);
只要有可用空间,对dataLogger.writeData
的调用将返回true。
一旦磁盘已满,对dataFile.write
的调用将最终写入少于请求的字节,因此,dataLogger.writeData
将返回false:
// return false if all the data was not written
return (lengthWritten == wrlen);
我认为在调用日志记录功能(flashFull
之前的某个地方)之前应该检查if (logging) {
,以防止向串口输出太多错误。
答案 3 :(得分:0)
感谢您的帮助...现在这很有意义......我在理解其工作原理时缺少的那部分与writeData函数被称为FIRST的概念有关,然后在内部记录数据在该函数中,然后评估它是返回FALSE还是TRUE,然后用NOT反转,如果在反转后评估为False则传递...我不清楚输入如何可以使用NOT运算符进入函数...
为将来记住一个有趣而简洁的技巧。
谢谢!