ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

2021-07-09嵌入式学习---树莓派wiringPi库

2021-07-10 16:58:03  阅读:227  来源: 互联网

标签:树莓 wiringPi int cmd --- fd include


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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有