2021-07-09嵌入式学习---树莓派wiringPi库
作者:互联网
1、树莓派wiringPi库
wiringPi是一个很棒的树莓派IO控制库,使用C语言开发,提供了丰富的接口:GPIO控制,中断,多线程,等等
1.安装
进入 wiringPi的github (https://git.drogon.net/?p=wiringPi;a=summary) 下载安装包。点击页面的第一个链接的右边的snapshot,下载安装压缩包。
然后进入安装包所在的目录执行以下命令:
>tar xfz wiringPi-98bcb20.tar.gz //98bcb20为版本标号,可能不同
>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;//每次循环后cmd=10,不至于一直是cmd=1/0
}
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>
初次使用树莓派串口编程,需要配置
/* 修改 cmdline.txt文件 */
>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
/*修改 inittab文件 */
>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);//接收到数据,赋值给cmd
printf("get data: cnmd=%d", cmd);//输出打印
}
//serialPutchar(fd, 'c');//发送数据
serialPuts(fd, "kanxiansen\r\n");//发送字符串
delayMicroseconds(1000000);//延时1秒
}
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
标签:树莓,wiringPi,int,cmd,---,fd,include 来源: https://blog.csdn.net/kangxiansen/article/details/118631214