树莓派外设开发之wiringpi库引用

树莓派外设开发之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库详解

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值