树莓派进阶之路 (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
时间: 2024-09-29 06:06:27

树莓派进阶之路 (030) -Picustom.h(原创)的相关文章

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

环境: 硬件:树莓派三代B型, 5MP Camera Board Module 软件:Raspbian 安装树莓派摄像头模块 1.找到 CSI 接口(CSI接口在以太网接口旁边),掀起深色胶带. 2.拉起 CSI 接口挡板. 3.拿起你的摄像头模块,将贴在镜头上的塑料保护膜撕掉.确保黄色部分的PCB(有字的一面)是安装完美的(可以轻轻按一下黄色的部分来保证安装完美). 4.将排线插入CSI接口.记住,有蓝色胶带的一面应该面向以太网接口方向.同样,这时也确认一下排线安装好了之后,将挡板拉下. 在树

树莓派进阶之路 (016) - 通过595驱动4位LED显示系统时间

模块图片,4位共阳极数码管. 我们使用树莓派wiringPi的库来通过74HC595驱动4位数码管: C 代码如下: 1 #include <wiringPi.h> 2 #include <stdio.h> 3 #include <stdlib.h> 4 #include <stdint.h> 5 #include <time.h> 6 #define SCLK 12 7 #define RCLK 13 8 #define DIO 14 9 un

树莓派进阶之路 (036) - 树莓派的音频部分

树莓派MP3输出口功能正常检查 1.安装播放器 sudo apt-get install moc 然后在终端输入:mocp,插入耳机,选择音乐 如果有声音的说明输出正常.如果不正常的话,解决方法有两种: 方法一: 在终端输入 alsamixer,按上下键就可以调节声音. 方法二:mocp 使用命令 mocp` 是一款开源的基于控制台的音乐播放器,也就是说在文本字符界面下使用的音乐播放器,支持 `MP3` 等音乐格式,也支持直接播放来自网络上的音乐文件,占用资源少,使用方便. 因为这是一款基于控制

树莓派进阶之路 (028) - 树莓派SQLite3的安装

MySQL占用内存太大,而SQLite是一款轻量级零配置数据库,非常适合在树莓派和其他嵌入式系统中使用.SQLite文档详细资料丰富,本文不会详细解释SQLite数据库操作的方方面面,只能结合具体场景按需说明.本文介绍的SQLite技巧也可以在其他平台使用,并不局限于树莓派. 安装 SQLite 1 sudo apt-get update 2 sudo apt-get install sqlite sqlite3 3 #如果需要的话还可以顺便安装 PHP 相关组件 4 sudo apt-get

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

本文转载:http://www.cnblogs.com/edgexie/p/6527992.html 在网上看到很多关于windows远程桌面连接树莓派的教程.我也按照教程试过了,遇到了几个坑.特意记录在这. 先说正确的步骤. 1. 必须先安装tightvncserver!!! sudo apt-get install tightvncserver 2. 再安装xrdp服务. sudo apt-get install xrdp 3. 如果开着防火墙ufw , 那么打开服务器上的远程桌面访问端口

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

转载:http://shumeipai.nxez.com/2014/05/04/under-windows-serial-connection-control-raspberry-pi.html 在没有键盘鼠标显示器,没有任何网络设备,甚至连电源和 micro USB 数据线都没有的情况下.如何对树莓派进行操作,甚至安装配置树莓派呢? 如果你有一根USB转TTL串行的数据线,和一台电脑,那这一切都不是问题. 关于USB转TTL串行数据线 通常被称为刷机版.刷机线.中九升级线(一种卫星天线的升级线

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

虽然我们可以很方便的通过ssh譬如putty或者vnc连接操控树莓派,但是毕竟树莓派资源没那么高,在上面编程,调试要吃力的多.所以还是想在pc上编程上传到树莓派或者最好,文件共享,可以直接读写共同的文件那就perfect! 一.filezilla 1,安装vsftpd服务器 (约400KB)sudo apt-get install vsftpd 2,启动ftp服务sudo service vsftpd start 3,编辑vsftdp的配置文件 sudo nano /etc/vsftpd.con

树莓派进阶之路 (012) - 关于Raspberry Pi树莓派无线网卡配置

Raspberry Pi树莓派无线网卡配置[多重方法备选] 要想让树莓派方便操作,肯定需要配置无线网卡,这样可以大大增强树莓派的移动性和便利性,其实配置无线网卡基本就是和普通linux平台下配置无线网卡一样,几种方法大同小异,具体如下: 一.第一种方法:通过配置 /etc/network/interfaces 文件实现sudo nano /etc/network/interfaces修改后文件内容如下:auto lo iface lo inet loopbackiface eth0 inet d

树莓派进阶之路 (032) -字符问题(2) - 用c语言怎样得到一个汉字的GB2312编码(转)

C/C++支持的是ASCII,不过汉字编码中,GB2312与ASCII是兼容的,所以可以在C中获得汉字的GB2312编码 GB2312是两个字节的,第一字节是高八位,第二字节是低八位,比如下面的程序:#include<stdio.h>#include<string.h>int main(){char a[5];strcpy(a,"啊");printf("%XH %XH\n",(unsigned char)a[0],(unsigned char