Orangepi全志开发学习

目录

1刷机和系统启动

2基于官方外设开发

3蜂鸣器BB响

4超声波测距

超声波测距代码编程实现

5 SG90舵机转向(5v供电)

6 IIC协议-OLED屏应用(IIC协议:在上官一号单片机章节有详细讲解)

OLED屏幕显示内容

 Sourceinsight阅读库源码研究OLED屏幕(建议多听一次)

OLED屏幕显示自己想要的字符

wiringPi串口开发及优化(串口简介:上官一号单片机教程)

wiringPi库串口源码解读

不用wiringPi库实现串口通信

语音刷抖音

Linux的热拔插UDEV机制(Linux系统编程相关)(面试可用)

SQLite数据库

SQL指令:表创建和数据添加、表更新查询添加列

SQLite的编程操作

打开创建关闭数据库及错误提示 

 C代码执行sql语句

C代码建表和插入数据

SQLite数据库其他操作及总结

Linux环境下的python

Linux安装python环境


1刷机和系统启动

登录系统、修改登陆密码

网络配置:命令扫描周围的WIFI热点 nmcli dev wifi

命令接入网络 nmcli dev wifi connect TP-LINK_3E30 password 18650711783
查看 IP 地址 ip addr show wlan0/ifconfig

修改开发板内核启动日志级别(后续如果内核启动失败,就无法获悉故障原因;方便查看整个内核启动的过程日志)

SSH登陆开发板(免去连接usb转ttl线)!!!指定名字处必须为orangepi!!!

2基于官方外设开发

wiringPi外设SDK安装

外设库查看针脚的界面

3蜂鸣器BB响

修改vim中tab为四个空格:set tabstop=4

修改vim中的自动缩进为四个空格:set shiftwidth=4

vim编辑器显示行数:set nu

创建文件夹,移动(改名)、复制文件到新的文件夹:mkdir,mv、cp(注意命令参数的数量:cp 被复制的文件 复制到的路径)(在Linux下.表示当前目录)

开发板针脚说明

不能直接gcc+文件名(.c为后缀)(ldlibs:链接库),正确写法:gcc+文件名+ldlibs

写成一个linux下的脚本(.sh为后缀),即:将(gcc+文件名+ldlibs)加入到脚本中

.sh一开始没有权限,chmod +x +文件名:给文件增加运行权限

a.out的运行需要超级用户权限

vi+路径:查看路径下的文件名

  1 #include <stdio.h>
  2 #include <wiringPi.h>
  3 #include<unistd.h>
  4
  5 #define BEEP 0   //设置针脚0为蜂鸣器的控制引脚
  6
  7 int main (void)
  8 {
  9
 10         wiringPiSetup () ;//初始化wiringPi库
 11
 12         pinMode (BEEP, OUTPUT) ;//设置IO口的输入输出
 13         while(1){
 14                 sleep(1);
 15                 usleep(100000);
 16                 digitalWrite (BEEP, HIGH) ; //设置IO口输出低电平,蜂鸣器响
 17                 sleep(1);
 18                 usleep(100000);
 19                 digitalWrite(BEEP,LOW);
 20         }
 21         return 0;
 22 }

编写shell脚本,给脚本添加参数:

  1 echo $0
  2 echo $1
  3 gcc $1 -lwiringPi -lwiringPiDev -lpthread -lm -lcrypt -lrt

4超声波测距

%d就是输出int

%ld是long int

%lld是long long int

Linux算时差方法(gettimeofday):可用于程序运行效率比较

  1 #include<stdio.h>
  2 #include<sys/time.h>
  3
  4 //int gettimeofday(struct timeval *tv,struct timezone *tz)
  5
  6 void cntTest(){
  7     int i,j;
  8
  9     for(i=0;i<100;i++)
 10         for(j=0;j<1000;j++);
 11 }
 12
 13 int main()
 14 {
 15     struct timeval timestart;
 16     struct timeval timestop;
 17
 18     gettimeofday(&timestart,NULL);
 19     cntTest();
 20     gettimeofday(&timestop,NULL);
 21
 22     long diffTime=1000000*(timestop.tv_sec-timestart.tv_sec)+(timestop.tv_use    c-timestart.tv_usec);
 23
 24     printf("H6 count 10w time=%ld\n",diffTime);
 25
 26     return 0;
 27 }

