外设接口详情
树莓派wiringPi库详解 - lulipro - 博客园
一:继电器使用
低电平导通,高电平不导通
#include <stdio.h>
#include <wiringPi.h>
#define SWITCHER 7 //使用gpio7口
int main()
{
int cmd;
if( wiringPiSetup() == -1){
printf("init failed\n");
}
pinMode(SWITCHER,OUTPUT);
digitalWrite(SWITCHER,HIGH);
while(1){
printf("请输入0或1,0关闭开关,1导通开关\n");
scanf("%d",&cmd);
getchar();
if(cmd == 1){
digitalWrite(SWITCHER,LOW);
}else if(cmd == 0){
digitalWrite(SWITCHER,HIGH);
}
cmd = 10;
}
return 0;
}
二:超声波测距
#include <wiringPi.h>
#include <stdio.h>
#include <sys/time.h>
#define Trig 3
#define Echo 4
void ultraInit(void)
{
pinMode(Echo, INPUT);
pinMode(Trig, OUTPUT);
}
float disMeasure(void)
{
struct timeval tv1;
struct timeval tv2;
long start, stop;
float dis;
digitalWrite(Trig, LOW);
delayMicroseconds(2);
digitalWrite(Trig, HIGH);
delayMicroseconds(10); //发出超声波脉冲
digitalWrite(Trig, LOW);
while(!(digitalRead(Echo) == 1));
gettimeofday(&tv1, NULL); //获取当前时间
while(!(digitalRead(Echo) == 0));
gettimeofday(&tv2, NULL); //获取当前时间
start = tv1.tv_sec * 1000000 + tv1.tv_usec; //微秒级的时间
stop = tv2.tv_sec * 1000000 + tv2.tv_usec;
dis = (float)(stop - start) / 1000000 * 34000 / 2; //求出距离
return dis;
}
int main(void)
{
int a=0;
float dis;
if(wiringPiSetup() == -1)
{
printf("setup wiringPi failed !");
return 1;
}
ultraInit();
while(a<10)
{
dis = disMeasure();
printf("distance = %0.2f cm\n",dis);
delay(1000);
a++;
}
return 0;
}
#include <sys/time.h>
struct timeval
{
__time_t tv_sec; /* Seconds. */
__suseconds_t tv_usec; /* Microseconds. */
};
//获取当时时间,分别写到tv和tz中
extern int gettimeofday (struct timeval *__restrict __tv,
__timezone_ptr_t __tz) __THROW __nonnull ((1));
三:串口通信
适用于多机通信,通常有半双工与全双工,而串口属于全双工
全双工与半双工区别:
两个人在吵架,(全双工)两个人可以互骂;(半双工)在一个人骂的时候另一个不能还嘴。
吵架需要在意的是语言与语速
换成串口在意的就是数据格式(数据位、停止位、奇偶校验位)与波特率
在开始前需要先设置串口用来通信
/* 修改 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
#include <stdio.h>
#include <wiringSerial.h>
#include <wiringPi.h>
int main()
{
int fd;
int cmd;
wiringPiSetup();
fd = serialOpen("/dev/ttyAMA0",9600);
while(1){
while(serialDataAvail(fd) != -1){
cmd = serialGetchar(fd);
// serialPutchar(fd,'c');
if(cmd == '1'){
serialPuts(fd,"cccc\r\n");
}
if(cmd == '2'){
serialPuts(fd,"wwwww\r\n");
}
if(cmd == '3'){
serialPuts(fd,"tttttt\r\n");
}
}
}
return 0;
}