树莓派外设开发之wiringpi库引用
1.树莓派的接口: 驱动
IO口:input output 对主控来说
Input:人体,烟雾,火焰,震动等
Output:继电器,蜂鸣器
PWM:电机调速,灯光调明亮度
语音识别模块,液晶屏
串口uart
IIC
SPI
IIS
其他特定硬件的接口:flash
Nanopi:Linux
S3c2410,2440 6410
Tiny210 tiny4412
海思方案,瑞芯微方案,移远方案
C51,stm32,arduino,wemosD1:没有操作系统(Linux)
2、树莓派引脚
2.树莓派的接口函数wiringpi库
硬件初始化函数
int wiringPiSetup (void) | 返回:执行状态,-1表示失败 | 当使用这个函数初始化树莓派引脚时,程序使用的是wiringPi 引脚编号表。引脚的编号为 0~16需要root权限 |
---|---|---|
int wiringPiSetupGpio (void) | 返回执行状态,-1表示失败 | 当使用这个函数初始化树莓派引脚时,程序中使用的是BCM GPIO 引脚编号表。需要root权限 |
GPIO引脚定义函数
函数 | 配置pin引脚mode(模式) | 配置pin注意 |
---|---|---|
void pinMode (int pin, int mode) | INPUT、OUTPUT、PWM_OUTPUT,GPIO_CLOCK | 配置引脚的IO模式注意:只有wiringPi 引脚编号下的1脚(BCM下的18脚) 支PWM输出只有wiringPi编号下的7(BCM下的4号)支持GPIO_CLOCK输出 |
GPIO引脚控制函数
函数 | 参数1 | 参数2 |
---|---|---|
void digitalWrite (int pin, int value) | 针脚 | LOW(低电平)、HIGH(高电平) |
void pwmWrite (int pin, int value) | 针脚 | 写入到PWM寄存器的值,范围在0~1024之间 |
针脚怎要使用demo:
#include<wiringPi.h>
#include<stdio.h>
#include<stdlib.h>
#define pin7 7
int main()
{
int cmd;
if(wiringPiSetup() == -1){
printf("初始化失败\n");
exit(-1);
}
pinMode (pin7,OUTPUT);
while(1){
printf("请输入0/1:0断开,1接通\n");
scanf("%d",&cmd);
if(cmd == 0){
digitalWrite(pin7,LOW);
}else if(cmd == 1){
digitalWrite(pin7,HIGH);
}
}
}
return 0;
}
时间控制函数
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分钟 |
中断
int wiringPiISR (int pin, int edgeType, void (*function)(void))
返回值:返回负数则代表注册失败
1、pin:接受中断信号的引脚
edgeType:触发的方式。
INT_EDGE_FALLING:下降沿触发
INT_EDGE_RISING:上升沿触发
INT_EDGE_BOTH :上下降都会触发
INT_EDGE_SETUP:编程时用不到。
2、注册的函数会在中断发生时执行
和51单片机不同的是:这个注册的中断处理函数会和main函数并发执行(同时执行,谁也不耽误谁)
当本次中断函数还未执行完毕,这个时候树莓派又触发了一个中断,那么这个后来的中断不会被丢弃,它仍然可以被执行。但是wiringPi最多可以跟踪并记录后来的仅仅1个中断,如果不止1个,则他们会被忽略,得不到执行。
function:中断处理函数的指针,它是一个无返回值,无参数的函数。
串口通信编程
1、串口通讯概述:
串口通讯方式有全双工和半双工;全双工方式换一个场景解析,就是一男一女在聊天,情景中男女双方可以同意时间说话交流;半双工方式则恰恰相反,只能单方在讲话另一方只能听。男女双方交流的语言一直(串口数据格式),说话的快慢适合(串口特率)
2、串口通讯关系的两大条件: 数据格式(数据位、停止位、奇偶校验位)和波特率。
3、串口通讯函数:
打开并初始serialOpen()
#include <wiringSerial.h>
int serialOpen (char *device, int baud)
evice:串口的地址,在Linux中就是设备所在的目录。
默认一般是"/dev/ttyAMA0",我的是这样的。
baud:波特率
返回:正常返回文件描述符,否则返回-1失败。
关闭串口函数serialClose()
void serialClose (int fd)
fd:文件描述符 关闭fd关联的串口
发送一个字符到串口serialPutchar()
void serialPutchar (int fd, unsigned char c)
fd:文件描述符
发送一个字符串到串口serialPuts()
void serialPuts (int fd, char *s)
fd:文件描述符
s:发送的字符串,字符串要以'\0'结尾
发送一个字符串到串口 void serialPrintf()
void serialPrintf (int fd, char *message, …)
fd:文件描述符
message:格式化的字符串
像使用C语言中的printf一样发送数据到串口
读取串口字节数函数serialDataAvail()
int serialDataAvail (int fd)
fd:文件描述符
返回:串口缓存中已经接收的,可读取的字节数,-1代表错误
串口读取函数int serialGetchar (int fd)
int serialGetchar (int fd)
fd:文件描述符
返回:读取到的字符
从串口读取一个字节数据返回。
如果串口缓存中没有可用的数据,则会等待10秒,如果10后还有没,
返回-1;所以,在读取前,做好通过serialDataAvail判断下。
刷新串口缓冲函数serialFlush()
void serialFlush (int fd)
fd:文件描述符
刷新,清空串口缓冲中的所有可用的数据。
当要发送到的数据量过大时,wiringPi建议使用以下函数;这个是Linux下的标准IO库函数,需要包含头文件#include <unistd.h>
发送函数 *size_t write ()
*size_t write (int fd,const void * buf,size_t count)
fd:文件描述符
buf:需要发送的数据缓存数组
count:发送buf中的前count个字节数据
返回:实际写入的字符数,错误返回-1
读取函数*size_t read()
*size_t read(int fd,void * buf ,size_t count);
fd:文件描述符
buf:接受的数据缓存的数组
count:接收的字节数.
返回:实际读取的字符数。
初始使用串口需要配合
第一步:终端输入,修改cmdline.txt
sudo vi /boot/cmdline.txt
将【】里面的删除
dwc_otg.lpm_enable=0 console=tty1 【console=serial0,115200】root=/dev/mmcblk0p2 rootfstype=ext4 elevator=deadline fsck.r
epair=yes rootwait
第二步:修改/*修改 inittab文件 */
>cd /etc/
>sudo vim inittab
注释掉最后一行内容:,在前面加上 # 号
#T0:23:respawn:/sbin/getty -L ttyAMA0 115200 vt100
第三步:sudo reboot 重启
demo:
#include<wiringPi.h>
#include<wiringSerial.h>
#include<stdio.h>
int main()
{
if(wiringPiSetup () == -1){
printf("faill\n");
}
int fd = serialOpen ("/dev/ttyAMA0", 9600);
while(1){
serialPuts(fd,"my name is cheng xu yuan\r\n");
delayMicroseconds (100000);
}
}
运行显示:
学习参考:树莓派wiringPi库详解