【问题标题】:raspberryPi g++: Ultrasonic sensor not working...!raspberryPi g++:超声波传感器不工作......!
【发布时间】:2014-03-22 16:23:48
【问题描述】:

我编写了以下程序,用于在树莓派 Raspbian wheezy 中使用 g++ 连接超声波传感器,使用接线 Pi 库。但是我无法使其工作。我的代码有问题吗???我想从传感器连续读取... 提前谢谢!!!

#include<iostream>
#include<wiringPi.h> 
#include<errno.h>
#include<string.h>
#include<stdint.h>       //for uint32_t
using namespace std;
uint32_t time1=0,time2=0;
int time_diff=0;
float Range_cm=0;

    void myInterrupt(void)
     {
       cout<<"Interrupt\n";
       time2=micros();
       time_diff=time2-time1;
       Range_cm=time_diff/58;
       delay(150);
       digitalWrite(2,0);
       delayMicroseconds(1);
       digitalWrite(2,1);
       delayMicroseconds(10);
       digitalWrite(2,0);
       time1=micros();

     }

     int main(void)
      {
           if(wiringPiSetup()<0)
            {
               cout<<"wiringPiSetup failed !!\n";
            }
          pinMode(2,OUTPUT);
          pinMode(3,INPUT);
          pullUpDnControl(3,PUD_DOWN);
          digitalWrite(2,0);
          delayMicroseconds(1);
          digitalWrite(2,1);
          delayMicroseconds(10);
          digitalWrite(2,0);
          time1=micros();

          if(wiringPiISR(3,INT_EDGE_RISING,&myInterrupt) < 0)
             {
                  cerr<<"interrupt error ["<<strerror (errno)<< "]:"<<errno<<endl;
                  return 1;
             }


           while(1)
             {
               cout<<"distance= "<<time1<<" "<<time2<<" "<<time_diff<<" "<<Range_cm<<"cm\n";
             cout.flush();
             }
            return 0;
        }

【问题讨论】:

  • myInterrupt 函数真的是从硬件中断运行的吗?中断函数应该简单且快速。延迟与快速相反。最好他们只是设置一个标志,让非中断代码检查标志并执行所需的任何操作。
  • 至于你的问题,能不能说的更具体一点?只说“它不起作用”而不说如何它不起作用是不够的。
  • @indiv 至少 volatile 并且使用原子将是一个好主意。
  • 创建一个全局变量volatile int num_interrupts = 0;。将 myInterrupt 的主体更改为一行代码 num_interrupts++;。在main 的无限循环中,打印出num_interrupts。它会增加吗?如果是这样,您的问题出在您的中断处理程序中。如果没有,你的问题是你的中断没有发生。
  • @πάντα ῥεῖ:谢谢。挥发性在这里相当重要,所以我删除了我的评论并重新发布。除非您真的对调试计数始终保持准确充满热情,否则您可以不用原子增量。

标签: c++ raspberry-pi interrupt raspbian


【解决方案1】:

问题在于我放置了wiringPiISR() 函数。由于我在触发引脚的初始触发操作之后放置了它,因此我错过了第一个回波信号,因为 wiringPiISR() 尚未设置。所以随后的触发和回声没有发生。有问题的代码段是

pinMode(2,OUTPUT);
pinMode(3,INPUT);
pullUpDnControl(3,PUD_DOWN);
digitalWrite(2,0);
delayMicroseconds(1);
digitalWrite(2,1);
delayMicroseconds(10);
digitalWrite(2,0);
if(wiringPiISR(3,INT_EDGE_BOTH,&myInterrupt) < 0)
  {
    cerr<<"interrupt error ["<<strerror (errno)<< "]:"<<errno<<endl;
    return 1;
   }

将此段更改为以下内容会触发中断

pinMode(2,OUTPUT);
pinMode(3,INPUT);
pullUpDnControl(3,PUD_DOWN);
if(wiringPiISR(3,INT_EDGE_BOTH,&myInterrupt) < 0)
   {
     cerr<<"interrupt error ["<<strerror (errno)<< "]:"<<errno<<endl;
     return 1;
   }
digitalWrite(2,0);
delayMicroseconds(1);
digitalWrite(2,1);
delayMicroseconds(10);
digitalWrite(2,0);

我相应地修改了前面的代码,最后我得到了下面的代码,它可以很好地工作并以厘米为单位测量距离。

#include<iostream>
#include<wiringPi.h>
#include<errno.h>
#include<string.h>
#include<stdint.h>       //for uint32_t
using namespace std;
uint32_t time1=0,time2=0;
uint32_t time_diff=0;
float Range_cm=0;
volatile int flag=0;
void show_distance(void);

void myInterrupt(void)
 {
    if(flag==0)
      {
            time1=micros();
            flag=1;

      }
    else
      {
            time2=micros();
            flag=0;
            time_diff=time2-time1;
            Range_cm=time_diff/58;
            show_distance();

       }

  }
void show_distance()
  {
    cout<<"distance= "<<time1<<" "<<time2<<" "<<time_diff<<" "<<Range_cm<<" cm\n";
    cout.flush();
    delay(1000);
    digitalWrite(2,0);
    delayMicroseconds(1);
    digitalWrite(2,1);
    delayMicroseconds(10);
    digitalWrite(2,0);

  }

int main(void)
  {
    if(wiringPiSetup()<0)
     {
       cout<<"wiringPiSetup failed !!\n";
     }
    pinMode(2,OUTPUT);
    pinMode(3,INPUT);
    pullUpDnControl(3,PUD_DOWN);
    if(wiringPiISR(3,INT_EDGE_BOTH,&myInterrupt) < 0)
            {
            cerr<<"interrupt error ["<<strerror (errno)<< "]:"<<errno<<endl;
            return 1;
            }
    digitalWrite(2,0);
    delayMicroseconds(1);
    digitalWrite(2,1);
    delayMicroseconds(10);
    digitalWrite(2,0);

    while(1)
    {
    }
    return 0;
 }

【讨论】:

    猜你喜欢
    • 2021-09-11
    • 2013-07-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-20
    • 1970-01-01
    • 2014-10-17
    • 2015-07-19
    • 2016-04-23
    相关资源
    最近更新 更多