1、树莓派wiringPi库 wiringPi是一个很棒的树莓派IO控制库,使用C语言开发,提供了丰富的接口:GPIO控制,中断,多线程,等等 1.安装 进入 wiringPi的github (https://git.drogon.net/?p=wiringPi;a=summary) 下载安装包。点击页面的第一个链接的右边的snapshot,下载安装压缩包。
然后进入安装包所在的目录执行以下命令:
>tar xfz wiringPi-98bcb20.tar.gz
>cd wiringPi-98bcb20
>./build
验证wiringPi的是否安装成功,输入gpio -v,会在终端中输出相关wiringPi的信息。否则安装失败。
2.查看引脚编号表格
> gpio readall
注意:查看时,将树莓派的USB接口面对自己,这样看才是正确的 3.wiringPi库API大全 使用wiringPi库,包含头文件 #include<wiringPi.h>。
1)硬件初始化函数 使用wiringPi时,你必须在执行任何操作前初始化树莓派,否则程序不能正常工作。 可以调用下表函数之一进行初始化,它们都会返回一个int , 返回 -1 表示初始化失败。 2)通用GPIO控制函数 树莓派控制继电器 继电器: VCC----3.3V GND—0V(GND) IN-------GPIO 7 继电器工作原理:信号低电平导通,高电平断开
#include <wiringPi.h>
#include <stdio.h>
#define SWITCHER 7
int main()
{
int cmd;
if(wiringPiSetup() == 1){
printf("setuop failed\n");
}
pinMode(SWITCHER, OUTPUT);
digitalWrite(SWITCHER, HIGH);
while(1){
printf("input your nu: 0 off 1 on\n");
scanf("%d", &cmd);
getchar();
if(cmd == 1){
digitalWrite(SWITCHER, LOW);
}else if(cmd == 0){
digitalWrite(SWITCHER, HIGH);
}else{
printf("input error\n");
}
cmd = 10;
}
return 0;
}
3)时间控制函数 4)中断 wiringPi提供了一个中断处理注册函数,它只是一个注册函数,并不处理中断。他无需root权限。 5)softPwm,软件实现的PWM 树莓派硬件上支持的PWM输出的引脚有限,为了突破这个限制,wiringPi提供了软件实现的PWM输出API。 需要包含头文件:#include <softPwm.h> 编译时需要添pthread库链接 -lpthread 6)多线程 wiringPi提供了简单的Linux系统下的通用的 Posix threads线程库接口来支持并发。 凡是涉及到多线程编程,就会涉及到线程安全的问题,多线程访问同一个数据,需要使用同步锁来保障数据操作正确性和符合预期。 当A线程锁上 锁S 后,其他共用这个锁的竞争线程,只能等到锁被释放,才能继续执行。 成功执行了piLock 函数的线程将拥有这把锁。其他线程想要拥有这把锁必须等到这个线程释放锁,也就是这个线程执行piUnlock后。 同时要扩展的知识是:volatile 这个C/C++中的关键字,它请求编译器不缓存这个变量的数据,而是每次都从内存中读取。特别是在多线程下共享放变量,必须使用volatile关键字声明才是保险的。
7)串口通信 使用时需要包含头文件:#include <wiringSerial.h> 初次使用树莓派串口编程,需要配置
>cd /boot/
>sudo vim cmdline.txt
删除【】之间的部分
dwc_otg.lpm_enable=0 【console=ttyAMA0,115200】 kgdboc=ttyAMA0,115200 console=tty1 root=/dev/mmcblk0p2 rootfstype=ext4 elevator=deadline rootwait
>cd /etc/
>sudo vim inittab
注释掉最后一行内容:,在前面加上 # 号
#T0:23:respawn:/sbin/getty -L ttyAMA0 115200 vt100
sudo reboot 重启
串口通信
#include <wiringSerial.h>
#include <wiringPi.h>
#include <stdio.h>
int main()
{
int fd;
int cmd;
wiringPiSetup();
fd = serialOpen("/dev/ttyAMA0", 9600);
while(1){
if(serialDataAvail(fd) != -1){
cmd = serialGetchar(fd);
printf("get data: cnmd=%d", cmd);
}
serialPuts(fd, "kanxiansen\r\n");
delayMicroseconds(1000000);
}
serialClose(fd);
return 0;
}
树莓派和语音模块通信
#include <wiringSerial.h>
#include <wiringPi.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
int main()
{
int fd;
char cmd[128] = {'/0'};
int nread;
wiringPiSetup();
fd = serialOpen("/dev/ttyAMA0", 9600);
while(1){
nread = read(fd, cmd, sizeof(cmd));
if(strlen(cmd) == 0){
printf("超时\n");
continue;
}
if(strstr(cmd, "open") != NULL){
printf("open light\n");
}
if(strstr(cmd, "close") != NULL){
printf("close light\n");
}
memset(cmd, '\0', sizeof(cmd)/sizeof(char));
}
return 0;
}
参考资料https://www.cnblogs.com/lulipro/p/5992172.html
|