在尝试为我的Arduino Uno编写代码时,我在这里有一个奇怪的串行输出。
我有这个原型代码:
MyClass myclass;
void setup()
{
Serial.Begin(9600);
Serial.println("Starting...");
}
void loop()
{
int status = myclass.DoWork();
Serial.println("Status: " + status);
}
class MyClass
{
int DoWork()
{
Serial.println("Doing some work...");
return 1;
}
}
现在,当我运行时,我得到以下输出:
...起动
做一些工作......
atus:1
所以奇怪的部分是“状态:1”缺少前几个字符。这是因为我在对象中使用串口不正确还是什么?
我注意到当我引用另一个也使用像MyClass这样的序列的库时,我得到了其他奇怪的输出行为......所以我认为我做错了。
编辑:最后,实际上这是一个内存问题。我所包含的库非常大,并且消耗了可用的内存。我通过添加一些调试语句找到了这一点,发现根据字符串的长度和位置,腐败发生了变化。通过使用F()函数,我将字符串移动到闪存(例如我现在运行Serial.println(F(“Starting ...”));它已经纠正了奇怪的输出。
答案 0 :(得分:4)
您无法在C ++中添加字符串和整数。如果编译失败,那对你来说会更好:
Serial.println("Status: " + status);
相反,编译器猜到了什么。它猜错了。使用此:
Serial.print("Status :");
Serial.println(status);
或完全控制输出数字和字符串学习使用C字符串格式, sprintf()
答案 1 :(得分:0)
最终,这实际上是一个内存问题。我所包含的库非常大,并且消耗了可用的内存。我通过添加一些调试语句找到了这一点,发现根据字符串的长度和位置,腐败发生了变化。通过使用F()函数,我将字符串移动到闪存(例如我现在运行Serial.println(F(“Starting ...”));它已经纠正了奇怪的输出。
答案 2 :(得分:0)
还有一个可能的解释。
我正在运行minicom进行监控,我通常喜欢在重置设备后自动重新连接。
我昨晚最小化了一个运行minicom的终端,今天我开始了一个新的实例,不知何故也连接到同一个串口(如果可能的话)。
我认为minicom的两个实例大致是随机读取大约50%的连续字符,这让我的文字很乱。