python调用C程序代码
DHT11的驱动使用C语言编写 然后用python调用C的程序 显示温湿度
pycall.py文件如下:
#!/usr/bin/env python
# -*- coding:utf-8 -*- import RPi.GPIO as GPIO
import time
import DHT11 pin=14 while True:
hum,tem=DHT11.read_data(pin)
print('hum:%f, tem:%f' %(hum,tem))
time.sleep(2)
c语言代码如下:
#include <stdio.h>
#include <wiringPi.h>
#include <time.h>
//2019.1.18  时序还没调试完成
//编译使用
//运行需要使用  g++ -Wall -o LEDtest LEDtest.cpp  -lwiringPi
//数据定义 sudo ./a.out
unsigned int U8T_data_H,U8T_data_L,U8RH_data_H,U8RH_data_L,U8checkdata;
unsigned int U8T_data_H_temp,U8T_data_L_temp,U8RH_data_H_temp,U8RH_data_L_temp,U8checkdata_temp;
typedef  unsigned char BOOL;
#ifndef TRUE
#define TRUE 1
#endif
#ifndef FALSE
#define FALSE 0
#endif
#define DHT11_PIN 14
typedef  unsigned short int u8;
typedef unsigned char uint8_t;
typedef  unsigned int u16;
void mdelay(u16 ms);
void udelay(u16 us);
static void DHT11_DataPin_Configure_Output(int pin)
{
	pinMode(pin,OUTPUT);
}
static void DHT11_DataPin_Configure_Input(int pin)
{
	pinMode(pin,INPUT);
}
BOOL DHT11_get_databit(int pin)
{
	int val;
	val=digitalRead (pin);
	if(val == LOW){
		return FALSE;
	}else{
		return TRUE;
	}
}
void DHT11_set_databit(BOOL level,int pin)
{
	if(level == TRUE){
		digitalWrite (pin, HIGH);
	}else{
		digitalWrite (pin, LOW);
	}
}
static uint8_t DHT11_read_byte(int pin)
{
	uint8_t i;
	uint8_t data = 0;
	long k=0;
	for(i = 0; i < 8; i++)
	{
		data <<= 1;
		while((!DHT11_get_databit(pin)));
		delayMicroseconds(35);
		if(DHT11_get_databit(pin)){
			data |= 0x1;
			while(DHT11_get_databit(pin))
			{
				k++;
				if(k>200000)
				{
					//printf("a \r\n"); 
					return 0;
				}
			}
		}else{
} 
	}
	return data;
}
static uint8_t DHT11_start_sampling(int pin)
{
	DHT11_DataPin_Configure_Output(pin);
	//主机拉低18ms? ?
	DHT11_set_databit(FALSE,pin);
	delay(20);
	DHT11_set_databit(TRUE,pin);
	//总线由上拉电阻拉高 主机延时20us
	//udelay(10);
	//udelay(10);
	DHT11_DataPin_Configure_Input(pin);
	delayMicroseconds(50);
	//主机设为输入 判断从机响应信号 
	DHT11_set_databit(TRUE,pin);
DHT11_DataPin_Configure_Input(pin);
//判断从机是否有低电平响应信号 如不响应则跳出,响应则向下运行?? ? ?
	if(!DHT11_get_databit(pin))//T !?? ? ?
	{
		long  k=0;
		//判断从机是否发出 80us 的低电平响应信号是否结束?? ? 
		while((!DHT11_get_databit(pin)))
		{
			k++;
			if(k>100000) {printf("b \r\n");return 0;}
		}
		// printf("DHT11 answers.\r\n");
		//判断从机是否发出 80us 的高电平,如发出则进入数据接收状态
		k=0;
		while((DHT11_get_databit(pin)))
		{
			k++;
			if(k>100000){printf("c \r\n");;return 0;}
		}
			return 1;
	}
return 0;
}
typedef  struct 
{
	unsigned int hh;
	unsigned int hl;
	unsigned int th;
	unsigned int tl;
}d_t;
d_t DHT11_get_data(int pin)
{
	u8 temp;
	d_t res;
	if(DHT11_start_sampling(pin))
	{
		//printf("DHT11 is ready to transmit data\r\n");
		//数据接收状态
		U8RH_data_H_temp = DHT11_read_byte(pin);
U8RH_data_L_temp = DHT11_read_byte(pin);
		res.hh=
		U8T_data_H_temp = DHT11_read_byte(pin);
		res.th=
		U8T_data_L_temp = DHT11_read_byte(pin);
		U8checkdata_temp = DHT11_read_byte(pin);
/* Data transmission finishes, pull the bus high */
		DHT11_DataPin_Configure_Output(pin);
		DHT11_set_databit(TRUE,pin);
		//数据校验
temp=(U8T_data_H_temp+U8T_data_L_temp+U8RH_data_H_temp+U8RH_data_L_temp);
		if(temp==U8checkdata_temp)
		{
			U8RH_data_H=U8RH_data_H_temp;
			res.hh=U8RH_data_H;
			U8RH_data_L=U8RH_data_L_temp;
			res.hl=U8RH_data_L;
			U8T_data_H=U8T_data_H_temp;
			res.th=U8T_data_H;
			U8T_data_L=U8T_data_L_temp;
			res.tl=U8T_data_L;
			U8checkdata=U8checkdata_temp;
//printf("DHT11 tempature %d.%d humidity %d.%d \r\n",U8T_data_H,U8T_data_L,U8RH_data_H,U8T_data_L);
		}
		else
		{
			//printf("checksum failure \r\n");
			res.hh=0;res.hl=0;res.th=0;res.tl=0;
		} 
	}
	else
	{
		printf("DHT11 didn't answer. Sampling failed. \r\n");
	}
	return res;
}
void mdelay(u16 ms)
{
	if(ms != 0){
		delay(ms);
	}
}
void udelay(u16 us)
{
	while(us--);
}
/*
int main(void)
{
	int pin=14
	int res=wiringPiSetupGpio();
	while(1)
	{
		DHT11_get_data(pin);
		mdelay(1200);
	}
}
*/
//
//使用python来调用c写的函数
//
//
#include "Python.h"
static DHT_read_data(PyObject* self,PyObject* args)
{
	int pin=0;
	if(PyArg_ParseTuple(args,"i",&pin)==0)
		return NULL;	//失败
	d_t res=DHT11_get_data(pin);
float hum=res.hh+res.hl*1.0/100;
	float tem=res.th+res.tl*1.0/100;
return Py_BuildValue("dd",hum,tem);
}
static PyMethodDef DHT11_methods[]=
{
	//注册
	{"read_data",DHT_read_data,METH_VARARGS}
};
void initDHT11()
{
	//模块初始化函数
	printf("dht11\n");
	wiringPiSetupGpio();
	Py_InitModule("DHT11",DHT11_methods);
}
//python setup.py build
//sudo python setup.py install
setup.py文件内容如下:
#!/usr/bin/env python
# -*- coding:utf-8 -*- from distutils.core import setup,Extension DHT11_Extension=Extension('DHT11',sources=['main.c'],libraries=['wiringPi']) setup(name='DHT11',ext_modules=[DHT11_Extension])
单单编译一个C文件的话可以使用gcc main.c -lwiringPi
然后编译C文件 需要先编写setup.py 内容如上

