BeagleBone Black板第六课:C++编程控制GPIO基础

BBB板第六课:C++编程控制GPIO基础

在一上课我们通过Shell脚本编程实现了对GPIO端口的简单输出控制,实现对两个LED指示灯的交替点亮和关闭,接下来的一两节课,将通过C++程序来实现Shell脚本的功能。为了实现对应的程序控制,我查阅了好多资料,测试过程中发觉网上的一些程序套用过来总是出现各种各样的编译错误,压根就控制不了BBB板,不知是我的BBB板太新,还是以前的程序太旧。最后还是从头开始,重新研究BBB板的文件系统,找出头文件,找出所有相关的函数,终于实现GPIO的C++程序控制。

先不急于写程序,在这一节课先把一些基础讲解下,是非常重要的,当然C语言高手就不用看了。

一、IO读写函数

输入输出的函数基本上全在头文件stdio.h中定义,具体在/usr/include目录中,这个目录还包括其他头文件,最好仔细看下提供了哪些有效的函数,再结合百度到的知识掌握这些经常用的函数。

1、打开文件fopen()和写入数据fwrite()

Fopen(文件名,打开模式),其中文件名必须是完整路径,使用双引号;打开模式比较多,比较常用就是只读r、读写r+,只写w,函数返回值为文件指针(也叫文件描述符);

fwrite(数据,字节数,写入个数,文件指针),有四个参数,少写一个编译都会出错,其中字节数固定为sizeof(char)或sizeof(int),都是4个字节,对应32位系统,BBB板就是32位系统,我就当做常数来用,这个参数理解了很久,反复实验才编译及实验成功;写入个数,就是实际需要的字符数,比如高低电平1或0就是1个字符,out和in分别为3个和2个字符,长度比数据大才能完整写入,如果写小了,就只能写入前面的几个字符,这个得慢慢理解;文件指针就是打开文件获得的文件指针变量。

2、sleep()延时函数

这个延时函数定义在unistd.h头文件里,我也是慢慢查看BBB板里的头文件才找出来,原来套用网上的一些程序总是出错,头文件也乱列了N个。最后还是自己从BBB板里找出来,确认清楚,所以学习BBB板的文件系统和相关库函数的头文件很重要。

sleep(N秒),使用很简单,参数就是秒,要几秒就写几秒。

3、关闭文件指针fclose()函数

fclose(文件指针),文件打开使用完毕都要关闭,否则在编译执行会报错。

4、文件数据传递读函数

fscanf(文件指针,输出格式,传递变量),通过这个函数把fopen()打开的文件数据传递到变量,BBB板我们使用的变量要定义为字符串数组,输出格式为”%s”,就行了。其他的东西大家自己去挖掘吧。我的课程里主要是把BBB板相关的东西写出来。

二、简单的函数测试

测试前提:先登陆BBB板的终端模式,进入/sys/class/gpio目录下通过echo命令手动打开gpio44端口,因为程序打开端口较复杂,这里只是进行简单的输出测试。

1、读写输出函数实验:点亮和关闭指示灯

#include
<stdio.h>

#define GPIO_DIR
"/sys/class/gpio/gpio44/"

int main()

{

FILE*stream=NULL;

stream=fopen(GPIO_DIR"direction","r+"); /*读写模式打开direction*/

fwrite("out",sizeof(char),3,stream);    /*设置为输出模式*/

fclose(stream);

stream=fopen(GPIO_DIR"value","r+");   /*读写模式打开value*/

fwrite("1",sizeof(char),1,stream);   /*输出高电平1,二极管灯亮*/

fclose(stream);

return 0;

}

把以上程序编译执行后,接在P8.12端口上的二极管指示灯一定点亮了。然后修改程序,输出低电平0,指示灯就关掉了。

fwrite("0",sizeof(char),1,stream);   /*输出低电平0,二极管灯灭*/