超声波测距代码编程实现

C语言中的fprintf和printf区别在哪?(58条消息) C语言中的fprintf和printf区别在哪?_fprintf和printf的区别_ericbars的博客-CSDN博客

Linux下的stdin,stdout和stderr的理解

【Linux基础】linux下的stdin,stdout和stderr理解 - 李子恒 - 博客园 (cnblogs.com)

  1 #include<stdio.h>
  2 #include<sys/time.h>
  3 #include<wiringPi.h>
  4 #include<stdlib.h>
  5 #include<unistd.h>
  6
  7 #define Trig 0
  8 #define Echo 1
  9
 10 double getDistance()
 11 {
 12     double dis;
 13
 14     struct timeval start;
 15     struct timeval stop;
 16
 17     pinMode(Trig,OUTPUT);
 18     pinMode(Echo,INPUT);
 19
 20     digitalWrite(Trig,LOW);
 21     usleep(5);
 22
 23     digitalWrite(Trig,HIGH);
 24     usleep(10);
 25     digitalWrite(Trig,LOW);
 26
 27     while(!digitalRead(Echo)){
 28         gettimeofday(&start,NULL);
 29     }
 30         while(digitalRead(Echo)){
 31             gettimeofday(&stop,NULL);
 32         }
 33         long diffTime=1000000*(stop.tv_sec-start.tv_sec)+(stop.tv_usec-start.    tv_usec);
 34         printf("diffTime = % ld\n",diffTime);
 35         dis=(double)diffTime/1000000*34000/2;
 36
 37         return dis;
 38
 41 }

 43 int main()
 44 {
 45     double dis;
 46
 47     if(wiringPiSetup()==-1){
 48         fprintf(stderr,"%s","initWiringPi error");
 49         exit(-1);
 50     }
 51
 52     while(1){
 53         dis=getDistance();
 54         printf("dis=%lf\n",dis);
 55         usleep(500000);
 56     }
 57     return 0;
 58 }
 59

5 SG90舵机转向(5v供电)

控制转角:用不同的波形(高低电平的不同比例)对应不同的旋转角度

