
- CH341SER -> 用RS232串口线连接开发板和电脑传输数据
- 编辑代码工具 -> linux系统和windows系统进行共享目录时
- 用于控制开发板,相当于Linux下的终端界面
- ubuntu是linux系统(18.04 - 2018年4月出版 - 20.04 、 22.04)
检查之前课设的 ubuntu 是否符合标准/是否可用 - 根据虚拟机中是否有 交叉编译器 (终端下输入命令:arm-linux-gcc -v)
若使用 Ubuntu-12.04 要注意的是使用 用户 / 访客 模式
(我个人觉得Vscoode是比较万能的一个工具,但是设置编译环境有点麻烦)
- // 用户模式:
- gec@ubuntu:~$
- // 访客模式:
- guest-TrOVIR@ubuntu:~$
- // 访客模式下,无法进入 共享文件夹
介绍一个切换 用户/访客 模式:

5 VMware:
- 虚拟机:虚拟的电脑 - 用于承载其他系统(一台电脑双系统)
一般使用 VMware15 pro 即可;
问题1:若开打虚拟机会蓝屏。 解决办法:则需要安装VM16版本;
问题2:无法打开虚拟机,显示xxx-v已禁用。 解决办法:关机 -> 进入BIOS模式 -> 开启虚拟化
1.大多数时候,虚拟机打不开都是因为防火墙拦截所致.
解决方案:断网,关闭杀毒软件(360,腾讯管家等),关闭防火墙

2.如果断网,关闭防火墙后,打开虚拟机还是没有反应.可能是软件运行的权 限不够,此时要以管理员身份来运行VMware.解决方案:右键VMware图标-属性-兼容性-以管理员身份运行此程序.
需要安装一个虚拟安装的官网:https://www.vmware.com/
安装需要的虚拟机:

1. 打开在官网下载的VMware安装包,然后点击【下一步】

2. 勾选【我接受许可协议中的条款】,然后点击【下一步】;

3. 自定义VMware的安装位置,取消勾选的两项,然后点击【下一步】;
4. 取消勾选的两项,然后点击【下一步】;

5. 点击【完成】,VMware安装完成。(然后就可以开始你虚拟机了)

后续操作位安装压缩包的ubuntu目录,找到相关的文件运行相关的文件!


提示:
我们发现关机开机需要花费大量时间,就尽量不要关虚拟机,直接挂起即可,有利提高开发效率
挂起虚拟机的步骤:(点击上方的暂定按键即可挂起)
终端(ctrl+alt+T):用于编写所有操作命令//打开即出现liunx下的终端
或者是右击出现OPEN打开的方式进入

| 快捷键 | 作用 |
| ctrl + alt + T | 打开终端 |
| ctrl + C | 结束程序 |
| ctrl + Z | 结束进程 |
| ctrl + L(终端令行输出:clear 效果一样) | 清屏 |
| F11 | ubuntu命令行模式界面 |
| Ctrl + shift + “+=” | 终端字体放大 |
| Ctrl + "-_" | 终端字体缩小 |
| Ctrl + Alt | 鼠标退出ubuntu系统(windows和ubuntu切换) |
| Tab | 自动补充键(输入前缀即可)补全代码按键 |
| Ctrl + Q | Notepad++ 多行注释与取消注释切换 |
| Ctrl + K | Notepad++ 多行注释 |
| Ctrl + shift + K | Notepad++ 多行取消注释 |
| ↑ ↓ | 终端下查询输入命令历史记录 |
做一个简单的是项目实现:

共享文件夹的的图文解析:(相当于一个桥梁进行传输)

共享文件夹:相当于 windows系统 和 linux系统 “沟通的桥梁”。
- // 切换到共享文件夹路径中
- gec@ubuntu:~$ cd /mnt/hgfs/共享文件夹名字(自己的)
- gec@ubuntu:/mnt/hgfs/共享文件夹名字(自己的)$

