树莓派进阶之路 (030) -Picustom.h(原创)

Posted 极客先锋

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了树莓派进阶之路 (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 参数选择错误\n");
 41     else fprintf(stderr,"wiringPi_init 初始化失败\n");
 42     }
 43   else fprintf(stderr,"wiringPi_init 初始化成功\n");
 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 初始化成功\n");break;
 82     case 1:fprintf(stderr,"模式参数错误,0输入,1输出\n");break;
 83     case 2:fprintf(stderr,"引脚不支持PWM_OUTPUT模式 脉冲输出(请尝试1引脚)\n");break;
 84     case 3:fprintf(stderr,"引脚不支持PWM_OUTPUT模式 (GPIO 时钟)(请尝试7引脚)\n");break;
 85     case 4:fprintf(stderr,"上下拉参数错误,0无,1上,2下\n");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 成功\n");break;
114     case 2:fprintf(stderr,"模式参数错误\n");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 //作者邮箱:[email protected]
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 //作者邮箱:[email protected]
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 //作者邮箱:[email protected]
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 //作者邮箱:[email protected]
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 //作者邮箱:[email protected]
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 //作者邮箱:[email protected]
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

 

以上是关于树莓派进阶之路 (030) -Picustom.h(原创)的主要内容,如果未能解决你的问题,请参考以下文章

树莓派进阶之路 (023) - Windows下用串行连接控制树莓派(转)

树莓派进阶之路 (018) - 树莓派通过filezilla,samba与PC文件共享(转)

树莓派进阶之路 (024) - windows远程桌面连接树莓派通过xrdp服务(转)

树莓派进阶之路 (017) - 基于树莓派的专用摄像头实时监控

树莓派进阶之路 (038) - P2P 文件下载机

树莓派进阶之路 (033) - 开机启动自定义脚本