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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值