一、wiringPi 的安装
参考文献:
https://www.cnblogs.com/lulipro/p/5992172.html
进入 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 如果有输出信息就安装成功,如果提示指令不认识就安装失败。
二、查看引脚表格
在控制台输入以下命令:
gpio readall
会出现以下表格:
三、wiringPi 库 API
硬件初始化函数
int wiringPiSetup(void) | 返回值:执行状态,失败返回 -1 | 当使用这个函数初始化树莓派引脚时,程序使用的是wiringPi 引脚编号表。 引脚标号是 1-16 需要 root 权限 |
int wiringPiSetupGpio(void) | 返回值:执行状态,失败返回 -1 | 当使用这个函数初始化树莓派引脚时,程序使用的是 BCM GPIO引脚编号表。 需要 root 权限 |
通用 gpio 控制函数(常用)
void pinMode(int pin,int mode) | pin :指定的引脚 mode :指定引脚的 io 模式 可取的值:INPUT、OUTPUT、 PWM_OUTPUT、GPIO_CLOCK | 作用:配置引脚的 IO 模式 注意:只有 wiringPi 引脚下的 1 脚(BCM下 的18脚)支持PWM输出 只有wiringPi 引脚下的 7 脚(BCM 下的 4 脚)支持GPIO_CLOCK输出 |
int digitalWrite(int pin,int value) | pin :指定的引脚 value:引脚输出的电平值 可取的值:HIGH、LOW分别代表 高电平低电平 | 让一个已经配置为输出模式的引脚,输出指定的电平 |
int digitalRead (int pin) | pin:读取的引脚 返回:引脚上的电平,可以是LOW HIGH 之一 | 读取一个引脚的电平值 LOW HIGH ,返回 |
时间控制函数
unsigned int millis (void) | 这个函数返回 一个 从你的程序执行 wiringPiSetup 初始化函数(或者wiringPiSetupGpio ) 到 当前时间 经过的 毫秒数。 返回类型是unsigned int,最大可记录 大约49天的毫秒时长。 |
unsigned int micros (void) | 这个函数返回 一个 从你的程序执行 wiringPiSetup 初始化函数(或者wiringPiSetupGpio ) 到 当前时间 经过的 微秒数。 返回类型是unsigned int,最大可记录 大约71分钟的时长。 |
【常用】void delay (unsigned int howLong) | 将当前执行流暂停 指定的毫秒数。因为Linux本身是多线程的,所以实际暂停时间可能会长一些。 参数是unsigned int 类型,最大延时时间可达49天 |
【常用】void delayMicroseconds (unsigned int howLong) | 将执行流暂停 指定的微秒数(1000微秒 = 1毫秒 = 0.001秒)。 因为Linux本身是多线程的,所以实际暂停时间可能会长一些。参数是unsigned int 类型,最大延时时间可达71分钟 |
串口通信
使用时需要包含头文件:#include <wiringSerial.h>
int serialOpen(char *device, int baud) | device:串口的地址,在 Linux 中就是设备所在目录 默认一般是"/dev/ttyAMA0",我的是这样的。 baud:波特率 返回:正常返回文件描述符,失败返回-1 | 打开并初始串口 |
int serialOpen(char *device, int baud) | device:串口的地址,在 Linux 中就是设备所在目录 默认一般是"/dev/ttyAMA0",我的是这样的。 baud:波特率 返回:正常返回文件描述符,失败返回-1 | 打开并初始串口 |
void serialClose (int fd) | fd:文件描述符 | 关闭fd关联的串口 |
void serialPutchar (int fd, unsigned char c) | fd:文件描述符 c:要发送的数据 | 发送一个字节数据到串口 |
void serialPuts (int fd, char *s) | fd:文件描述符 s:发送的字符串,字符串以'\0'结尾 | 发送一个字符串数据到串口 |
int serialDataAvail(int fd) | fd:文件描述符 返回:串口缓存中已经接收到的,可读取的字节数,-1 代表错误 | 获取串口缓存中可用的字节数 |
int serialGetchar(int fd) | fd:文件描述符 返回:读取到的字符 | 从串口读取一个字节数据返回。 如果串口缓存中没有可用的数据,会等待10s ,如果10s后还是没有,则返回-1 所以,读取前,最好通过serialDataAvail 判断一下 |
*size_t read(int fd,void * buf ,size_t count); | fd:文件描述符 buf:接收数据缓存的数组 count:接收的字节数 返回值:实际读取的字节数 | 这是Linux 下标准IO口函数,需要包含头文件 #include <unistd.h> 当要接收的数据量大的时候wiringPi 建议用这个函数 |
Linux有个特性:一切皆文件,设备虽然是硬件,但在Linux中还是以未见形式存在(在根目录的 /dev 目录下)。例如:fb0(from bufer0)显示器、mem(memory内存)、ram(磁盘)、tty(例如secureCRT这个终端就是一个tty)
初次使用树莓派串口编程,需要配置。我开始搞了很久,以为是程序写错了 还一直在调试。。
这个过程就是配置串口让串口来用做通信
/* 修改 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 重启