C++ 树莓g++;:超声波传感器不工作。。。!

C++ 树莓g++;:超声波传感器不工作。。。!,c++,raspberry-pi,interrupt,raspbian,C++,Raspberry Pi,Interrupt,Raspbian,我编写了下面的程序,在raspberry-pi-Raspbian-wheezy中使用g++与超声波传感器接口,使用接线pi库。但是我无法使其工作。我的代码有任何问题吗???我需要传感器的连续读数。。。 提前谢谢你 #include<iostream> #include<wiringPi.h> #include<errno.h> #include<string.h> #include<stdint.h> //for uint

我编写了下面的程序,在raspberry-pi-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;
        }
#包括
#包括
#包括
#包括
#包括//用于uint32\u t
使用名称空间std;
uint32_t time1=0,time2=0;
int time_diff=0;
浮动范围_cm=0;
void myInterrupt(void)
{

cout问题在于我放置的
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,输出);
pinMode(3,输入);
上拉控制(3,下拉);
数字写入(2,0);
延迟微秒(1);
数字写入(2,1);
延迟微秒(10);
数字写入(2,0);
if(wiringPiISR(3,INT_EDGE_两者和myInterrupt)<0)
{

cerr问题在于我放置的
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,输出);
pinMode(3,输入);
上拉控制(3,下拉);
数字写入(2,0);
延迟微秒(1);
数字写入(2,1);
延迟微秒(10);
数字写入(2,0);
if(wiringPiISR(3,INT_EDGE_两者和myInterrupt)<0)
{

cerr问题在于我放置的
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,输出);
pinMode(3,输入);
上拉控制(3,下拉);
数字写入(2,0);
延迟微秒(1);
数字写入(2,1);
延迟微秒(10);
数字写入(2,0);
if(wiringPiISR(3,INT_EDGE_两者和myInterrupt)<0)
{

cerr问题在于我放置的
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,输出);
pinMode(3,输入);
上拉控制(3,下拉);
数字写入(2,0);
延迟微秒(1);
数字写入(2,1);
延迟微秒(10);
数字写入(2,0);
if(wiringPiISR(3,INT_EDGE_两者和myInterrupt)<0)
{


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