【发布时间】: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