3

尝试为我的 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;
   }
}

现在,当它运行时,我得到以下输出:

开始...

做一些工作...

属性:1

所以奇怪的部分是“状态:1”缺少前几个字符。这是因为我在对象中不正确地使用串行还是什么?

我注意到当我引用另一个也使用类似 MyClass 的串行库时,我得到了其他奇怪的输出行为......所以我认为我做错了什么。

编辑:最后这实际上是一个内存问题。我包含的一个库非常大,它正在消耗可用内存。我通过添加更多调试语句发现了这一点,并发现损坏根据字符串长度和位置转移。通过使用 F() 函数,我将字符串移动到闪存中(例如,我现在运行 Serial.println(F("Starting...")); 它纠正了奇怪的输出。

4

3 回答 3

5

您不能在 C++ 中添加字符串和整数。如果编译失败,对你来说会更好:

Serial.println("Status: " + status);

相反,编译器猜测了一些东西。它猜错了。用这个:

Serial.print("Status :");
Serial.println(status);

或者为了完全控制输出数字和字符串,学习使用 C 字符串格式化,sprintf()

于 2013-06-23T04:18:42.337 回答
0

最后证明这实际上是一个内存问题。我包含的一个库非常大,它正在消耗可用内存。我通过添加更多调试语句发现了这一点,并发现损坏根据字符串长度和位置转移。通过使用 F() 函数,我将字符串移动到闪存中(例如,我现在运行 Serial.println(F("Starting...")); 它纠正了奇怪的输出。

于 2013-06-26T04:00:37.763 回答
0

另一种可能的解释。

我正在运行 minicom 进行监控,我通常喜欢它在重置设备后自动重新连接。

好吧,我昨晚最小化了一个运行 minicom 的终端,今天我启动了一个新实例,它也以某种方式连接到同一个串行端口(如果可能的话)。

我认为 minicom 的两个实例每个都大致随机读取约 50% 的串行字符,给我留下了相当混乱的文本。

于 2015-03-20T07:46:34.270 回答