我编写了以下程序,使用g ++在Rasberry pi Raspbian wheezy中连接超声波传感器,使用接线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;
}
答案 0 :(得分:3)
问题在于我放置了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);
我相应地修改了上面的代码,最后我得到了以下代码,并以cm为单位测量距离。
#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;
}