首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >调试串行轮询的方法

调试串行轮询的方法
EN

Stack Overflow用户
提问于 2012-02-08 23:11:47
回答 4查看 95关注 0票数 2

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

代码语言:javascript
复制
while( 1 ) {
   vector values = getAccelerometerValues();
   // Calculate velocity
   // Calculate total displacement
   if ( displacement == 0 )
       print("Back at origin");
}

我知道每个样本需要的时间,这是在getAccelerometerValues()中处理的,所以我有一个时间周期来计算速度,位移等。我以大约120个样本/秒的速度采样。

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

我在寻找调试循环的进程时遇到了很大的麻烦。如果我使用调试器(我的代码恰好是用C++编写的,并且我正在慢慢地学习使用gdb而不是print语句),那么在调试器执行该行的时间点,为了获得加速度计读数,我在单步执行和推动传感器时会遇到问题。也就是说,很难获得“继续下一行”和“推动传感器使其加速”的正确时机。

我可以使用许多print语句,这些语句往往会在屏幕上飞过,但由于样本数量的原因,这会变得单调乏味,很难推断出问题所在,特别是当每个循环节拍有多个print语句时。

我可以减少样本的数量,这提高了程序输出的可读性,但极大地降低了我从传感器轮询的加速值的可靠性;如果我以1 1Hz的频率轮询,则在加速度计进行加速时轮询加速度计值的机会会显著下降。

总体而言,我在单步执行代码和使用实际数据时遇到了问题;我可以使用无用的数据单步执行,也可以使用更好的数据单步执行。

我假设print语句不是这种情况下的最佳调试方法。更好的选择是什么?有没有什么我会觉得有用的资源(我是不是在gdb中遗漏了什么,或者有没有其他我可以使用的工具)?我正在努力开发一种方法来调试它。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-02-08 23:20:53

一种明智的方法是为getAccelerometerValues()使用一些接口,您可以在运行时或构建时替换这些接口,例如,使用虚方法传入基类指针,以便在具体的派生类中进行覆盖。

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

  • 实时数据
  • 实时数据(并将其保存到文件)
  • 从上次运行保存的真实数据
  • 伪造数据作为测试用例

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

票数 3
EN

Stack Overflow用户

发布于 2012-02-08 23:17:09

我会先用假的(即:随机的)值来调试你的代码。如果计算按预期工作,那么我将使用从端口读取的值。

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

编辑:我不知道您使用的是什么库,但在.NET框架中,您可以使用带有事件DataReceivedSerialPort类。这样你肯定会使用最真实、最可靠的数据。

票数 0
EN

Stack Overflow用户

发布于 2012-02-08 23:17:16

为要调试的确切条件创建if块。例如,如果您只关心加速度计何时显示您正在向左移动:

代码语言:javascript
复制
if(movingLeft(values) {
   print("left");
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9195996

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档