python调用C程序代码的更多相关文章
- python调用其他程序或脚本方法(转)
		python运行(调用)其他程序或脚本 在Python中可以方便地使用os模块运行其他的脚本或者程序,这样就可以在脚本中直接使用其他脚本,或者程序提供的功能,而不必再次编写实现该功能的代码.为了更好地 ... 
- 存储过程系列之存储过程sql数据库调用和程序代码调用
		1.存储过程,无参数的存储过程 创建无参数存储存储过程 Create Procedure DCEMREMR_TEMPLATEAs SELECT TOP 10 [FILENAME],[FILETITLE ... 
- python调用exe程序
		最近在做测试,公司的产品做成了exe,让我去测试,C++写的程序啊,我直接用python调用那个exe,也有个坑,必须要到exe在的那个目录下,然后才能调用: import os def main() ... 
- Python的扩展接口[3] -> Matlab引擎 -> 使用 Python 调用 Matlab 程序
		Python - Matlab 目录 Python-Matlab 引擎 Python-Matlab 数组 Python-Matlab 基本操作 Python-Matlab 调用 m 文件 Matlab ... 
- Windows中使用 Python 调用 Matlab 程序
		https://ww2.mathworks.cn/help/matlab/matlab_external/system-and-configuration-requirements.html http ... 
- PHP中实现异步调用多线程程序代码
		本文章详细的介绍了关于PHP中实现异步调用多线程方法,下面我们以给1000个用户发送一封推荐邮件,用户输入或者导入邮件账号了提交服务器执行发送来讲述. 比如现在有一个场景,给1000个用户发送一封推荐 ... 
- python调用java程序--jpype
		官方网站:http://jpype.sourceforge.net/ 官方使用文档:http://jpype.sourceforge.net/doc/user-guide/userguide.html ... 
- [python][matlab]使用python调用matlab程序
		问题引入 在做实验的时候,需要用到python和matlab工具来进行不同的处理,比如在run神经网络的时候,需要使用pytorch框架得到网络的各个参数,在得到参数后需要使用matlab进行聚类规划 ... 
- python 调用exe程序
		#!/usr/bin/python #-*- coding:utf-8 -*- import os, subprocess import tkMessageBox import msg_box def ... 
随机推荐
- [Swift]LeetCode707. 设计链表 | Design Linked List
			Design your implementation of the linked list. You can choose to use the singly linked list or the d ... 
- FAutoTest-微信小程序 / 公众号H5 自动化利器
			X5内核H5自动化背景 近来有很多童靴咨询如何做微信小程序/公众号等H5页面来做自动化,之前写了一篇文章微信小程序自动化测试实践 https://www.cnblogs.com/yyoba/p/945 ... 
- 侯哥的Python分享
			侯哥语录 我曾经是一个职业教育者,现在是一个自由开发者.我希望我的分享可以和更多人一起进步.分享一段我喜欢的话给大家:"我所理解的自由不是想干什么就干什么,而是想不干什么就不干什么.当你还没 ... 
- 【Spark篇】--Spark中的宽窄依赖和Stage的划分
			一.前述 RDD之间有一系列的依赖关系,依赖关系又分为窄依赖和宽依赖. Spark中的Stage其实就是一组并行的任务,任务是一个个的task . 二.具体细节 窄依赖 父RDD和子RDD parti ... 
- 【Docker】(5)---springCloud注册中心打包Docker镜像
			[Docker](5)---springCloud注册中心打包Docker镜像 上一篇文章讲了将镜像推送到远处私有仓库,然后再从私有仓库拉取该镜像的过程.而这里的镜像是直接从Docker拉取的. 所以 ... 
- Jexus~Linux环境下的部署
			Jexus 即 Jexus Web Server,简称JWS,是Linux平台上的一款ASP.NET WEB服务器,是 Linux.Unix.FreeBSD 等非Windows系统架设 ASP.NET ... 
- 17-Flink消费Kafka写入Mysql
			戳更多文章: 1-Flink入门 2-本地环境搭建&构建第一个Flink应用 3-DataSet API 4-DataSteam API 5-集群部署 6-分布式缓存 7-重启策略 8-Fli ... 
- StackExchange.Redis .net core Timeout performing 超时问题
			最近在做的一个项目,用的.net core 2.1,然后缓存用的Redis,缓存相关封装是同事写的,用的驱动是StackExchange.Redis version 2.0.571 ,一直听说这个驱动 ... 
- 创建简单WEB高可用集群
			1. 环境介绍 我这里弄了2个虚拟机,信息如下: node1:192.168.168.201 node2:192.168.168.202 2.配置主机名 [root@node1 ~]# vim /et ... 
- LeetCode专题-Python实现之第7题:Reverse Integer
			导航页-LeetCode专题-Python实现 相关代码已经上传到github:https://github.com/exploitht/leetcode-python 文中代码为了不动官网提供的初始 ... 