还有个问题要说下,就是在BBB板上的编译和执行,比如这个小程序保存为/home/binc/led2.cpp,其中binc目录是我自己在home目录下建立的,专门做实验用的目录,在当前目录下编译的指令是这样的:(led2是编译想得到的可执行程序名,随意写)

/home/binc# g++ -o led2  led2.cpp

运行程序这样执行:(./ 这两字符是必须的,不同于shell脚本用bash led2)

/home/binc# ./led2

注意:如果你的BBB板上编译时提示没有g++命令,可能是环境变量没设置好,那就得把g++命令的全路径写上就可以了。

2、LED灯每秒闪亮1次共5次实验

再编写如下程序,或者修改上一程序led2.cpp,增加个for语句,这里循环5次,你可以根据自己喜欢改多几次,主要是多感受一次,熟悉下相关函数。

#include
<stdio.h>

#include
<unistd.h>

#define GPIO_DIR
"/sys/class/gpio/gpio44/"

int main()

{

FILE *stream=NULL;

int i=0;

stream=fopen(GPIO_DIR"direction","r+");   /*读写模式打开direction*/

fwrite("out",sizeof(char),3,stream);    /*设置为输出模式*/

fclose(stream);

for (i=0;i<5;i++)

{

stream=fopen(GPIO_DIR"value","r+");

fwrite("1",sizeof(char),1,stream);  /*输出高电平1,二极管灯亮*/

sleep(1);     /*延时一秒*/

fclose(stream);

stream=fopen(GPIO_DIR"value","r+");

fwrite("0",sizeof(char),1,stream);  /*输出低电平0,二极管灯灭*/

sleep(1);    /*延时一秒*/

fclose(stream);

}

return 0;

}

BeagleBone Black板第六课:C++编程控制GPIO基础,布布扣,bubuko.com

时间: 2024-08-25 13:46:44

BeagleBone Black板第六课:C++编程控制GPIO基础的相关文章

BeagleBone Black板第五课:Shell脚本编程实验

BBB板第五课:Shell脚本编程实验 在一上课我们通过简单的echo命令测试并控制GPIO端口的高低电平输出,实现对一个LED指示灯的点亮和关闭控制,本节将通过Shell脚本编程,来完成两个LED指示灯的交替闪亮的实验. 实验器材:准备两个二极管指示灯,面包板等 使用GPIO端口P8.12和P8.11两个引脚 我们暂时不借助其他工具软件,直接远程登陆到BBB板的图形桌面,使用内置的Ledfpad编辑器来完成Shell脚本的编程. 远程登陆BBB板图形桌面还记得吧,不记得话参考前面的课程,这里就

BeagleBone Black板第七课:GPIO编程控制

BBB板第七课:GPIO编程控制 在一上课我们通过IO函数做了简单的GPIO端口输出高低电平输出,实现对一个LED指示灯的点亮和关闭控制,本节将通过完整的C++程序,实现第四课Shell脚本的全部功能,实现两个LED指示灯的交替闪亮. 直接通过进入功能程序 1.实现echo 44 > export 打开端口功能 上一课简单测试中,通过手工在BBB板终端模式下打开gpio44端口可通过以下程序实现: #include <stdio.h> #define GPIO_DIR "/sy

BeagleBone Black板第八课:建立Eclipse编程环境

BBB板第八课:建立Eclipse编程环境 最近新建了一个编程环境,感觉到非常方便,分享给大家.之前除了在BBB板远程桌面直接编写shell脚本或C程序外,通过Debain 7.5系统下使用编辑软件也试过,写完程序还是转存到BBB板编译,反正觉得挺麻烦.不熟悉linux是个原因,但没汉化的软件更是个问题.最后重新回来熟悉的XP的环境,根据网上一些点子,安装Eclipse C/C++,没想到用过后感觉非常好,起码现阶段是认可.特别是对我这种初学者来说,真的觉得方便.好用. 我的基本环境是Windo

