树莓派进阶之路 (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服务(转)