树莓派进阶之路 (030) -Picustom.h(原创)
写代码的时候敢接每次查wiringPi库函数挺麻烦的,自己wiringPi库封装了一下:
#ifndef __PICUSTOM_H__
#define __PICUSTOM_H__
/**********************************头文件部分************************************/
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <stdint.h>
#include <stdlib.h>
#include <unistd.h>
#include <wiringPi.h> //树莓派GPIO库
#include <wiringSerial.h> //树莓派串口配置
/***********************************变量定义*************************************/
#define BOOLEAN unsigned char
#define INT8U unsigned char
#define INT8S signed char
#define INT16U unsigned short int
#define INT16S signed short int
#define INT32U unsigned int
#define INT32S signed int
/**************************GPIO库函数封装配置基础函数******************************/
/*********wiringPi进行初始化*********/
int wiringPi_init(int mode)
{
int value;
switch(mode){
case :value = wiringPiSetup();break; //具体管脚定义图和管脚映射
case :value = wiringPiSetupGpio();break; //区别在亍假定程序使用的是Broadcom的GPIO管脚定义,而没有重新映射。
case :value = wiringPiSetupPhys();break; //区别在于允讲程序使用物理管脚定义,仅支持P1接口。
case :value = wiringPiSetupSys();break; //不是直接通过操作硬件来实现(见wiringPi手册)。
default : value = ; //模数参数错误
}
return value;
}
/********wiringPi初始化结果********/
void wiringPi_init_errno(int value)
{
int a = ;
if(value)
{
if( == value)printf("wiringPi_init mode 参数选择错误\n");
else fprintf(stderr,"wiringPi_init 初始化失败\n");
}
else fprintf(stderr,"wiringPi_init 初始化成功\n");
}
/*****wiringPi初始化上层调用******/
void wiringPi(int mode,int a)
{
int value = wiringPi_init(mode);
if(a)wiringPi_init_errno(value);
}
/*******GPIO引脚模式设置********/
int GPIO_Pin_init(int pin,int mode,int pud)
{
int a = ;
switch(mode){
case :pinMode(pin,INPUT);break; //初始化输入引脚
case :pinMode(pin,OUTPUT);break; //初始化输出引脚
case :{ //PWM_OUTPUT模式 脉冲输出
if( == pin)pinMode(pin,PWM_OUTPUT);
else a = ; //引脚不支持PWM_OUTPUT模式 脉冲输出
}break;
case :{ //CLOCK 输出模式。(GPIO 时钟)
if( == pin)pinMode(pin,GPIO_CLOCK);
else a = ; //引脚不支持PWM_OUTPUT模式 (GPIO 时钟)
}break;
default : a =; //模式参数错误
}
switch(pud){
case :pullUpDnControl(pin,PUD_OFF);break; //无上拉或下拉电阻
case :pullUpDnControl(pin,PUD_UP);break; //内部上拉至 3.3V
case :pullUpDnControl(pin,PUD_DOWN);break; //内部下拉至地线
default : a = ; //上下拉参数错误
}
return();
}
/********GPIO引脚结果模式设置********/
int GPIO_Pin_init_errno(int value)
{
int a;
switch(value){
case :fprintf(stderr,"GPIO_Pin_init 初始化成功\n");break;
case :fprintf(stderr,"模式参数错误,0输入,1输出\n");break;
case :fprintf(stderr,"引脚不支持PWM_OUTPUT模式 脉冲输出(请尝试1引脚)\n");break;
case :fprintf(stderr,"引脚不支持PWM_OUTPUT模式 (GPIO 时钟)(请尝试7引脚)\n");break;
case :fprintf(stderr,"上下拉参数错误,0无,1上,2下\n");break;
default : a = ;
}
return a;
}
/*****GPIO初始化上层调用******/
void GPIO_init(int pin,int mode,int pud,int a)
{
int value =GPIO_Pin_init(pin,mode,pud);
if(a)GPIO_Pin_init_errno(value);
} /*************pin数据************/
int GPIO_Pin_operation(int pin,int mode,int value)
{
int a;
switch(mode){
case :a = digitalRead(pin);break; //读数据
case :digitalWrite(pin,value);break; //写数据
default : return a = ; //模式参数错误
}
return(a);
}
/********pin状态设置调试********/
int GPIO_Pin_operation_errno(int value)
{
int a;
switch(value){
case :fprintf(stderr,"GPIO_Pin_operation 成功\n");break;
case :fprintf(stderr,"模式参数错误\n");break;
default : a = ;
}
}
/********pin状态设置********/
int GPIO_Pin(int pin,int mode,int pud,int a)
{
usleep();
int value =GPIO_Pin_operation(pin,mode,pud);
if((a==)&(value==))GPIO_Pin_operation_errno(value);
if(value<)return(value);
} /*******************************串口函数部分*************************************/
////////////////////////////////////////////
//函数名: init_serial_port
//功能: 初始哈串口
//输入参数:raw为串口的绝对路径,Baud_Rate 为串口的波特率
//返回值: 打开串口的文件描述符号
//作者邮箱:jikexianfeng@outlook.com
////////////////////////////////////////////
int init_serial_port(const char *raw,int Baud_Rate)
{
return serialOpen(raw,Baud_Rate);
} ////////////////////////////////////////////
//函数名: Serial_data_write_char
//功能: 调用树莓派串口将单个字节写入指定讴备的文件描述符(无内部校验)
//输入参数:fd为串口驱动文件描述符,word 要发送的字符串,
//返回值: 无
//作者邮箱:jikexianfeng@outlook.com
////////////////////////////////////////////
void Serial_data_write_char(int fd,const char word)
{
serialPutchar(fd,word);
}
////////////////////////////////////////////
//函数名: Serial_data_write
//功能: 调用树莓派串口写入字符串(无内部校验)
//输入参数:fd为串口驱动文件描述符,command 要发送的字符串,
//返回值: 写入串口数据的字符长度
//作者邮箱:jikexianfeng@outlook.com
////////////////////////////////////////////
//int Serial_data_write(int fd,const char *command)
int Serial_data_write(const char input[],int fd)
{
int length = ;
do{
Serial_data_write_char(fd,input[length]);
}
while(input[length++]!=0x8e);
return (length);
}
////////////////////////////////////////////
//函数名: Serial_data_read_char_10
//功能: 读取树莓派串口的单个字节(无内部校验)等待10s
//输出参数:fd为串口驱动文件描述符
//返回值: 读取树莓派串口单个字节的数据
//作者邮箱:jikexianfeng@outlook.com
////////////////////////////////////////////
INT8U Serial_data_read_char_10(int fd)
{
return (INT8U)serialGetchar(fd);
}
////////////////////////////////////////////
//函数名: Serial_data_read_char_0
//功能: 读取树莓派串口的单个字节(无内部校验)无等待
//输出参数:fd为串口驱动文件描述符
//返回值: 读取树莓派串口单个字节的数据
//作者邮箱:jikexianfeng@outlook.com
////////////////////////////////////////////
INT8U Serial_data_read_char_0(int fd)
{
return (INT8U)serialDataAvail(fd);
}
////////////////////////////////////////////
//函数名: Serial_data_read
//功能: 调用树莓派串口读取字符串(无内部校验)
//输出参数:Answer[]储存从串口读取的数据,fd为串口驱动文件描述符
//返回值: 读取串口数据的字符长度
//作者邮箱:jikexianfeng@outlook.com
////////////////////////////////////////////
int Serial_data_read(unsigned char output[],int fd)
{
int length = ;
memset(output,,sizeof(output));
do{
output[length++] = Serial_data_read_char_10(fd);
}while(length < (+output[]*+output[]-));
return length;
} #endif
树莓派进阶之路 (030) -Picustom.h(原创)的更多相关文章
- 树莓派进阶之路 (029) - 语音识别模块 LD3320(原创)
近几天听朋友有说到LD3320 语音模块,刚好身边有块树莓派3,就在某宝上买了块自带mcu的LD3320 . 准备: 树莓派一个(配置了wiringPi开发环境的详情见本人博客:树莓派进阶之路 (00 ...
- 树莓派进阶之路 (009) - 树莓派ftp脚本(原创)
FTP.sh #!/bin/sh cd echo "彻底卸载原有的ftp" sudo apt-get remove --purge vsftpd #(--purge 选项表示彻底删 ...
- 树莓派进阶之路 (005) - 树莓派Zsh安装脚本(原创)
zsh.sh #!/bin/bash cd #安装zsh sudo apt-get install zsh #查看zsh cat /etc/shells #更改zsh chsh -s /bin/zsh ...
- 树莓派进阶之路 (007) - 树莓派安装cmake3.5 脚本(原创)
cmake3.5安装脚本: #!/bin/bash cd echo "安装make" sudo apt-get install make echo "安装cmake&qu ...
- 树莓派进阶之路 (025) - ubuntu下使用VNC连接树莓派raspberry(转)
转载:http://www.embbnux.com/2014/03/24/on_ubuntu_use_vnc_connect_raspberry/ 参考: http://elinux.org/R ...
- 树莓派进阶之路 (020) - 基于24位AD转换模块HX711的重量称量实验
参考文档:http://www.geek-workshop.com/thread-2315-1-1.html 参考文档:https://wenku.baidu.com/view/e5d5e4e2652 ...
- 树莓派进阶之路 (016) - 通过595驱动4位LED显示系统时间
模块图片,4位共阳极数码管. 我们使用树莓派wiringPi的库来通过74HC595驱动4位数码管: C 代码如下: #include <wiringPi.h> #include < ...
- 树莓派进阶之路 (015) - 树莓派使用DS18B20模块测量温度
参考:http://shumeipai.nxez.com/2013/10/03/raspberry-pi-temperature-sensor-monitors.html 第一步,允许单总线接口 su ...
- 树莓派进阶之路 (013) - 树莓派2/3 C语言使用PWM
我手里面的是树莓派3,系统是Raspbian官方操作系统,已经安装好了wiringPi. PWM简介:脉宽调制(PWM)是指用微处理器的数字输出来对模拟电路进行控制,是一种对模拟信号电平 ...
随机推荐
- 【MySQL】PostgresSQL-MySQL对比
PostgresSQL-MySQL对比 (5 条消息)PostgreSQL 与 MySQL 相比,优势何在? - 知乎 IOC匹配 - 天眼公共空间 - 360企业安全Confluence 调查分析 ...
- c++ 中const的使用
在c++中.const是这么一个东西:假设你希望可以有一些东西是别人不能改动的,这个时候const就起作用了. const 在使用情况例如以下: a.修饰常量 const int a; int con ...
- 前端html用一个表单来映射后台多个对象
public class entity1 { private String id; public String getId() { return id; } public void setId(Str ...
- php5.3升级脚本
在lanmp/wdcp/wdOS的当前版本中,默认的php都是用到5.2.17的版本如需要升级到php5.3的,可使用如下脚本升级(注:此升级无安全漏洞等原因,只为某些追求高版本或应用需求需要高版本, ...
- slf4j、jcl、jul、log4j1、log4j2、logback大总结
1 系列目录 jdk-logging.log4j.logback日志介绍及原理 commons-logging与jdk-logging.log4j1.log4j2.logback的集成原理 slf4j ...
- Android百日程序:绘画程序-画手指路径
本程序实如今一个画布中,用手指绘图的效果. 须要使用的知识: 1 Canvas 画布,动态保存更新当前画面 2 Path 记录并画出手接触屏幕经过的路径 如以下效果图: 仅仅须要依照默认设置新建一个项 ...
- Mycat读写分离、主从切换学习(转)
http://blog.csdn.net/zhanglei_16/article/details/50707487 Mycat读写分离.主从切换学习问题一:分表.分库的优缺点,以及分表无法成为主流分表 ...
- 使用Genymotion模拟器或者手机运行ionic4程序
1.使用命令行 #添加android, 如果是ios ,设置ioscordova platform add android #编译成apkionic build #开启cordova run andr ...
- 保存html代码
function svcode(F) { if (document.all) { var F = $id(F); var E = window.open("", "_bl ...
- 牛客网-《剑指offer》-重建二叉树
题目:http://www.nowcoder.com/practice/8a19cbe657394eeaac2f6ea9b0f6fcf6 C++ /** * Definition for binary ...