1 查看是否设置共享路径成功命令:
2 确实设置陈成功后,输入以下命令:
- /* 如果之前没有命令包则先执行
- sudo apt-get install open-vm-tools
- */
- // 输入以下命令
- sudo vmhgfs-fuse .host:/ /mnt/hgfs -o nonempty -o allow_other
练习:
设置共享文件夹目录(共享目录名为share!

第二节课时
(注意:每层路径都使用 / 区分开)
| 路径名 | 路径 | 通俗讲解 | |
| 家目录 | ~ | 自己linux系统的家 | |
| 根目录 | / | 装载linux所有系统文件 | |
| 共享目录 | /mnt/hgfs/共享文件名 | 连接linux和windows的“桥梁” | |
| 当前目录下 | . | ||
| 上一层目录 | .. | ||
| 全部文件 | * | ||
| 上一次目录 | - | 刚从哪层切换过来的目录 | |
| 驱动目录 | /dev | 之后开发板使用经常用到 |
| 命令 | 作用 | 使用方法 |
| ls | 查看目录信息 | ls (路径名) -l :查看文件详细信息 -a :查看全部文件 |
| cd | 切换目录 | cd 路径名 (若不添加路径名,则默认去到家目录下) |
| cp | 拷贝文件/目录 | cp 文件名 要拷贝的路径 (若拷贝目录需要进行递归操作:-r) |
| mv | 1 移动 2 重命名 | 有两个设置模式! 1 mv 文件名 要移动到的路径( 2 mv 文件名 新的文件名 (如果没有文件夹则重新命名) |
| cat | 查看文件内容 | cat 文件名 |
| touch | 创建文件 | touch 新文件名 |
| mkdir | 创建目录 | mkdir 新目录名(注意是小写) |
| rm | 删除文件 | rm 文件名 (若删除目录需要进行递归操作:-r) |
| chmod | 修改文件权限 | chmod 权限参数 文件名 |
| man | 查看man手册 | man 版本号 函数名 (若不知道版本号,则 -f 查找) (q:退出 h:详细讲解) |
文件权限示例:-rwxrwxrwx
| - | rwx | rwx | rwx |
| 文件类型 | 文件所属者(user) | 文件所属组(grouth) | 文件其他组(other) |
ugo----简单来记录
权限参数模板:
| 权限参数: | r - 读 w - 写 x - 执行 | r | w | x | r | w | x | r | w | x | ||
| 二进制 (1/0 -> 有/无) | 0/1 | 0/1 | 0/1 | 0/1 | 0/1 | 0/1 | 0/1 | 0/1 | 0/1 | |||
| 十进制 (有则+ / 无则+0) | 4 | 2 | 1 | 4 | 2 | 1 | 4 | 2 | 1 | |||
| 参考示例: | 文件所属者 | 文件所属组 | 文件其他组 | |||||||||
| 二进制值: | 1 | 1 | 1 | 1 | 1 | 0 | 0 | 0 | 1 | |||
| 十进制值: | 4+2+1 = 7 | 4+2+0 = 6 | 0+0+1 = 1 | |||||||||
| 权限注释: | 所属者可读可写可执行 | 所属组可读可写 | 其他组仅可执行 | |||||||||
注意:烧录在板子上的时候需要给与一定的限权
- // vi编辑器使用
- gec@ubuntu:/mnt/hgfs/share_217$ vi main.c
- // vim编辑器使用
- gec@ubuntu:/mnt/hgfs/share_217$ vim main.c
命令模式:(最初进入,所有模式切换都需经过的途径)
dd: 删除光标所在行
插入模式:(命令模式下,按 i 进入插入模式;按 Esc 退出命令模式;)
在此模式下,可 编辑/写入 字节数据
低行模式:(“:” + 命令;按 Esc 退出命令模式;)
在低行模式下,可以进行 保存、退出、设置行号、查找 ... 功能;
| 保存文件 | 退出 | 设置vi/vim行号 | 保存并退出 | 强制保存并退出 |
| :w | :q | :set nu | :wq | :wq! |
gec@ubuntu:/mnt/hgfs/share_217$ gedit main.c
| 复制 | 粘贴 | 剪切 | 后撤 | 保存 |
| ctrl + c | ctrl + v | ctrl + x | ctrl + z | ctrl + s |
基于 windows 下的编辑器,可支持多种语言编辑格式(但是记得你要选好后缀,不然会有一些格式的错误)Notepad++功能比 Windows 中的 Notepad(记事本)强大,除了可以用来制作一般的纯文字说明文件,也十分适合编写计算机程序代码。Notepad++ 不仅有语法高亮度显示,也有语法折叠功能,并且支持宏以及扩充基本功能的外挂模组。(它是一个免费的软件)
Notepad++是免费软件,可以免费使用,自带中文,支持众多计算机程序语言: C,C++,Java,pascal,C#,XML,SQL,Ada,HTML,PHP,ASP, AutoIt, 汇编, DOS批处理, Caml, COBOL, Cmake, CSS,D, Diff, ActionScript, Fortran, Gui4Cli, Haskell, INNO, JSP, KIXtart, LISP, Lua, Make处理(Makefile), Matlab, INI文件, MS-DOS Style, NSIS, Normal text, Objective-C, Pascal,Python, Javascript,Verilog,Haskell,InnoSetup,CMake,VHDL,Matlab


(直接解压安装既可以使用)
| 快捷键 | 作用 |
| ctrl + K | 注释 选定代码块 |
| ctrl + shift + K | 取消注释 选定代码块 |
| ctrl + Q | 注释/取消注释 选定代码块 |
| Tab | 对齐 |
| shift + Tab | 缩进 |
gcc:GND代码编译器,用于编译代码(程序每次修改后都需要保存并重新编译,不然会出错)
- # 编译命令:gcc 源码文件 -o 可执行文件名
- gec@ubuntu:/mnt/hgfs/share_217$ gcc main.c -o main
- # 运行可执行文件:./可执行文件名
- gec@ubuntu:/mnt/hgfs/share_217$ ./main
- helloworld
-
- # 若不指定生成可执行文件名,则默认生成可执行文件名为:a.xxx linux-a.out windows-a.exe
- gec@ubuntu:/mnt/hgfs/share_217$ gcc main.c
- gec@ubuntu:/mnt/hgfs/share_217$ ls
- a.exe a.out main main.c
复习一下 C语言:七大原则:空行、空格、成对书写、缩进、对齐、代码行、注释七方面的书写规
硬性要求:
1 该换行就换行;
2 该缩进对齐就缩进对齐;
3 符号间需要空格;
4 参数定义规范;
5 符号成对书写;
6 注释:单行注释: // 多行注释: /* */
- #include
- // int main(参数个数, 第1个参数,第2个参数 ...)
- // 根据函数返回值定义对应函数类型
- int main(int argc, char *argv[])
- {
-
- // printf("argv[0] : %s\n", argv[0]);
- printf("argv[1] : %s\n", argv[1]);
- printf("argv[2] : %s\n", argv[2]);
-
- return 0;
- }
- // 终端下:
- gec@ubuntu:/mnt/hgfs/share$ gcc main.c -o main (-o 可以运行执行文件) 一定是编译,然后在运行!!
- gec@ubuntu:/mnt/hgfs/share$ ./main zhangsan lisi
- argv[0] : ./main
- argv[1] : awei
- argv[2] : zhangsi
关系运算符(一般使用if进行一个使用)
| 常用类型 | int | char | float | long |
| 大小(字节) | 4 | 1 | 4 | 8 |
| 关系运算符 | 相等条件为真 | 不相等条件为真 | 大于 / 小于 | 大于等于 / 小于等于 |
| 符号 | == | != | > | >= |
| 逻辑运算符 | 与条件 | 或条件 | 非条件 |
| 符号 | && | || | ! |
ASCII码对照表:(虚拟机使用MAN ASCLL可以查看手册,不太建议去背起来)

2 条件判断

- if(条件A)
- {
- // 如果条件A为真,则运行此代码
- demo_A ... ;
- }
- else if(条件B)
- {
- // 如果条件A不满则,则检测条件B是否满足;
- // 条件B为真,则运行此代码
- demo_B ... ;
- }
- else
- {
- // 若不满足条件A&&条件B,则运行此代码
- demo_B ... ;
- }

while(){ }:
别给写成是while(1)死循环!!!!
- for(变量初始化; 条件; 每次循环变量的变化){
- 操作;
- }
例子:
- for(num=1; num<=5; num++){
- sleep(1);
- printf("num:%d\n", num);
- }
一维数组:数组名[ 数组大小 ] = {};
示例:
注:数组创建, [] 中要给一个常量才可以,不能使用变量。可以直接用常量,或者使用宏定义。
数组的初始化(实现数组的监控)
- // 示例代码:
- void main(){
- // 定义数组 arr[]
- // 大小:3个char型
- // 并初始化值arr[0] = 'A', arr[1] = 'b';
- char arr[3] = {'A','b'};
- for(int i=0; i<3; i++){
- printf("%c ", arr[i]);
- }
- }
- // ubuntu终端:
- gec@ubuntu:/mnt/hgfs/share$ ./a.out
- A b
int arr[6] ="abcdef";

数组名[ 元素组数 ][ 每组元素大小 ] = {};
数组名[ 行 ][ 列 ];
A[3][4]
(注意:二维数组可省略元素组数(系统自动根据初始化/输入数据决定),不可省略每组元素大小空间)即为可以省略行!!但是不可以省略每一组的空间大小!
- // 示例代码:
- int main(){
- // 输入字符串存放到 arr[]
- int i;
- char arr[3][10];
- for(i=0; i<3; i++){
- scanf("%s",arr[i]);
- }
- // 打印输出 arr[]
- for(i=0; i<3; i++){
- printf("\t%s\n",arr[i]);
- }
- }
-
- // ubuntu终端:
- gec@ubuntu:/mnt/hgfs/share$ ./a.out
- zhangsan
- lisi
- wangwu
- zhangsan
- lisi
- wangwu
C语言中指针是一种数据类型,指针是存放数据的内存单元地址。
计算机系统的内存拥有大量的存储单元,每个存储单元的大小为1字节,为了便于管理,必须为每个存储单元编号,该编号就是存储单元的“地址”,每个存储单元拥有一个唯一的地址。
指针变量除了可以存放变量的地址外,还可以存放其他数据的地址,例如可以存放数组和函数的地址。
| * | 解引用符号 |
| & | 取地址符号 |
| %p | 打印地址类型 |
| %ls | 打印指针数据 |
格式:指针变量=地址型表达式
“地址型表达式”即运算结果是地址型的表达式。C语言规定,变量地址只能通过取地址运算符获得,即“&”,其运算对象是变量或数组元素名,运算结果是对应变量或数组元素的地址。
需要注意的是,虽然地址是一个整数,但是C语言中不允许把整数看成“地址常量”,所以此处的“地址型表达式”不能是整数。
2. 使用指针变量
格式:指针变量名
需要使用地址时,可以直接引用指针变量名。
格式:*指针变量名
1. 取地址运算符 &
取地址运算符“&”的功能是取变量的地址,它是单目运算符。取地址运算符的运算对象必须是已经定义的变量或数组元素,但不能是数组名。运算结果是运算对象的地址。
2. 指针运算符 *
指针运算符“*”的功能是取指针变量所指向地址中的内容,与取地址运算符“&”的运算是互逆的,它是单目运算符。指针运算符的运算对象必须是地址,可以是已赋值的指针变量,也可以是变量或数组元素的地址,但不能是整数,也不能是非地址型的变量。运算结果就是地址对应的变量。
结构的意义:把多个类型变量整合成一个struct 结构体必须的单词
- struct tag {
- member-list;
- member-list;
- member-list;
- ...
- } variable-list;
- // struct: 结构体
- // tag: 标签
- // menber-list: 标准变量
- // variable-list: 结构体变量
- int num;
- struct num;
结构体示例代码:
- #include
-
- struct student{
- char *name; //名字
- int num; //学号
- char sex; //性别
- float height; //身高
- }zhangsan={"张三", 1, 'M', 190.66666};
- // jiegoutibianliang.xxx ————> 结构体 的 xxx属性 //并没有严格的规定!!!
-
- int main(){
-
- printf("info: No.%d\n", zhangsan.num);
- printf("name: %s\n", zhangsan.name);
- printf("sex: %c\n", zhangsan.sex);
- printf("height: %.2f\n", zhangsan.height);
-
- return 0;
- }

示例: