文章目录
- wiringPi库
- 震动传感器
- 定时器
- II2C
- 串口
前言
为什么我们要跑ARM+Linux?
因为在Linux内核下帮我们完成了很多底层的一些东西,我们在应用时常常只需要调用就行了,且Linux 开源,移植性好,可裁剪软硬件,功能强大。
一、wiringPi库
在Linux上进行arm开发,往往会用到GPIO,串口,定时器....,这些特定的功能接口,就是由wiringPi库所提供的。
wiringPi下载:wget https://unicorn.drogon.net/wiringpi-2.46-1.deb
二、震动传感器
#include <stdio.h>
#include <wiringPi.h>
#include <unistd.h>
#define PIN 0
void main()
{
wiringPiSetup();//初始化wiringpi库
pinMode(PIN,INPUT);//设置成输入模式
digitalWrite(PIN,HIGH);//写入电平
while(1)
{
usleep(500000);//每隔500毫秒读一次
if(digitalRead(PIN) == 0)//读取引脚电平,如果是低电平,执行里面的内容
{
printf("产生震动\n");
}
}
}
三、定时器
#include <stdio.h>
#include <signal.h>
/*
* struct itimerval
* {
struct timeval it_interval; 计时器的初始值,一般基于这个初始值来加或者来减,看控制函数的参数配置
struct timeval it_value; 多久启动定时器
};
*/
/*
* struct timeval {
__time_t tv_sec; Seconds.
__suseconds_t tv_usec; Microseconds.
};
*/
/*int setitimer (__itimer_which_t __which, const struct itimerval *__restrict __new, struct itimerval *__restrict __old) 设置定时方式
which:三种类型
ITIMER_REAL //数值为0,计时器的值实时递减,发送的信号是SIGALRM。
ITIMER_VIRTUAL //数值为1,进程执行时递减计时器的值,发送的信号是SIGVTALRM。
ITIMER_PROF //数值为2,进程和系统执行时都递减计时器的值,发送的信号是SIGPROF。
很明显,这边需要捕获对应的信号进行逻辑相关处理 signal(SIGALRM,signal_handler);
返回说明:
成功执行时,返回0。失败返回-1
*/
void handler()
{
printf("hello world\n");
}
void main()
{
struct itimerval t1;//设置定时器结构体
t1.it_interval.tv_sec = 1;//设置多少秒
t1.it_interval.tv_usec = 0;//设置多少微秒
t1.it_value.tv_sec = 1;//设置多少秒后启动
t1.it_value.tv_usec = 0;
if(setitimer(ITIMER_REAL,&t1,NULL) == -1 )
{
printf("error\n");
}
signal(SIGALRM,handler);//捕捉到超时的信号,去做handlr的事情,一个进程只有一个定时器
while(1);
}
四、II2C
在wiringPi库里面提供了非常多的例程代码,我们可以用于修改,最主要是Linux下一切皆文件,使用II2的时候一定要打开它的设备文件,编译的时候如果不知道自己该指定什么库,直接看例程里面makefile用的什么库。
#include <errno.h>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <stdint.h>
#include "oled.h"
#include "font.h"
int oled_Show(struct display_info *disp)
{
int i;
char buf[100];
oled_putstrto(disp, 0, 9+1, "Welcome to");//写内容
disp->font = font1;//设置字体
oled_send_buffer(disp);//写入到缓冲区
return 0;
}
int main(int argc, char **argv)
{
int e;
char filename[32];
struct display_info disp;
if (argc < 2)
{
perror("argc");
return -1;
}
memset(&disp, 0, sizeof(disp));
sprintf(filename, "%s", argv[1]);
disp.address = OLED_I2C_ADDR; //地址
disp.font = font2;//字体
e = oled_open(&disp, filename);//打开驱动设备
e = oled_init(&disp);//初始化
return 0;
}
五、串口
打开串口文件,配置相对应的波特率...文章来源:https://www.toymoban.com/news/detail-530153.html
#include <stdio.h>
#include <string.h>
#include <wiringPi.h>
#include <wiringSerial.h>
#include <stdlib.h>
#include <unistd.h>
#include <pthread.h>
int fd;
void * handler(void * argc)
{
char buf[128]={'\0'};
int cnt;
while(1)
{
memset(buf,'\0',sizeof(buf));
cnt = serialDataAvail(fd);
if(cnt > 0)
{
read(fd,buf,cnt);
printf("read:%s\n",buf);
}
}
}
void main()
{
wiringPiSetup();
pthread_t t1;
char buf[128]={'\0'};
fd = serialOpen("/dev/ttyS5",115200);//打开串口 配置波特率
pthread_create(&t1,NULL,handler,NULL);
while(1)
{
memset(buf,'\0',sizeof(buf));
printf("send->");
gets(buf);
serialPuts(fd,buf);
}
}
文章来源地址https://www.toymoban.com/news/detail-530153.html
到了这里,关于香橙派外设开发的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!