调试串行轮询的方法

时间:2012-02-08 15:11:47

标签: c++ debugging

我正在通过串行(加速度计值)从传感器读取值,循环类似于:

while( 1 ) {
   vector values = getAccelerometerValues();
   // Calculate velocity
   // Calculate total displacement
   if ( displacement == 0 )
       print("Back at origin");
}

我知道每个样本需要的时间,在getAccelerometerValues()中处理,因此我有一个计算速度,位移等的时间段。我以大约120个样本/秒进行采样。

这有效,但存在缺陷(非精确加速度计值,浮点误差等),并且校准和补偿以获得合理准确的位移值证明是困难的。

我在查找调试循环的过程时遇到了很多麻烦。如果我使用调试器(我的代码碰巧是用C ++编写的,而我正在慢慢学会使用gdb而不是print语句),那么我就会遇到问题并逐步推动我的传感器获取在调试器执行该行的时间点读取加速度计。也就是说,很难获得“继续下一线”和“推动传感器使其正在加速”的时机。

我可以使用大量的print语句,这些语句往往会在屏幕上飞过,但由于样本的数量,这会导致繁琐且难以导出问题,特别是如果有多个问题每循环勾选print语句。

我可以减少采样数量,这样可以提高程序输出的可读性,但会大大降低传感器轮询的加速度值的可靠性。如果我以1Hz的速度进行轮询,那么在加速度计值正在经历加速度时轮询的可能性会大幅下降。

总的来说,我在逐步完成代码和使用实际数据方面遇到了问题;我可以使用无用的数据来完成它,或者我无法通过更好的数据来实现它。

我假设print语句不是此方案的最佳调试方法。什么是更好的选择?是否有任何类型的资源我觉得有用(我错过了gdb的东西,还是有其他我可以使用的工具)?我正在努力开发一种方法来调试它。

4 个答案:

答案 0 :(得分:3)

一种明智的方法是使用getAccelerometerValues()的某个接口,您可以在运行时或构建时替换它,例如使用虚方法传入基类指针以在具体派生类中重写

如果需要,我可以更详细地描述机制,但理想的是能够运行相同的循环:

  • 真实数据
  • 真实数据(并将其保存到文件中)
  • 从上一次运行中保存的预制实际数据
  • 您编写的假数据作为测试用例

特别注意,如果每次调用只返回文件中的下一个数据,那么“重放”版本应该易于调试。

答案 1 :(得分:0)

我会在其他所有内容之前用假(即:随机)值调试您的代码。 计算按预期工作,然后我将使用从端口读取的值。

另外,没有办法以回调/推送的方式读取这些值,也就是说,当有新的可靠数据时,只能调用你的函数?

编辑:我不知道您使用的是哪些库,但在.NET框架中,您可以使用带有事件SerialPort的{​​{1}}类。这样你肯定会使用最实际和最可靠的数据。

答案 2 :(得分:0)

为您要调试的确切条件创建if块。例如,如果您只关心加速计读取您向左移动的时间:

if(movingLeft(values) {
   print("left");
}

答案 3 :(得分:0)

此问题的常见解决方案是录制。您的传感器中的捕获样本序列是实时的,存储到文件中。然后使用记录的数据训练系统,调试代码等。最后,将工作代码连接到直接从传感器流出的实际数据流。