zoukankan      html  css  js  c++  java
  • 树莓派进阶之路 (030) -Picustom.h(原创)

    写代码的时候敢接每次查wiringPi库函数挺麻烦的,自己wiringPi库封装了一下:

      1 #ifndef __PICUSTOM_H__
      2 #define __PICUSTOM_H__
      3 /**********************************头文件部分************************************/
      4 #include <stdlib.h>
      5 #include <stdio.h>
      6 #include <string.h>
      7 #include <stdint.h> 
      8 #include <stdlib.h>
      9 #include <unistd.h>
     10 #include <wiringPi.h>           //树莓派GPIO库
     11 #include <wiringSerial.h>       //树莓派串口配置
     12 /***********************************变量定义*************************************/
     13 #define BOOLEAN unsigned char
     14 #define INT8U unsigned char
     15 #define INT8S signed char
     16 #define INT16U unsigned short int
     17 #define INT16S signed short int
     18 #define INT32U unsigned int
     19 #define INT32S signed int
     20 /**************************GPIO库函数封装配置基础函数******************************/
     21 /*********wiringPi进行初始化*********/
     22 int wiringPi_init(int mode)
     23 {
     24   int  value;
     25   switch(mode){
     26     case 0:value = wiringPiSetup();break;       //具体管脚定义图和管脚映射
     27     case 1:value = wiringPiSetupGpio();break;   //区别在亍假定程序使用的是Broadcom的GPIO管脚定义,而没有重新映射。
     28     case 2:value = wiringPiSetupPhys();break;   //区别在于允讲程序使用物理管脚定义,仅支持P1接口。
     29     case 3:value = wiringPiSetupSys();break;    //不是直接通过操作硬件来实现(见wiringPi手册)。
     30     default : value = 3;   //模数参数错误
     31   }
     32   return value;
     33 }
     34 /********wiringPi初始化结果********/
     35 void wiringPi_init_errno(int value)
     36 {
     37   int a = 0;
     38   if(value)
     39     {
     40     if(3 == value)printf("wiringPi_init mode 参数选择错误
    ");
     41     else fprintf(stderr,"wiringPi_init 初始化失败
    ");
     42     }
     43   else fprintf(stderr,"wiringPi_init 初始化成功
    ");
     44 }
     45 /*****wiringPi初始化上层调用******/
     46 void wiringPi(int mode,int a)
     47 {
     48   int value = wiringPi_init(mode);
     49   if(a)wiringPi_init_errno(value);
     50 }
     51 /*******GPIO引脚模式设置********/
     52 int GPIO_Pin_init(int pin,int mode,int pud)
     53 {
     54   int a = 0;
     55   switch(mode){
     56     case 0:pinMode(pin,INPUT);break;      //初始化输入引脚
     57     case 1:pinMode(pin,OUTPUT);break;      //初始化输出引脚
     58     case 2:{          //PWM_OUTPUT模式 脉冲输出
     59             if(1 == pin)pinMode(pin,PWM_OUTPUT);
     60             else a = 2;   //引脚不支持PWM_OUTPUT模式 脉冲输出
     61           }break;
     62     case 3:{          //CLOCK 输出模式。(GPIO 时钟)
     63             if(7 == pin)pinMode(pin,GPIO_CLOCK);
     64             else a = 3;   //引脚不支持PWM_OUTPUT模式 (GPIO 时钟)
     65           }break;
     66     default : a =1;   //模式参数错误
     67   }
     68   switch(pud){
     69     case 0:pullUpDnControl(pin,PUD_OFF);break;    //无上拉或下拉电阻
     70     case 1:pullUpDnControl(pin,PUD_UP);break;     //内部上拉至 3.3V
     71     case 2:pullUpDnControl(pin,PUD_DOWN);break;  //内部下拉至地线
     72     default : a = 4;   //上下拉参数错误
     73   }
     74   return(0);
     75 }
     76 /********GPIO引脚结果模式设置********/
     77 int GPIO_Pin_init_errno(int value)
     78 {
     79   int a;
     80    switch(value){
     81     case 0:fprintf(stderr,"GPIO_Pin_init 初始化成功
    ");break;
     82     case 1:fprintf(stderr,"模式参数错误,0输入,1输出
    ");break;
     83     case 2:fprintf(stderr,"引脚不支持PWM_OUTPUT模式 脉冲输出(请尝试1引脚)
    ");break;
     84     case 3:fprintf(stderr,"引脚不支持PWM_OUTPUT模式 (GPIO 时钟)(请尝试7引脚)
    ");break;
     85     case 4:fprintf(stderr,"上下拉参数错误,0无,1上,2下
    ");break;
     86     default : a = 1;
     87   }
     88   return a;
     89 }
     90 /*****GPIO初始化上层调用******/
     91 void GPIO_init(int pin,int mode,int pud,int a)
     92 {
     93   int value =GPIO_Pin_init(pin,mode,pud);
     94   if(a)GPIO_Pin_init_errno(value);
     95 }
     96 
     97 /*************pin数据************/
     98 int GPIO_Pin_operation(int pin,int mode,int value)
     99 {
    100   int a;
    101   switch(mode){
    102     case 0:a = digitalRead(pin);break;      //读数据
    103     case 1:digitalWrite(pin,value);break;   //写数据
    104     default : return a = 2;   //模式参数错误
    105   }
    106   return(a);
    107 }
    108 /********pin状态设置调试********/
    109 int GPIO_Pin_operation_errno(int value)
    110 {
    111    int a;
    112    switch(value){
    113     case 0:fprintf(stderr,"GPIO_Pin_operation 成功
    ");break;
    114     case 2:fprintf(stderr,"模式参数错误
    ");break;
    115     default : a = 2;
    116   }  
    117 }
    118 /********pin状态设置********/
    119 int GPIO_Pin(int pin,int mode,int pud,int a)
    120 {
    121   usleep(1);
    122   int value =GPIO_Pin_operation(pin,mode,pud);
    123   if((a==1)&(value==2))GPIO_Pin_operation_errno(value);
    124   if(value<2)return(value);
    125 }
    126 
    127 
    128 
    129 
    130 /*******************************串口函数部分*************************************/
    131 ////////////////////////////////////////////
    132 //函数名:  init_serial_port
    133 //功能:   初始哈串口
    134 //输入参数:raw为串口的绝对路径,Baud_Rate 为串口的波特率
    135 //返回值:  打开串口的文件描述符号
    136 //作者邮箱:jikexianfeng@outlook.com
    137 ////////////////////////////////////////////
    138 int init_serial_port(const char *raw,int Baud_Rate)
    139 {
    140     return serialOpen(raw,Baud_Rate);
    141 }
    142 
    143 ////////////////////////////////////////////
    144 //函数名:  Serial_data_write_char
    145 //功能:   调用树莓派串口将单个字节写入指定讴备的文件描述符(无内部校验)
    146 //输入参数:fd为串口驱动文件描述符,word 要发送的字符串,
    147 //返回值:  无
    148 //作者邮箱:jikexianfeng@outlook.com
    149 ////////////////////////////////////////////
    150 void Serial_data_write_char(int fd,const char word)
    151 {
    152     serialPutchar(fd,word);
    153 }
    154 ////////////////////////////////////////////
    155 //函数名:  Serial_data_write
    156 //功能:   调用树莓派串口写入字符串(无内部校验)
    157 //输入参数:fd为串口驱动文件描述符,command 要发送的字符串,
    158 //返回值:  写入串口数据的字符长度
    159 //作者邮箱:jikexianfeng@outlook.com
    160 ////////////////////////////////////////////
    161 //int Serial_data_write(int fd,const char *command)
    162 int Serial_data_write(const char input[],int fd)
    163 {
    164     int length = 0;
    165     do{
    166         Serial_data_write_char(fd,input[length]);
    167     }
    168     while(input[length++]!=0x8e);
    169     return (length);
    170 }
    171 ////////////////////////////////////////////
    172 //函数名:  Serial_data_read_char_10
    173 //功能:   读取树莓派串口的单个字节(无内部校验)等待10s
    174 //输出参数:fd为串口驱动文件描述符
    175 //返回值:  读取树莓派串口单个字节的数据
    176 //作者邮箱:jikexianfeng@outlook.com
    177 ////////////////////////////////////////////
    178 INT8U Serial_data_read_char_10(int fd)
    179 {
    180     return (INT8U)serialGetchar(fd);
    181 }
    182 ////////////////////////////////////////////
    183 //函数名:  Serial_data_read_char_0
    184 //功能:   读取树莓派串口的单个字节(无内部校验)无等待
    185 //输出参数:fd为串口驱动文件描述符
    186 //返回值:  读取树莓派串口单个字节的数据
    187 //作者邮箱:jikexianfeng@outlook.com
    188 ////////////////////////////////////////////
    189 INT8U Serial_data_read_char_0(int fd)
    190 {
    191     return (INT8U)serialDataAvail(fd);
    192 }
    193 ////////////////////////////////////////////
    194 //函数名:  Serial_data_read
    195 //功能:   调用树莓派串口读取字符串(无内部校验)
    196 //输出参数:Answer[]储存从串口读取的数据,fd为串口驱动文件描述符
    197 //返回值:  读取串口数据的字符长度
    198 //作者邮箱:jikexianfeng@outlook.com
    199 ////////////////////////////////////////////
    200 int Serial_data_read(unsigned char output[],int fd)
    201 {
    202     int length = 0;
    203     memset(output,0,sizeof(output));
    204     do{
    205         output[length++] = Serial_data_read_char_10(fd);
    206     }while(length < (8+output[3]*256+output[4]-1));
    207     return length;
    208 }
    209 
    210 
    211 
    212 #endif
  • 相关阅读:
    关于给Tomcat设置maxPostSize的问题
    完美激活PyCharm教程
    Tomcat +Nginx+Redis实现session共享
    python 上传多文件
    吸引注意力的动画
    Create React App 安装less 报错
    2020软件工程作业01
    yum用法
    rpm包的管理
    共享依赖库的误移或误删解决办法
  • 原文地址:https://www.cnblogs.com/jikexianfeng/p/7593568.html
Copyright © 2011-2022 走看看