C++ 树莓g++;:超声波传感器不工作。。。!
我编写了下面的程序,在raspberry-pi-Raspbian-wheezy中使用g++与超声波传感器接口,使用接线pi库。但是我无法使其工作。我的代码有任何问题吗???我需要传感器的连续读数。。。 提前谢谢你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
#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)
{
cerrIsmyInterrupt
功能是否真正从硬件中断运行?中断功能应该简单快速。延迟与快速相反。最好设置一个标志,让非中断代码检查标志并执行所需的任何操作。至于您的问题,请您更具体一点?只是说“它不起作用”不说它如何工作是不够的。@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
。它是否会增加?如果是,则您的问题在于中断处理程序。如果不是,则您的问题在于您的中断没有增加