Linux定时器(itimerval结构体以及函数setitimer

static int 与 int 的区别?(59条消息) static int 与 int 的区别_Baileys0530的博客-CSDN博客

perror函数使用详解?(60条消息) C语言 | perror函数使用详解_"perror(\"fopen:\");"_嵌入式大杂烩的博客-CSDN博客

  //程序启动后1s后启动定时器,然后每间隔1s输出一个hello
  1 #include<stdio.h>
  2 #include<sys/time.h>
  3 #include<stdlib.h>
  4 #include<signal.h>
  5
  6 static int i;
  7
  8 void signal_handler()
  9 {
 10     i++;
 11     if(i==2000){//2000*0.5=1000ms=1s
 12         printf("hello\n");
 13         i=0;
 14     }
 15 }
 16
 17 int main()
 18 {
 19
 20     struct itimerval itv;
 21
 22     //设定定时时间
 23     itv.it_interval.tv_sec=0;
 24     itv.it_interval.tv_usec=500;//高电平维持0.5ms
 25
 26     //设定开始生效,启动定时器的时间
 27     itv.it_value.tv_sec=1;//系统运行后1s后,定时器启动
 28     itv.it_value.tv_usec=0;
 29
 30     //设定定时方式
 31     if(-1==setitimer(ITIMER_REAL,&itv,NULL)){
 32         perror("error");
 33         exit(-1);
 34     }
 35
 36     //信号处理
 37     signal(SIGALRM,signal_handler);
 38     while(1);
 39
 40     return 0;
 41 }

  //linux舵机转向不同角度
  1 #include<stdio.h>
  2 #include<sys/time.h>
  3 #include<stdlib.h>
  4 #include<signal.h>
  5 #include<wiringPi.h>
  6
  7 #define SG90Pin 5
  8
  9 int angle;
 10
 11 static int i=0;
 12
 13 void signal_handler(int signum)
 14 {
 15     if(i<=angle){
 16     digitalWrite(SG90Pin,HIGH);
 17     }
 18     else{
 19     digitalWrite(SG90Pin,LOW);
 20     }
 21
 22
 23     if(i==40){//40*0.5=20ms
 24         i=0;
 25     }
 26     i++;
 27 }
 28
 29 int main()
 30 {
 31
 32     struct itimerval itv;
 33     angle=0;
 34     wiringPiSetup();
 35     pinMode(SG90Pin,OUTPUT);
 36
 37     //设定定时时间
 38     itv.it_interval.tv_sec=0;
 39     itv.it_interval.tv_usec=500;//高电平维持0.5ms
 40
 41     //设定开始生效,启动定时器的时间
 42     itv.it_value.tv_sec=1;//系统运行后1s后,定时器启动
 43     itv.it_value.tv_usec=0;
 44
 45     //设定定时方式
 46     if(-1==setitimer(ITIMER_REAL,&itv,NULL)){
 47         perror("error");
 48         exit(-1);
 49     }
 50
 51     //信号处理
 52     signal(SIGALRM,signal_handler);
 53     while(1){
 54     printf("input angle: 1-0 2-45 3-90 4-135");
 55     scanf("%d",&angle);
 56     }
 57     return 0;
 58 }

6 IIC协议-OLED屏应用(IIC协议:在上官一号单片机章节有详细讲解)

Linux系统:与51/32单片机系统相比,已内置IIC协议,让用户将重点放在应用层,而不是硬件底层

SCL:时钟线 SDA:信号线/数据线

Linux 一切皆文件,每个硬件设备 对应 一个文件,由驱动程序提供映射
开始测试 i2c , 首先安装 i2c-tools
sudo apt-get install i2c-tools
查看OLED屏幕地址:sudo i2cdetect -y 3

OLED屏幕显示内容

 

 Sourceinsight阅读库源码研究OLED屏幕(建议多听一次)

SourceInsight界面

 OLED屏(Linux文件操作):open(打开文件),read,write,iocontrol

OLED屏幕显示自己想要的字符

 12 #include <errno.h>
 13 #include <string.h>
 14 #include <stdio.h>
 15 #include <stdlib.h>
 16 #include <time.h>
 17 #include <stdint.h>
 18
 19 #include "oled.h"
 20 #include "font.h"
 21
 22 int oled_show(struct display_info *disp) {
 23     int i;
 24     char buf[100];
 25
 26     oled_putstrto(disp, 0, 9+1, "Welcome       to");
 27     disp->font = font1;
 28     oled_putstrto(disp, 0, 18, " WilsonFung ");//(disp,x,y,content)
 29     disp->font = font1;
 30
 31     oled_send_buffer(disp);
 32     return 0;
 33 }
 34
 35 void show_error(int err, int add) {
 36     //const gchar* errmsg;
 37     //errmsg = g_strerror(errno);
 38     printf("\nERROR: %i, %i\n\n", err, add);
 39     //printf("\nERROR\n");
 40 }
 41
 42 void show_usage(char *progname) {
 43     printf("\nUsage:\n%s <I2C bus device node >\n", progname);
 44 }
 45
 46 int main(int argc, char **argv) {
 47     int e;
 48     char filename[32];
 49     struct display_info disp;
 50
 51     if (argc < 2) {
 52         show_usage(argv[0]);
 53
 54         return -1;
 55     }
 56
 57     memset(&disp, 0, sizeof(disp));
 58     sprintf(filename, "%s", argv[1]);
 59     disp.address = OLED_I2C_ADDR;
 60     disp.font = font2;
 61
 62     e = oled_open(&disp, filename);
 63     e = oled_init(&disp);
 64     oled_show(&disp);
 65     return 0;
 66 }

wiringPi串口开发及优化(串口简介:上官一号单片机教程)

修改了原始代码Serial.c中发送(sendhandler)和接受信息(Revhandler)的部分,使用线程来重写了这两部分

  1 /*
  2  * serialTest.c:
  3  */
  4
  5 #include <stdio.h>
  6 #include <string.h>
  7 #include <errno.h>
  8 #include<stdlib.h>
  9 #include <wiringPi.h>
 10 #include <wiringSerial.h>
 11 #include<pthread.h>//线程头文件
 12
 13 int fd;
 14
 15 void* Sendhandler()
 16 {
 17     char *sendBuf;
 18     sendBuf=(char*)malloc(32*sizeof(char));
 19
 20     while(1){
 21         memset(sendBuf,'\0',32*sizeof(char));
 22         scanf("%s",sendBuf);
 23         while(*sendBuf){
 24             serialPutchar (fd, *sendBuf++);
 25         }
 26     }
 27 }
 28
 29 void* Revhandler()
 30 {
 31
 32     while(1){
 33         while (serialDataAvail (fd))//接收数据
 34         {
 35             printf ("%c", serialGetchar (fd)) ;
 36             fflush (stdout) ;
 37         }
 38     }
 39
 40 }
 41
 42 int main ()
 43 {
 44     int count ;
 45     unsigned int nextTime ;
 46
 47     pthread_t idSend;//线程
 48     pthread_t idRev;
 49
 50     if ((fd = serialOpen ("/dev/ttyS0", 115200)) < 0)//在本机zho上需要修改为ttyS0.可选项为ttyS0,ttyS1,ttyS5
 51     {
 52         fprintf (stderr, "Unable to open serial device: %s\n", strerror (errno)) ; 
 53         return 1 ;
 54     }
 55     pthread_create(&idSend,NULL,Sendhandler,NULL);
 56     pthread_create(&idRev,NULL,Revhandler,NULL);
 57
 58     if (wiringPiSetup () == -1)
 59     {
 60         fprintf (stdout, "Unable to start wiringPi: %s\n", strerror (errno)) ;
 61         return 1 ;
 62     }
 63
 64     while(1){sleep(10);}//不希望程序退出,多出的时间进行休眠
 65
 66     printf ("\n") ;
 67     return 0 ;
 68 }

wiringPi库串口源码解读

不用wiringPi库实现串口通信

打开串口(myserialOpen)、发送字符串(serialSendstring)、接受字符串(serialGetstring)

语音刷抖音

语音模块连接H616单片机,单片机通过usb线连接安卓手机

语音模块配置词条和识别后的串口输出指令,固件烧写,手机接  入Linux热拔插(adb工具),shell指令操作手机屏幕(上滑、下滑,双击屏幕,锁屏),程序整合 

Linux的热拔插UDEV机制(Linux系统编程相关)(面试可用)

UDEV(设备管理工具)作用概述

dmsg:打印内核的信息 

守护进程概述

守护进程开发并添加开机自启动:直接借助damon()函数完成、

编写程序判断程序是否在运行ps -elf | grep douyinUtils(打印douyinUtils和grep的两行程序信息)和ps -elf | grep douyinUtils |grep -v grep(不打印grep程序本身打印出来的信息)

将刷抖音程序变成守护进程

UDEV的rules编写

编写UDEV规则自动挂载U盘

SQLite数据库

面试前,先回顾下SQLite和MySQL数据库的各自优缺点(全志学习文档中)

数据库的安装

SQL指令:表创建和数据添加、表更新查询添加列

创建数据库

 

 输入错误时,按下ctrl+z退出程序

SQLite的编程操作

打开创建关闭数据库及错误提示 

sqlite3_open,sqlite3_close,sqlite3_errmsg

   

 C代码执行sql语句

sqlite3_exec(sqlite3*, const char *sql, sqlite_callback, void *data, char **errmsg):数据库创建一个表。
例程提供了一个执行 SQL 命令的快捷方式, SQL 命令由 sql 参数提供,可以由多个 SQL 命令组成。
在这里,第一个参数 sqlite3 是打开的数据库对象, sqlite_callback 是一个回调, data 作为其第一
个参数, errmsg 将被返回用来获取程序生成的任何错误。
sqlite3_exec () 程序解析并执行由 sql 参数所给的每个命令,直到字符串结束或者遇到错误为止。
int callback ( void* arg , int column_size , char* column_value [], char * column_name []):打印表格信息
参数分析: void * arg :是 sqlite3_exec函数的第四个参数;column_size:数据库的字段数;column_value [] :列的值;column_name :字段名字

C代码建表和插入数据

错误信息的打印,表是否已经存在,插入数据,打印表的信息

SQLite数据库其他操作及总结

Linux环境下的python

Linux安装python环境

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值