目录
6 IIC协议-OLED屏应用(IIC协议:在上官一号单片机章节有详细讲解)
Sourceinsight阅读库源码研究OLED屏幕(建议多听一次)
wiringPi串口开发及优化(串口简介:上官一号单片机教程)
Linux的热拔插UDEV机制(Linux系统编程相关)(面试可用)
1刷机和系统启动
登录系统、修改登陆密码
网络配置:命令扫描周围的WIFI热点 nmcli dev wifi
修改开发板内核启动日志级别(后续如果内核启动失败,就无法获悉故障原因;方便查看整个内核启动的过程日志)
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(×tart,NULL);
19 cntTest();
20 gettimeofday(×top,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:信号线/数据线
OLED屏幕显示内容
Sourceinsight阅读库源码研究OLED屏幕(建议多听一次)
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语句
C代码建表和插入数据
错误信息的打印,表是否已经存在,插入数据,打印表的信息