BeagleBone Black 板第三课:Debian7.5系统安装和远程控制BBB板

BBB板第三课:Debian7.5系统安装和远程控制BBB板 因为BBB板系统是Debian 7.4,据说使用Debian系统可以实现很多BBB板的无缝连接,可以更好的学习和控制BBB板,所以就决定下载Debian7.5系统安装,采用虚拟机的安装方式. 一.系统安装 1.我下载了Debian7.5 32位系统,有三张DVD盘,网上有不少安装资料了,我这里就不详细介绍安装过程了.不过有一点可能很多人都会遇到的问题,就是安装过程中提示插入光盘的问题.虚拟机是Vmware workstation 10

BeagleBone Black板第十课:测试PWM功能

BBB板第十课:测试PWM功能 上一节课我们初步学习了BBB板上ADC数据的读取方法,本节课将把学到的PWM的知识贡献给和我一样的初学者.以下这张彩图来自网上,详细标明了14个PWM和四个定时器的引脚位置.本实验中,我们只测试其中的P8_13引脚,名称为eHRPWM2B. 需要准备的实验工具:一个二极管发光管和数字万用表及其他小线材 一.PWM知识(部分知识直接摘自网上) PWM全称Pulse WidthModulation,脉冲宽度调制,是利用微处理器的数字输出来对模拟电路进行控制的一种非常有

BeagleBone Black板第十一课: PWM子系统简介

BBB板第十一课: PWM子系统简介 查看多达4000多页的AM335X 英文手册,找到其中的15章节PWMSS,我英文学不好,翻译其中的意思真难,建议高手帮翻译一下那4000多页的手册贡献给大家. 在这里简单说下几个专业名词: PWMMSS全称Pulse-Width Modulation Subsystem 脉冲宽度调制子系统,由eHRPWM.eCAP和eQEP三个模块组成,简单的说就是三种工作模式. 下面的图为PWM子系统图(来自4000多页的手册) 1.eHRPWM全称Enhanced H

Linux运维第六课----Linux命令及Linux基础优化

一.替换文件1.已知在/root/data中存在op.txt,如何把/root/afeng/op.txt拷贝到data目录并替换2.1[[email protected] /]# \cp /root/afeng/op.txt /root/data/2.2[[email protected] ~]# /bin/cp /root/data/op.txt /root/afeng/二.vim的快捷键G到达底层gg到达首层o进入下行编辑u撤销:wq 保存并退出:q!强制退出三.设置别名1.为什么设置别名安

BeagleBone Black板第九课:测试读取ADC数据

BBB板第九课:测试读取ADC数据 之前我们初步学习了GPIO的使用方法,接下来认识下BBB板上ADC数据的读取操作,因为用BBB板做外部控制,接收外部传感器的一些模拟数据,模数转换ADC是需要用到的.所以在这里我也测试一下这BBB板的ADC简单功能,以后有深入学习到知识再进行补充. ADC资源引脚,P9_32至P9_40共九个引脚,其中P9_32为电源正极,P9_34为共地,其他七个对应七个ADC输入脚,因为有一个Ain_7估计是内部使用了,所以我们只使用Ain_0至Ain_6这七个ADC.

【C语言探索之旅】 第二部分第六课:创建你自己的变量类型

0 内容简介 1.课程大纲 2.第二部分第六课: 创建你自己的变量类型 3.第二部分第七课预告: 文件读写 课程大纲 我们的课程分为四大部分,每一个部分结束后都会有练习题,并会公布答案.还会带大家用C语言编写三个游戏. C语言编程基础知识 什么是编程? 工欲善其事,必先利其器 你的第一个程序 变量的世界 运算那点事 条件表达式 循环语句 实战:第一个C语言小游戏 函数 练习题 习作:完善第一个C语言小游戏 C语言高级技术 模块化编程 进击的指针,C语言王牌 数组 字符串 预处理 创建你自己的变量