1、封装调用函数
#include <stdio.h>
#include <time.h>
#include "wiringPi.h"void initmode(int trig,int echo)
{wiringPiSetupGpio();pinMode(trig,OUTPUT);digitalWrite(trig,LOW);pinMode(echo,INPUT);
}double get_distance(int trig,int echo)
{//触发信号保持50usdigitalWrite(trig,HIGH);delayMicroseconds(10);digitalWrite(trig,LOW);//等待高电平int k=0;while(digitalRead(echo)==LOW){k=k+1;delayMicroseconds(2);if(k>100000)return -1;}//1毫秒clock_t start,end;//开始记录时间start=clock();k=0;while(digitalRead(echo)==HIGH){k=k+1;delayMicroseconds(2);if(k>100000)return -1;}//记录时间,花费的时间end=clock();int t=end-start;return 0.017*t;
}
2、C测试封装代码
#include <stdio.h>
#include <time.h>
#include "wiringPi.h"int main()
{int trig=16;int echo=20;initmode(trig,echo);for(int i=0;i<10;i++){printf("%f\n",get_distance(trig,echo));sleep(1);}
}
3、封装Python模块声明
#include"Python.h"
static PyObject* UIT_init(PyObject* self,PyObject * args)
{int trig;int echo;if(!(PyArg_ParseTuple(args,"ii",&trig,&echo)))return (PyObject*)Py_BuildValue("z",NULL);initmode(trig,echo);return (PyObject*)Py_BuildValue("z",NULL);
}static PyObject* UIT_get_distance(PyObject* self,PyObject * args)
{int trig;int echo;if(!(PyArg_ParseTuple(args,"ii",&trig,&echo)))return (PyObject*)Py_BuildValue("d",0);double distance=get_distance(trig,echo);return (PyObject*)Py_BuildValue("d",distance);
}static PyMethodDef pyFunArr[]={{"init",UIT_init,METH_VARARGS},{"getDistance",UIT_get_distance,METH_VARARGS}
};void initUIT(void)
{Py_InitModule("UIT",pyFunArr);
}
4、编写setup.py文件
#!/usr/bin/env pythonfrom distutils.core import setup,Extension
module=Extension('UIT',libraries=['wiringPi'],sources=['voice.c'])
setup(name='UIT',ext_modules=[module])
然后用python进行编译
python setup.py build
5、Python测试
#!/usr/bin/env python
#coding:utf-8import UIT
import time
trig=16
echo=20
UIT.init(trig,echo)
try:while True:print UIT.getDistance(trig,echo)time.sleep(1)
except KeyboardInterrupt:print 'done\n'