思维导图文章末附录,这里主要是项目体系,具体内容分篇章讲解。
个人网站
绪论
教程说明
因为模块太多,全部放在一起有些冗杂,所以每一个部分都有单独的文件,也为了能更好的描述,切换画布或者点击链接跳转就可以查看
应该加强核心的知识,并且学会融合进入其他的项目当中,举一反三。比如可以利用单片机与显示屏生成显示二维码,学生管理系统连接到数据库操作,五子棋实现人机对战等等。简单的逻辑实现比较简单,但是多元化的融合需要有较深的理解。
以简入繁,以剑破点,每一个知识点都要直击核心,抓住重点。每个人精力都有限,我希望用更短的时间做更高效的事。
培养方案
项目主要以实践为主,会写文章,做视频进行教学,刨析内部的每一个知识细节,通过一个项目,能掌握一个体系的知识。不过视频暂时做不了,因为没时间
教程总结
由于时间有限,个人水平有限,教程的内容叙述较浅,因为知识面较广,每一部分想要深入都需要大量的时间,想要真的掌握需要时间的沉淀。不过入门过后就能按照自己的需求去深入学习,网上有很多较好的开源资料,几乎想学什么都会有,所以找资源也是一个非常重要的技能。
项目在于精,而不在于多,从简单的实现到不断拓展精炼,从而实现更实用,更完善的项目。知识面广有助于思维的扩散,但是专精某一方向,才能在领域中有立足之地。
不积跬步无以至千里
语言篇
C语言基础
简单程序
注意点
头文件
主函数
注释
输入输出
数据类型
整型
浮点型
字符类型
数组
结构体
联合
枚举
指针
运算符
基本运算符
运算符优先级
自加自减运算符
流程结构
while
do while
for
if else
switch
goto
函数
函数形式
函数地址类型
递归函数
参数不确定
[ ] 的三种作用
内存管理
类型转换
大小端存储
位运算
进制转换
位运算符
位字段
文件操作
打开文件
操作文件
关闭文件
其他
类型重命名
宏
多文件
存储类说明符
类型限定符
内存分区
命令行参数
随机数
C语言进阶
十天整理笔记
基础复习
内存管理
指针
数据结构
算法
高级指针
总结
C++基础
C++介绍
基础知识点
> 与C类似,主要讲解有区别的地方
> 2.2数据类型
> 2.3运算符
> 2.4流程结构
> 2.5函数
> 2.6文件操作
> 2.7内存管理
> 2.8其他
类
3.1理论
3.2学习方法
3.3类实例
3.3.1类声明
3.3.2声明对象
3.3.3成员调用
3.3.4访问修饰符
3.3.5函数成员
3.3.6 数据成员
3.4继承
3.4.1继承实例
3.4.2 多态与虚函数
3.4.3虚继承
3.5 其他
运算符重装
4.1作用
4.2 形式
4.3 重载
4.4 重载实例
4.4.1 认识运算符
4.4.2 二元运算符
4.4.3 一元运算符
4.4.4 输入输出赋值
4.4.5 下标运算符
4.4.6 递增递减运算符
4.4.7 重载类型转换
4.5 运算符重载总结
模板
5.1 函数模板
5.2 类模板
5.3 继承的模板
5.4. 模板类型是类的模板
5.5 模板总结
标准函数库
数学基本运算
基本算术运算
随机数产生函数
三角函数
双曲函数
对数与指数
幂函数
字符串
字符串转数字
数字转字符串
字符串转浮点数
浮点数转字符串
功能函数库
日期和时间
非本地跳转
信号
可变参数输入输出
执行环境
locale函数
返回值作为指针函数
STL
容器
数组
array,vector
链表(单向链表,双向链表)
list/forward_list
list lt;
栈
stack
队列
deque
树
map/set
hash表
hash_map
算法
algorithm
迭代器(iterator)
string
string::ierator ite;
vector
vector<int>::iterator ite;
list
list<Node>::iterator ite;
适配器
分配器
仿函数
STL总结
MCU篇
51
基础实验
1、C51的基础知识,regc51.h 头文件有什么作用?
2、51最小系统板的基本组成是什么,用Proteus该怎么画?
3、keil 软件的基本使用,程序如何烧入到单片机芯片中?
4、如何控制LED灯亮灭,原理是什么,程序该怎么写?
5、流水灯程序该如何写,有哪些方法?
6、什么是数码管,单位数码管的基本组成及亮灭原理是什么?
7、如何让单个数码管显示自己想要的数字,程序该怎么写?
8、多位数码管的组成,静态显示与动态显示的区别,断选和位选是什么,各有什么作用?
9、什么是点阵,点阵的原理,如何控制点阵的显示,程序该如何写?
10、独立按键的作用,如果用按键控制LED灯和数码管,程序该怎么写?
11、矩阵键盘的基本结构及检测原理是什么,程序该怎么写?
12、中断的概念,中断的处理机制,如何在程序中使用中断?
13、定时器/计数器的原理以及编程方法是什么?
14、串口通信原理,单片机与单片机如何通信?
15、单片机与PC机串口通信原理,以及编程方法?
16、串口转并口、USB转串口原理?
17、A/D转换原理?
18、D/A转换原理?
19、常见的A/D和D/A转换芯片,以及使用方法?
20、PWM脉冲调速原理是什么,如何编程输出PWM波?
21、LED1602液晶
22、LCD12864液晶
常用芯片
锁存器
38译码器
4 - 16译码器
驱动模块
MAX7219
等等
STM32
1、简介
2、基础使用
3、GPIO
4、外部中断
5、定时器
6、串口
7、PWM
8、ADC、DAC
9、IIC
10、SPI
11、相关外设
Peripherals(外设)
ADC/DAC
RTC
Timer/Watchdog Timer(定时器)
Flash/NAND Fiash
ROM/EEPROM
RAM
SDRAM
DDR1 DDR2 DDR3 DDR4
Cache
PWM
I/O / GPIO
USART
Modem
DTMF
CAN
SPI
I2C
IEEE
CRC
interrupt(中断)
入门开始学先掌握基础的知识,比如GPIO,串口,定时器,中断,PWM,I2C,SPI等等
Sensor(传感器)
RIP(人体红外)
Temperature(温度)
humidity sensor(温度传感器)
geomagnetic sensor(地磁传感器)
acceleration transducer(加速度传感器)
optoelectronic switch(光电开关)
pneumatic sensor(气流传感器)
current sensor(电流传感器)
soil sensor(土壤传感器)
liumination sensor(光照传感器)
laser sensor(激光传感器)
Motion(运动)
Moisture sensor(土壤湿度传感器)
电压传感器
Three-axis gyroscope(三轴陀螺仪)
Camera感光元件(图形传感器)
气压传感器
气敏传感器
粉尘浓度传感器
水位传感器
脉搏传感器
脑皮质电位传感器
弯曲传感器
近距离传感器
很多我也没接触过,我列举这么多主要是拓展,有兴趣的可以去了解下
Communication(通信)
USART
I2C
RS232C/RS485
SPI/SCI/SI
CAN
USB
FireWire
1-wire
网络协议
HTTP
CoAP
MQTT
XMPP
WebSocket
UDP
HTTP
一些我也还没学,我列举这么多主要是拓展,有兴趣的可以去了解下
Actuator(执行器)
直流电机
有刷直流电机
无刷直流电机
交流电机
单相电机
三相电机
步进电机
直线电机
舵机
使用起来还好,但是要深入原理得了解很多控制的原理,难哦
电路基础篇
主要相关课程
电路分析基础
模拟电路
数字电路
网址
Electronic Component(电子元件)
电源
电容
保护装置
开关
电阻
热敏电阻
压敏电阻
光敏电阻
电磁感应装置
电阻排
压电装置、晶体谐振器
二极管
三极管
晶体管
飞行篇
四旋翼
四旋翼基本组成及原理
四旋翼组装与调试
模拟器安装与飞行
实战飞行
核心知识
硬件组装
机架
飞控
电调
电机
光流
陀螺仪
电子罗盘
激光测距
等等
主控芯片
STM32F407
其他都行
飞控相关算法
PID
滤波算法
姿态解算
数据融合
固定翼
固定翼基本组成及原理
固定翼组装与调试
模拟器安装与飞行
实战飞行
软件项目篇
贪食蛇
实现
纯C实现
C++实现
+图像库
主程序
蛇模块
墙模块
食物模块
蛇移动
拓展
五子棋
主要函数
void judge(int y,int x,int color)
判断当前位置4个方向连接的棋子数量,参数为棋子颜色 1白2黑
bool pieceSet(int y, int x,int color
放置棋子,返回true表示放置成功,false 表示放置失败
void initGame()
void initGame()
void initView()
初始化界面
void drawPiece(int x,int y,int color)
绘制棋子
void AI()
机器判断程序
void playerVSplayer()
人人对战
void playerVSAI()
人机对战
俄罗斯方块
设置界面展示信息
方块操作
生成方块
画方块
画下一个方块
方块运动
操作限制
得分消行
死亡判断
左右栏目信息更新
学生管理系统
注册登录
1、设置光标位置
2、输出主菜单
3、登录操作
4、注册操作
5、游客登录
6、退出系统
7、用户存取
8、菜单指令
操作管理
1、主界面
2、添加操作
3、读写文件
4、查看
5、删除
6、修改
7、排序
8、考试
9、退出
10、统筹逻辑
文件加密与数据解析
数据分析并解算
MD5算法
二维码生成
基础知识
定位图案
功能性数据
数据码和纠错码
数据编码
示例一:数字编码
示例二:字符编码
结束符和补齐符
按8bits重排
补齐码(Padding Bytes)
纠错码
最终编码
穿插放置
Remainder Bits
画二维码图
Position Detection Pattern
Alignment Pattern
Timing Pattern
Format Information
Version Information
数据和数据纠错码
掩码图案
专业篇
这几个项目还没研究,在网上看到的,觉得不错,有时间就去看看。里面有GitHub的连接,想学习的可以去看看。
https://github.com/TheAlgorithms/C
https://github.com/ithewei/libhv
https://github.com/Light-City/CPlusPlusThings
https://github.com/JakubVojvoda/design-patterns-cpp
https://github.com/tmux/tmux
https://github.com/netdata/netdata
物联网项目篇
QT上位机
简介
什么是QT?
Qt 是一个跨平台的 C++ 框架(C++库),可以用来写图型界面的应用,这里我们主要用来写电脑软件,用来与下位机通信
QT安装与使用
建立一个新工程
文本框
编辑框
按钮
图片
页面布局
怎么更改控件的背景
引入图片资源
更改控件背景
ui控件与cpp程序关联
提示信息
页面转换
更改软件页面图标
生成动态链接库
功能
TCP通信
客户端
服务器
UDP通信
客户端
服务器
串口
蓝牙通信
主机
从机
QT模块与类
QT基本模块
15个QT基本模块
QT core
核心功能
The Meta-object System 源对象系统
Tread 线程
I/O
容器
资源系统
The Animation Framework 动画框架
The Property System 属性系统
对象模型
信号与槽
The Event System 事件系统
The state Machine Framework 状态机框架
JSON support Json支持
QT Plugins 创建Qt插件
QT core 类
IO 类
Container Classes 容器类
Threading Classes 线程类
Implicitly Shared Classes 隐式共享类
Animation Classes 动画类
Event Classes 事件类
State Machine Classes 状态机类
Plugin Classes 插件类
QT GUI
核心功能
Application Windows 程序窗口
2D Graphics 2D图形
OpenGL and OpenGL ES Integration OpenGL和OpenGL ES的整合
QT GUI 类
Event Classes 事件类
Painting CLasses 绘画类
Rendering in 3D 3D渲染类
QT widgets
Styles 样式
Layouts 布局
Model/VIew Classes 模型/视图类
Graphics View 平面视图
Qt QML
QT Quick
QT Quick Controls
QT Quick Dialogs
QT Quick Layouts
QT Multimedia
C++类
QAudio OutPut
QCamera
QCameramageCapture
QMediaPlayer
QRadioTuner
QVideoRendererControl
QML类
Audio
Camera
MediaPlayer
Radio
video
QT Multimedia Widgets
QT WebKit
QT WebKit Widgets
QT NetWork
QT Sql
QT Test
QT WebView
QT附加模块
QT 开源免费附加模块
跨平台模块
Enfinio
Qt Canvas 3D
QT Concurrent
QT D-Bus
QT Graphical Effects
QT Image Formats
QT Platform Headers
QT Positioning
QT Location
QT Quick Extras
QT Quick WIdgets
QT Script 和 QT Script Tools
QT SVG
QT WebChannel
QT WebSockets
特定平台模块
Active QT Windows
QT Bluetooth Android/iOS/Linux/ OS X
QT NFC Linux
QT Sensors Android/iOS/WInRT
QT Serial Port Windows/Linux/OS X
QT WebEngine 与 QT WebEngine Widgets WIndows/Linux/OS X
QT WIndows/Mac/X11/Android Extras Windows,OS X,Linux/X11,Android
不再推荐使用的模块
QT Open GL
QT Declarative
QT 企业增值模块
QT for Device Creation
QT Charts
QT Quick Compiler
QT Data Visualization
QT Purchasing
QT Virtual Keyboard
QT Quick 2D Renderer
通信
UDP
TCP
串口
实战项目
一个电脑软件
ESP8266
AT指令模式
SAT模式
当作客户端,需要连接服务器,进行数据传输
AP模式
当作服务器,开放热点,拥有IP地址与端口号,其他客户端可以连接
STA+AP模式
两者都有,但是个人不太喜欢用
当作arduino开发
利用电灯科技,连接阿里云,绑定小爱同学
MQTT通信
TCP通信
UDP通信
TCP通信
Server/Client
怎么连接?
(使用AT指令)
ESP8266 常用指令
配置服务器指令(AP模式)
1、设置模式为AP模式:AT+CWMODE=2
2、重启模块:AT+RST
3、AT+CWSAP="wifi名称","wifi密码",1,3
4、查看模块的ip地址:命令: AT+CIFSR
5、AT+CIPMUX=1 设置为多连接模式,启动模块
6、AT+CIPSERVER=1,8090 服务器的设置端口
配置服务器指令(STA模式)
1、AT+CWMODE=1 配置STA模式
2、AT+RST 重启生效
3、AT+CWJAP="wifi名称","WiFi密码" 连接WIFI
4、AT+CIPSTART="TCP","192.168.4.1",8090 连接服务器
5、AT+CIPSEND=4 发送指令
6、AT+CIPMODE=1 开启透传模式
7、AT+CIPSEND 开始透传
单片机当作服务器
实现
整体流程
配置一个串口,然后将STM32的串口与ESP8266的串口连接
将32的数据传输到ESP8266上,用于ESP8266初始化,也可以将ESP8266的数据传输到32上面,实现消息互传
ESP8266初始化
void esp8266_start_trans(void)
{
//设置工作模式 1:station模式 2:AP模式 3:兼容 AP+station模式
esp8266_send_cmd("AT+CWMODE=2","OK",50);
//Wifi模块重启
esp8266_send_cmd("AT+RST","OK",20);
delay_ms(1000); //延时3S等待重启成功
delay_ms(1000);
delay_ms(1000);
//AP模式
//esp8266_send_cmd("AT+CWSAP=\"Geek\",\"12345678\",1,4","OK",200); //设置热点的账号密码
esp8266_send_cmd("AT+CIPMUX=1","OK",20);
esp8266_send_cmd("AT+CIPSERVER=1,8080","OK",200);
}
由上面代码可知 esp8266_send_cmd 函数是想ESP8266发送指令,是利用串口发送,具体实现看工程代码
被连接
手机客户端
单片机客户端
电脑客户端
单片机当作客户端
实现
整体流程
配置一个串口,然后将STM32的串口与ESP8266的串口连接
ESP8266初始化
//ESP8266模块和PC进入透传模式
void esp8266_start_trans(void)
{
//设置工作模式 1:station模式 2:AP模式 3:兼容 AP+station模式
esp8266_send_cmd("AT+CWMODE=1","OK",50);
//让Wifi模块重启的命令
esp8266_send_cmd("AT+RST","ready",20);
delay_ms(1000); //延时3S等待重启成功
delay_ms(1000);
delay_ms(1000);
delay_ms(1000);
//让模块连接上自己的路由
while(esp8266_send_cmd("AT+CWJAP=\"GeekPan\",\"12345678\"","WIFI GOT IP",600));
//=0:单路连接模式 =1:多路连接模式
esp8266_send_cmd("AT+CIPMUX=0","OK",20);
//建立TCP连接 这四项分别代表了 要连接的ID号0~4 连接类型 远程服务器IP地址 远程服务器端口号
while(esp8266_send_cmd("AT+CIPSTART=\"TCP\",\"192.168.4.1\",8090","CONNECT",200));
//是否开启透传模式 0:表示关闭 1:表示开启透传
esp8266_send_cmd("AT+CIPMODE=1","OK",200);
//透传模式下 开始发送数据的指令 这个指令之后就可以直接发数据了
esp8266_send_cmd("AT+CIPSEND","OK",50);
}
由上面代码可知 esp8266_send_cmd 函数是想ESP8266发送指令,是利用串口发送,具体实现看工程代码
去连接
单片机服务器
手机服务器
电脑服务器
总结
ESP8266初始化流程
配置串口
串口的波特率最好为9600,因为在硬件上面,太高可能实现不了
写串口的发送指令函数
用于给ESP8266发送对应的AT指令,初始化
初始化客户端与服务器类似,只是发送的指令不同,但都需要利用串口发送
硬件连线是TX接RX,RX接TX
配置思路
如果单片机当作服务器,那么ESP8266就是AP模式,开放热点,拥有IP地址与端口号。其他TCP客户端想要连接服务器时,需要先连接热点,然后再绑定IP地址与端口号,进行连接
如果是STA模式,就需要连接服务器的热点,绑定IP地址与端口号,进行连接
连接范围
因为是利用WIFI局部通信,只是在局部网内有效,想要实现广域网通信,可以连接到云服务器,需要利用WIFI或者流量配置
怎么进行数据传输
发送数据
接收数据
STM32与ESP8266
主要利用串口进行数据传输
STM32串口发送数据
代码实现
//向ESP8266发送命令
//cmd:发送的命令字符串;ack:期待的应答结果,如果为空,
//则表示不需要等待应答;waittime:等待时间(单位:10ms)
//返回值:0,发送成功(得到了期待的应答结果);1,发送失败
u8 esp8266_send_cmd(u8 *cmd,u8 *ack,u16 waittime)
{
u8 res=0;
USART3_RX_STA=0;
u3_printf("%s\r\n",cmd); //发送命令
if(ack&&waittime) //需要等待应答
{
while(--waittime) //等待倒计时
{
delay_ms(10);
if(USART3_RX_STA&0X8000)//接收到期待的应答结果
{
if(esp8266_check_cmd(ack))
{
printf("ack:%s\r\n",(u8*)ack);
break;//得到有效数据
}
USART3_RX_STA=0;
}
}
if(waittime==0)res=1;
}
return res;
}
USART3_RX_STA
一个 unsigned short 的变量
USART3_RX_BUF
接收缓冲区
STM32串口接收数据
代码实现
if(USART3_RX_STA&0x8000)
{
printf("USART3_RX_BUF=%s\r\n",USART3_RX_BUF);
sprintf(a,"%s",USART3_RX_BUF);
printf("a=%s",a);
if(strstr((const char*)a,"on")) GPIO_ResetBits(GPIOB,GPIO_Pin_5);
if(strstr((const char*)a,"off")) GPIO_SetBits(GPIOB,GPIO_Pin_5);
USART3_RX_STA=0;
}
USART3_RX_STA
一个 unsigned short 的变量
USART3_RX_BUF
接收缓冲区
注意点
因为ESP8266利用串口向32发送的数据,数据格式不同,需要过滤掉多余的数据
具体实现还是看整体的工程代码
Client与Server
Client发送与接收
Client是单片机
esp8266_send_cmd("数据","OK",50);
数据发送流程
客户端利用串口给客户端的ESP8266发送数据
因为客户端与服务器已经连接,然后数据传输到服务器的ESP8266上
服务器的ESP8266又利用串口给32发送数据
最终32得到数据,可以根据数据执行相应的动作
图片示意图
Client是上位机
上位机简单理解就是电脑软件,手机软件,可以用来控制单片机
上位机发送数据,就是直接传输到服务器的ESP8266上,然后再利用串口发送给32
示意图
Server发送与接收
Server是单片机
同理
Server是上位机
同理
Android项目
什么是Android?
可以开发手机APP
如何开发一个安装APP
开发环境
Android Studio
新建一个基本工程,测试开发环境
新建空白工程
利用USB线与电脑连接
手机进入开发者模式
打开手机USB安装与调试
在Android Studio中运行程序
如果开发环境无误,那么就会在手机上安装一个APP
控件
按键
图片按钮
文本框
编辑框
选择开关
拓展
拖动条
进度条
浏览器框
地图
单选框
复选框
功能
TCP通信
客户端
服务器
UDP通信
客户端
服务器
串口
蓝牙通信
主机
从机
MQTT通信
连接外部的MQTT服务器
智能家居项目
通信
局域网
广域网
ESP8266基础教程
AT指令模式
SAT模式
当作客户端,需要连接服务器,进行数据传输
AP模式
当作服务器,开放热点,拥有IP地址与端口号,其他客户端可以连接
STA+AP模式
两者都有,但是个人不太喜欢用
当作arduino开发
利用电灯科技,连接阿里云,绑定小爱同学
MQTT通信
TCP通信
UDP通信
TCP通信
Server/Client
怎么连接?
(使用AT指令)
ESP8266 常用指令
配置服务器指令(AP模式)
1、设置模式为AP模式:AT+CWMODE=2
2、重启模块:AT+RST
3、AT+CWSAP="wifi名称","wifi密码",1,3
4、查看模块的ip地址:命令: AT+CIFSR
5、AT+CIPMUX=1 设置为多连接模式,启动模块
6、AT+CIPSERVER=1,8090 服务器的设置端口
配置服务器指令(STA模式)
1、AT+CWMODE=1 配置STA模式
2、AT+RST 重启生效
3、AT+CWJAP="wifi名称","WiFi密码" 连接WIFI
4、AT+CIPSTART="TCP","192.168.4.1",8090 连接服务器
5、AT+CIPSEND=4 发送指令
6、AT+CIPMODE=1 开启透传模式
7、AT+CIPSEND 开始透传
单片机当作服务器
实现
整体流程
配置一个串口,然后将STM32的串口与ESP8266的串口连接
将32的数据传输到ESP8266上,用于ESP8266初始化,也可以将ESP8266的数据传输到32上面,实现消息互传
ESP8266初始化
void esp8266_start_trans(void)
{
//设置工作模式 1:station模式 2:AP模式 3:兼容 AP+station模式
esp8266_send_cmd("AT+CWMODE=2","OK",50);
//Wifi模块重启
esp8266_send_cmd("AT+RST","OK",20);
delay_ms(1000); //延时3S等待重启成功
delay_ms(1000);
delay_ms(1000);
//AP模式
//esp8266_send_cmd("AT+CWSAP=\"Geek\",\"12345678\",1,4","OK",200); //设置热点的账号密码
esp8266_send_cmd("AT+CIPMUX=1","OK",20);
esp8266_send_cmd("AT+CIPSERVER=1,8080","OK",200);
}
由上面代码可知 esp8266_send_cmd 函数是想ESP8266发送指令,是利用串口发送,具体实现看工程代码
被连接
手机客户端
单片机客户端
电脑客户端
单片机当作客户端
实现
整体流程
配置一个串口,然后将STM32的串口与ESP8266的串口连接
ESP8266初始化
//ESP8266模块和PC进入透传模式
void esp8266_start_trans(void)
{
//设置工作模式 1:station模式 2:AP模式 3:兼容 AP+station模式
esp8266_send_cmd("AT+CWMODE=1","OK",50);
//让Wifi模块重启的命令
esp8266_send_cmd("AT+RST","ready",20);
delay_ms(1000); //延时3S等待重启成功
delay_ms(1000);
delay_ms(1000);
delay_ms(1000);
//让模块连接上自己的路由
while(esp8266_send_cmd("AT+CWJAP=\"GeekPan\",\"12345678\"","WIFI GOT IP",600));
//=0:单路连接模式 =1:多路连接模式
esp8266_send_cmd("AT+CIPMUX=0","OK",20);
//建立TCP连接 这四项分别代表了 要连接的ID号0~4 连接类型 远程服务器IP地址 远程服务器端口号
while(esp8266_send_cmd("AT+CIPSTART=\"TCP\",\"192.168.4.1\",8090","CONNECT",200));
//是否开启透传模式 0:表示关闭 1:表示开启透传
esp8266_send_cmd("AT+CIPMODE=1","OK",200);
//透传模式下 开始发送数据的指令 这个指令之后就可以直接发数据了
esp8266_send_cmd("AT+CIPSEND","OK",50);
}
由上面代码可知 esp8266_send_cmd 函数是想ESP8266发送指令,是利用串口发送,具体实现看工程代码
去连接
单片机服务器
手机服务器
电脑服务器
总结
ESP8266初始化流程
配置串口
串口的波特率最好为9600,因为在硬件上面,太高可能实现不了
写串口的发送指令函数
用于给ESP8266发送对应的AT指令,初始化
初始化客户端与服务器类似,只是发送的指令不同,但都需要利用串口发送
硬件连线是TX接RX,RX接TX
配置思路
如果单片机当作服务器,那么ESP8266就是AP模式,开放热点,拥有IP地址与端口号。其他TCP客户端想要连接服务器时,需要先连接热点,然后再绑定IP地址与端口号,进行连接
如果是STA模式,就需要连接服务器的热点,绑定IP地址与端口号,进行连接
连接范围
因为是利用WIFI局部通信,只是在局部网内有效,想要实现广域网通信,可以连接到云服务器,需要利用WIFI或者流量配置
怎么进行数据传输
发送数据
接收数据
STM32与ESP8266
主要利用串口进行数据传输
STM32串口发送数据
代码实现
//向ESP8266发送命令
//cmd:发送的命令字符串;ack:期待的应答结果,如果为空,
//则表示不需要等待应答;waittime:等待时间(单位:10ms)
//返回值:0,发送成功(得到了期待的应答结果);1,发送失败
u8 esp8266_send_cmd(u8 *cmd,u8 *ack,u16 waittime)
{
u8 res=0;
USART3_RX_STA=0;
u3_printf("%s\r\n",cmd); //发送命令
if(ack&&waittime) //需要等待应答
{
while(--waittime) //等待倒计时
{
delay_ms(10);
if(USART3_RX_STA&0X8000)//接收到期待的应答结果
{
if(esp8266_check_cmd(ack))
{
printf("ack:%s\r\n",(u8*)ack);
break;//得到有效数据
}
USART3_RX_STA=0;
}
}
if(waittime==0)res=1;
}
return res;
}
USART3_RX_STA
一个 unsigned short 的变量
USART3_RX_BUF
接收缓冲区
STM32串口接收数据
代码实现
if(USART3_RX_STA&0x8000)
{
printf("USART3_RX_BUF=%s\r\n",USART3_RX_BUF);
sprintf(a,"%s",USART3_RX_BUF);
printf("a=%s",a);
if(strstr((const char*)a,"on")) GPIO_ResetBits(GPIOB,GPIO_Pin_5);
if(strstr((const char*)a,"off")) GPIO_SetBits(GPIOB,GPIO_Pin_5);
USART3_RX_STA=0;
}
USART3_RX_STA
一个 unsigned short 的变量
USART3_RX_BUF
接收缓冲区
注意点
因为ESP8266利用串口向32发送的数据,数据格式不同,需要过滤掉多余的数据
具体实现还是看整体的工程代码
Client与Server
Client发送与接收
Client是单片机
esp8266_send_cmd("数据","OK",50);
数据发送流程
客户端利用串口给客户端的ESP8266发送数据
因为客户端与服务器已经连接,然后数据传输到服务器的ESP8266上
服务器的ESP8266又利用串口给32发送数据
最终32得到数据,可以根据数据执行相应的动作
图片示意图
Client是上位机
上位机简单理解就是电脑软件,手机软件,可以用来控制单片机
上位机发送数据,就是直接传输到服务器的ESP8266上,然后再利用串口发送给32
示意图
Server发送与接收
Server是单片机
同理
Server是上位机
同理
PCB设置
参考网址
硬件设计
ESP8266-NODEMCU开发板
ESP32-cam
外设
DHT11温湿度传感器
光敏传感器
AS608光学指纹模块
舵机
减速电机
步进电机
红外管
OLED显示屏
LED灯
其他
软件设计
服务器端
1.node-red
node-red是一个非常方便的在线可视化编程,且提供了web组件框架,可以很方便地进行测试开发;下图便是node-red的线上开发环境,可视化拖拉工具就行了。
2.MQTT服务器
EMQ主要用来搭建MQTT服务器,网上有很多现成免费的MQTT服务器可以使用,但终归自己的才是最好的;当使用node-red服务的时候,会出现途中掉线,服务挂掉的情况,这种情况是由于没有托管,导致node-red自动退出,可以使用dockter托管安装(但是由于刚开始不知道,我各种搜寻,找到了forever这个托管工具,用着倒是挺简单且没有出现问题),下图便是EMQ自带的管理后台。功能很多,但没用上,主要也就是用于MQTT服务器使用
嵌入式项目篇
基础知识
51
STM32
keil软件的安装与使用
安装
软件安装,破解
keil5安装包
注册机
相关的驱动与支持包
串口驱动
JlinkSTlink驱动
51
STM32F10X/F4
等等
需要什么就安装什么
使用
建立一个新的工程
使用别人的工程
keil一些重要的操作
程序烧录
串口下载
仿真器下载
Jlink下载
STlink下载
其他下载
点亮一个LED灯
配置IO口
void GPIO_Config(void) //GPIO初始配置
{
GPIO_InitTypeDef GPIO_InitStructure; //定义结构体变量
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD, ENABLE); //使能GPIOD的时钟
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13; //指定引脚13
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //设置输出速率50MHz
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出模式
GPIO_Init(GPIOD, &GPIO_InitStructure); //初始化外设GPIOx寄存器
}
将IO口拉高或拉低
GPIO_ResetBits(GPIOD,GPIO_Pin_13);
PD13引脚拉低
GPIO_SetBits(GPIOD,GPIO_Pin_13);
PD13引脚拉高
LED灯闪烁
在LED灯亮灭的基础上加上延时函数
融入delay.h与delay.c文件
在工程中融合其他模块程序
独立按键
进行相关设置
温湿度传感器
获取当前环境温湿度,显示到上位机
0.96寸OLED
显示屏
直流电机、电机驱动、扇叶
风扇
蜂鸣器
警报
RFID-RC522
门禁卡
ESP8266模块
实现通信的核心模块
会看,会用,会改
至于每个模块内部的具体原理,如果不是特别感兴趣,可以不用了解,会用就行
传感器
电机驱动
L298N
TB6612FNG
L9110S
测距
激光测距
超声波测距
OLED
WIFI
蓝牙
摇杆
语言模块
舵机
摄像头
图传
MPU6050
等等
实战项目
智能小车项目
智能小车远程控制系统
平衡小车
玲珑机器人(硬件)
机器人自平衡
主要模块
MUP6050
电机、电机驱动
机器人主体
设计思路
PID算法
OLED显示相关信息
显示相关参数,比如姿态、测距、文学、图像信息等
超声波测距
测量距离,可以利用距离来设计动作
舵机控制肢体动作
语音控制机器人动作
WIFI通信
利用APP控制机器人的基本动作
硬件摇杆
利用摇杆控制机器人动作
无线图传
显示图像信息
图像识别
根据图像实现设计的功能
掌握核心知识过后,就能做自己想做的,项目不在多,而是要能消化内部的知识。
辅助设计篇
焊接与基本测量工具
数字式万用表
测量前先打到测量的档位,要注意的是档位上所标的是量程,即最大值
吸锡器
电络铁
掌握好电烙铁的温度,当在铬铁上加松香冒出柔顺的白烟,而又不"吱吱"作响时为焊接最佳状态。控制焊接时间,不要太长,这样会损坏元件和电路板。清除焊点的污垢,要对焊接的原件用刻刀除去氧化层并用松香和锡预先上锡。
焊锡
焊接用品,在锡中间有松香
松香
除去氧化物的焊接用品
助焊剂
作用和松香一样,但效果比松香好,可是,因为助焊剂含有酸性,所以使用过的原件都要用洒精擦净,以防腐蚀。
示波器
示波器是一种用来测量交流电或脉冲电流波的形状的仪器,由电子管放大器、扫描振荡器、阴极射线管等组成。除观测电流的波形外,还可以测定频率、电压强度等。凡可以变为电效应的周期性物理过程都可以用示波器进行观测。
分类编辑
游标卡尺
游标卡尺(VERNIER CALLIPER),是一种测量长度、内外径、深度的量具。游标卡尺由主尺和附在主尺上能滑动的游标两部分构成。
其他
用啥就学啥
PCB画板与打印
软件安装
AD
入门难度稍大
立创EDA
主要介绍
其他也行
PCB是什么?
印刷电路板
为什么要用PCB?
减少赘余的线路
因为项目用面包板和杜邦线连接的话,整体看起来会显得杂乱无章,不美观,而且一旦模块过多,出现错误不容易排查。如果使用PCB,可以利用软件先画出自己想要的板子,然后去打印出来,再将对应模块安装好就行。
如何打印PCB?
嘉立创
https://www.jlc.com
锦邦达
http://pay.jinbang-pcb.com/Order_add.aspx
顺易捷
https://www.syjpcb.com
华秋
https://www.hqpcb.com
PCB文件制作方法
前期准备
这包括准备元件库和原理图。“工欲善其事,必先利其器”,要做出一块好的板子,除了要设计好原理之外,还要画得好。在进行PCB设计之前,首先要准备好的元件(原理图库和PCB库)。元件库可以用立创EDA的元件库,元件库内容丰富。
PCB结构设计
这一步根据已经确定的电路板尺寸,在PCB 设计环境下绘制PCB板面,并按定位要求放置所需的接插件、按键/开关、螺丝孔、装配孔等等。并充分考虑和确定布线区域和非布线区域。
PCB布局
按电气性能合理分区,一般分为:数字电路区(即怕干扰、又产生干扰)、模拟电路区(怕干扰)、功率驱动区(干扰源);
完成同一功能的电路,应尽量靠近放置,并调整各元器件以保证连线最为简洁;同时,调整各功能块间的相对位置使功能块间的连线最简洁;
对于质量大的元器件应考虑安装位置和安装强度;发热元件应与温度敏感元件分开放置,必要时还应考虑热对流措施;
I/O驱动器件尽量靠近印刷板的边、靠近引出接插件;
时钟产生器(如:晶振或钟振)要尽量靠近用到该时钟的器件;
在每个集成电路的电源输入脚和地之间,需加一个去耦电容(一般采用高频性能好的独石电容);电路板空间较密时,也可在几个集成电路周围加一个钽电容。
继电器线圈处要加放电二极管;
布局要求要均衡,疏密有序,不能头重脚轻或一头沉
特别注意
在放置元器件时,一定要考虑元器件的实际尺寸大小(所占面积和高度)、元器件之间的相对位置,以保证电路板的电气性能和生产安装的可行性和便利性同时,应该在保证上面原则能够体现的前提下,适当修改器件的摆放,使之整齐美观,如同样的器件要摆放整齐、方向一致,不能摆得“错落有致” 。
布线
布线一般有这么三种境界的划分
首先是布通,这时PCB设计时的最基本的要求。如果线路都没布通,搞得到处是飞线,那将是一块不合格的板子,可以说还没入门。
其次是电器性能的满足。这是衡量一块印刷电路板是否合格的标准。这是在布通之后,认真调整布线,使其能达到最佳的电器性能。
接着是美观。假如你的布线布通了,也没有什么影响电器性能的地方,但是一眼看过去杂乱无章的,加上五彩缤纷、花花绿绿的,那就算你的电器性能怎么好,在别人眼里还是垃圾一块。这样给测试和维修带来极大的不便。
布线优化和丝印
一般优化布线的时间是初次布线的时间的两倍。感觉没什么地方需要修改之后,就可以铺铜了(Place->polygon Plane)。铺铜一般铺地线(注意模拟地和数字地的分离),多层板时还可能需要铺电源。
对于丝印,要注意不能被器件挡住或被过孔和焊盘去掉。同时,设计时正视元件面,底层的字应做镜像处理,以免混淆层面。
网络和DRC检查和结构检查
在确定电路原理图设计无误的前提下,将所生成的PCB网络文件与原理图网络文件进行物理连接关系的网络检查(NETCHECK),并根据输出文件结果及时对设计进行修正,以保证布线连接关系的正确性;
网络检查正确通过后,对PCB设计进行DRC检查,并根据输出文件结果及时对设计进行修正,以保证PCB布线的电气性能。最后需进一步对PCB的机械安装结构进行检查和确认。
制版
总结
PCB设计是一个考心思的工作,谁的心思密,经验高,设计出来的板子就好。所以设计时要极其细心,充分考虑各方面的因数(比如说便于维修和检查这一项很多人就不去考虑),精益求精,就一定能设计出一个好板子
3D建模与打印
建模工具
SolidWorks
3Dmax
其他
会那种就用那种
模型打印
方式比较多,还得看3D打印机类型
一般是STL文件用的比较多
这方面主要是建模,得结合实际需求设计
文档撰写
思维导图
策划、海报、视频等等各方面
Linux项目篇
基础知识
Linux 基础知识
发展
特定和优势
应用场景
常见的Linux系统版本
CentOS
Ubuntu
其他
Linux 环境
搭建方式
虚拟机
云服务器
在线工具
其他
远程连接
SSH
连接工具
XShell
MobaXterm
FinalShell
Linux操作系统基础
文件和目录的操作
ls
显示文件和目录列表
cd
切换目录
pwd
显示当前工作目录
mkdir
创建目录
rmdir
删除空目录
touch
生成一个空文件或更改文件的时间
cp
复制文件或目录
mv
移动文件或目录、文件或目录改名
rm
删除文件或目录
ln
建立链接文件
find
查找文件
file/stat
查看文件类型或文件属性信息
echo
把内容重定向到指定的文件中 ,有则打开,无则创建
管道命令 |
将前面的结果给后面的命令,例如:`ls -la | wc `,将ls的结果加油wc命令来统计字数
重定向 > 是覆盖模式,>> 是追加模式
例如:`echo "Java3y,zhen de hen xihuan ni" > qingshu.txt `把左边的输出放到右边的文件里去
查看文件
cat
查看文本文件内容
more
可以分页看
less
不仅可以分页,还可以方便地搜索,回翻等操作
tail -10
查看文件的尾部的10行
head -20
查看文件的头部20行
系统信息
uname 查看系统信息
hostname 查看主机名
cat/proc/cpuinfo 查看CPU信息
lsmod 查看已加载的系统模块
top 查看系统使用情况
df 查看磁盘分区
du 查看目录使用情况
lostat 查看I/O 使用情况
free 显示系统内存情况
env 查看环境变量
uptime 查看系统运行时间、用户数、负载
系统操作
shutdown 关机
reboot 重启
mount 挂载设备
umount 卸载设备
管理用户
用户管理
useradd
添加用户
usermod
修改用户
userdel
删除用户
组管理
groupadd
添加组
groupmod
修改组
groupdel
删除组
成批添加/更新一组账户:newusers
成批更新用户的口令:chpasswd
组成员管理:
向标准组中添加用户
gpasswd -a <用户账号名> <组账号名>
usermod -G <组账号名> <用户账号名>
从标准组中删除用户
gpasswd -d <用户账号名> <组账号名>
口令管理
修改 /etc/login.defs 的相关配置参数
passwd
设置已存在用户的口令时效:
change
切换用户
su
sudo
用户相关的命令:
id:显示用户当前的uid、gid和用户所属的组列表
groups:显示指定用户所属的组列表
whoami:显示当前用户的名称
w/who:显示登录用户及相关信息
newgrp:用于转换用户的当前组到指定的组账号,用户必须属于该组才可以正确执行该命令
进程管理
ps:查找出进程的信息
nice和renice:调整进程的优先级
kill:杀死进程
作业管理
jobs:列举作业号码和名称
bg:
fg:在前台恢复运行
ctrl+z:暂时停止某个进程
自动化任务
at
cron
管理守护进程
chkconfig
service
打包和压缩文件
压缩
gzip filename
bzip2 filename
tar -czvf filename
解压
gzip -d filename.gz
bzip2 -d filename.bz2
tar -xzvf filename.tar.gz
grep+正则表达式
grep -n mystr myfile
在文件 myfile 中查找包含字符串 mystr的行
grep '^[a-zA-Z]' myfile
显示 myfile 中第一个字符为字母的所有行
Vi编辑器
普通模式
G
ZZ
ZQ
/和?
n
yy
p
dd 删除一行文本
u 取消上一次编辑操作(undo)
插入模式
使用i或a或o进去插入模式
使用esc返回普通模式
命令行模式
w
w
wq
q!
q
设置Vi环境
set autoindent 缩进,常用于程序的编写
set noautoindent 取消缩进
set number 在编辑文件时显示行号
set tabstop=value 设置显示制表符的空格字符个数
set 显示设置的所有选项
权限管理
改变文件或目录的权限:chmod
改变文件或目录的属主(所有者):chown
设置文件的缺省生成掩码:umask
文件扩展属性
其他
ifconfig:查看网络接口信息
ifup/ifdown:开启或关闭接口
临时配置相关
route命令:可以临时地设置内核路由表
hostname命令:可以临时地修改主机名
sysctl命令:可以临时地开启内核的包转发
ifconfig 检测网络接口配置
route 检测路由配置
ping 检测网络连通性
netstat 查看网络状态
lsof 查看指定IP 和/或 端口的进程的当前运行情况
host/dig/nslookup 检测DNS解析
traceroute 检测到目的主机所经过的路由器
tcpdump 显示本机网络流量的状态
安装软件
yum
rpm
wget
vim
基本工作模式
命令模式
移动光标
左移
右移
下移
上移
光标移动文件开头
光标移动到文件末尾
光标移动到行首
光标移动到行尾
跳转到第123行
删除
删除光标后一个字符,相当于 Del
删除光标前一个字符,相当于 Backspace
删除光标开始位置的字,包含光标所在字符
光标必须移动到删除单词的首字符上
删除光标前本行所有内容
删除光标后本行所有内容
删除光标所在行
删除10行
并不是真的删除,实际上是剪切
撤销操作
一步一步撤销
反撤销
复制粘贴
复制当前行
从当前行开始复制10行
在光标所在位置向下新开辟一行,粘贴
在光标所在位置向上新开辟一行,粘贴
可视模式
按字移动
按行移动
如何移动光标?
如何复制选中的内容?
查找操作
从光标所在位置向后查找 hello
从光标所在位置向前查找 hello
在要查询的单词上使用哪个符号就能对单词进行查找
切换位置?
替换操作
替换所在的字符
文本行移动
文本行右移
文本行左移
查看 Man Page
光标移动到函数上
查看第三章的 ManPage
文本输入模式
进入输入模式
插入光标前一个字符
插入行首
插入光标后一个字符
插入行未
向下新开一行,插入行首
向上新开一行,插入行首
删除光标所在的字符
删除当前行
末行模式
命令
行跳转
跳转到第123行
替换
替换一行
将当前行中的第一个abc替换为123
将当前行中的abc全部替换为123
替换全部
将所有行中的第一个abc替换为123
将所有行中的abc全部替换为123
替换指定行
将10-30行中的abc全部替换为123
执行shell命令
分屏操作
末行模式
水平分屏
垂直分屏
分屏显示两个不同的文件
操作
保存并退出所有屏幕
保存并退出光标所在的屏幕
屏幕切换
vim 打造 IDE
系统级配置文件目录:
用户级配置文件目录:
命令模式
命令模式
文本模式
末行模式
完成
文件
完成
Linux网络编程
计算机网络知识补充
计算机网络概论
应用层协议
运输层协议:TCP与UDP
网络层协议
数据链路层协议
TCP网络通信刨析
三次握手与四次握手
TCP流量控制
TCP拥塞避免
TCP状态转换
socket网络编程接口
socket的创建与关闭
server端:bind、listen、accept
Client端:connect
数据的发送与接收:send、recv
UDP编程实现
在UDP上使用connect
基于CS模型的TCP客服端设计与实现
P2P模型网络服务的实现
HTTP与BS模型
简单的网络并发模型
基于多线程与多进程
简单的IO多路复用机制
项目实战
服务器集群监控系统
Linux系统编程
Linux系统编程入门
命令行参数解析
用于调试测试的宏实现
通用功能封装
文件I/O
文件的打开、关闭、读写
阻塞与非阻塞IO
同步IO
内核内幕:虚拟文件系统
缓冲I/O
标准I/O
流的开大、关闭与读写
控制缓冲
线程安全:对文件加锁
多进程编程
进程体系:进程ID,父子进程关系
运行新的进程:fork、exec
终止进程
等待子进程退出
特殊进程
僵尸进程
孤儿进程
守护进程
高级进程管理
进程调度
完全公平调度算法
实时系统的原理与实现
线程池的实现
进程与通信IPC
基于文件的简单进程间通信
共享内存:互斥锁、条件变量
管道:匿名管道与命名管道
共享存储映射
消息队列
信号量
套接字
多线程编程
线程与进程的对比
线程模型
线程API
线程模式
一个连接对应一个线程
事件驱动
并发、并行和竞争
同步:互斥与死锁
信号
基本信号管理
发送信号
信号集
高级信号管理
时间
时间的表示
睡眠与等待
定时器
高级IO
分散、聚集IO
IO多路复用
select
poll
epoll
IO调度器与IO性能
终端IO编程
终端驱动程序的模式
ncurses库使用
项目实战
实现自己的shell
实战项目
Client/Server
介绍
Socket是进程间通信的方式之一,是进程间的通信。这里说的进程并不一定是在同一台机器上也有可能是通过网络连接的不同机器上。只要他们之间建立起了socket的连接,那么数据便可以在机器之间进行双向的交流,直到连接断开。
socket的建立
在我们接触到实际的代码API之前,我们应该对基础的连接方式有所了解。
Note left of server: 建立一个正被监听的socket并等待客户端的连接
Note right of client: 建立一个客户端的socket并尝试连接server
Note left of server: 接受来自client的连接请求
server->client: 发送与接受数据
client->server: 接受与发送数据
Note left of server: 关闭当前的连接
Note right of client: 关闭当前的连接
连接步骤
首先server需要创建正在被监听的socket,等待client的连接请求。
client创建一个socket,尝试连接server。
server接受client的请求,建立起两者之间的连接。
数据交换,双向通信。
任何一方都可以断开连接,断开后连接会自动销毁。
Client
通过系统函数socket()创建一个socket。
通过系统函数connect()向server端的socket发起请求。
交换数据,实现这种数据交换的方式有很多种方式,其中最简单的就是使用系统函数read(),write()。
Server
通过系统函数socket()创建一个socket。
通过系统函数bind()绑定这个socket到server的一个端口上。
通过系统函数listen()监听这个socket。
当监听到又一个请求来临时,通过系统函数accept()接受一个请求。这个函数会阻塞io直到两者的连接完全断开。
交换数据。
socket的类型
当一个socket被建立起来之后,进程间需要去说明所使用的协议和socket type。只有通信的双方都拥有相同的type和协议。
目前广泛使用的协议有两大类,分别是Unix文件系统协议(Unix domain)、Internet网络协议(Internet domain)。对应的他们有各自的特点。使用Unix domain的双方使用公共的文件系统进行通信,使用Internet domain的进程分别位于不同的主机上,他们通过网络进行通信。
使用Unix domain的socket地址本质上就是文件系统的一个记录,本身是一条字符串。
使用Interner domain的socket包含两部分,一部分是主机的IP地址,一部分是socket绑定到的端口号。一般端口号比较低的端口都会被当作特殊的用途,比如端口号是80的端口是提供http服务的。
目前广泛使用的socket类型也是两种,一种是流socket(stream sockets),一种是数据报socket(datagram sockets)。stream socket处理通信就像是处理流水一样的连续不断的字节流,而datagram sockets需要读取完整的字符,通常一个字符由几个字节组成。
建立在使用TCP协议的基础上,这是一种可靠的面向字节流的协议,另外一种协议是UDP协议,这是一种不可靠的面向字符的协议。
创建步骤
创建socket
socket_desc = socket(AF_INET, SOCK_STREAM, 0);
if (-1 == socket_desc) {
perror("cannot create socket");
exit(1);
}
设置远程服务器的信息
server.sin_addr.s_addr = inet_addr("127.0.0.1");
server.sin_family = AF_INET;
server.sin_port = htons(80);
连接
if (connect(socket_desc, (struct sockaddr *)&server, sizeof(server)) < 0) {
perror("cannot connect");
return 0;
}
当服务器接受请求时便会建立连接
函数说明
connect()函数
简介
connect()函数会向服务器发起请求建立一个连接。
参数
int sockfd => socket的描述符
const struct sockaddr *addr => sockaddr的结构体,通用的socket地址
socklen_taddrlen => socket描述符的长度。
struct sockaddr是通用的套接字地址,而struct sockaddr_in则是Internet环境下套接字的地址形式,二者长度一样,都是16个字节。二者是并列结构,指向sockaddr_in结构的指针也可以指向sockaddr。一般情况下,需要把sockaddr_in结构强制转换成sockaddr结构再传入系统调用函数中。
另外代码中的htons()函数的作用是将主机的数据转化为网络字节的顺序
send()函数
recv()函数
htons()函数
socket()函数
介绍
https://www.cnblogs.com/tingyugetc/p/6253041.html
网上很多资料,搜一搜就会有很多
实现自己的shell
网址
https://blog.csdn.net/OCTODOG/article/details/70942194
https://blog.csdn.net/qq_44049351/article/details/99702807
服务器集群监控系统
网址
https://blog.51cto.com/wangfx/1955766
网上资料比较冗杂,要学会区分
搭建一个网站
拓展篇
FreeROTS嵌入式实时操作系统
网址
官网
https://www.freertos.org
https://zhuanlan.zhihu.com/p/90608412
https://www.pcworld.com/article/460666/tesla_cto_talks_model_s_batteries_and_incar_linux.html
视频
https://www.bilibili.com/video/BV1C5411M7gK?from=search&seid=5307118440328018083&spm_id_from=333.337.0.0
在B站搜有很多,韦东山,正点原子等都有
如何移植FreeROTS
Linux实时操作系统
简介
RTLinux(AReal-Time Linux,亦称作实时Linux)是Linux中的一种 实时操作系统 。
网址
https://zhuanlan.zhihu.com/p/147563274
ucos实时多任务操作系统
网址
https://blog.csdn.net/ideal121/article/details/119571307
ARM
网址
https://blog.csdn.net/weixin_38717634/article/details/112860225?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522163324583316780274116753%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=163324583316780274116753&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~top_click~default-2-112860225.pc_search_all_es&utm_term=ARM&spm=1018.2226.3001.4187
ESP
网址
https://blog.csdn.net/wdscq1234/article/details/52705458?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522163324798016780261927900%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=163324798016780261927900&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduend~default-1-52705458.pc_search_all_es&utm_term=ESP&spm=1018.2226.3001.4187
其他
总结
每一个方想深入都比较难,建议多实践操作与总结,自己也很多内容没整明白,但是往后的时间会不断去学,加强巩固,深入拓展
入门建议看视频,跟着视频练,对基础知识掌握过后,就要多实践思考,基础非常重要,不要没基础就去研究深奥的知识