1. 程式人生 > >樹莓派進階之路 (030) -Picustom.h(原創)

樹莓派進階之路 (030) -Picustom.h(原創)

tchar while 結果 != wiringpi stdio.h 波特率 tput code

寫代碼的時候敢接每次查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(原創)