思維導圖文章末附錄,這里主要是專案體系,具體內容分篇章講解,
個人網站
緒論
教程說明
因為模塊太多,全部放在一起有些冗雜,所以每一個部分都有單獨的檔案,也為了能更好的描述,切換畫布或者點擊鏈接跳轉就可以查看
應該加強核心的知識,并且學會融合進入其他的專案當中,舉一反三,比如可以利用單片機與顯示屏生成顯示二維碼,學生管理系統連接到資料庫操作,五子棋實作人機對戰等等,簡單的邏輯實作比較簡單,但是多元化的融合需要有較深的理解,
以簡入繁,以劍破點,每一個知識點都要直擊核心,抓住重點,每個人精力都有限,我希望用更短的時間做更高效的事,
培養方案
專案主要以實踐為主,會寫文章,做視頻進行教學,刨析內部的每一個知識細節,通過一個專案,能掌握一個體系的知識,不過視頻暫時做不了,因為沒時間
教程總結
由于時間有限,個人水平有限,教程的內容敘述較淺,因為知識面較廣,每一部分想要深入都需要大量的時間,想要真的掌握需要時間的沉淀,不過入門過后就能按照自己的需求去深入學習,網上有很多較好的開源資料,幾乎想學什么都會有,所以找資源也是一個非常重要的技能,
專案在于精,而不在于多,從簡單的實作到不斷拓展精煉,從而實作更實用,更完善的專案,知識面廣有助于思維的擴散,但是專精某一方向,才能在領域中有立足之地,
不積跬步無以至千里
語言篇
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
其他
總結
每一個方想深入都比較難,建議多實踐操作與總結,自己也很多內容沒整明白,但是往后的時間會不斷去學,加強鞏固,深入拓展
入門建議看視頻,跟著視頻練,對基礎知識掌握過后,就要多實踐思考,基礎非常重要,不要沒基礎就去研究深奧的知識



轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/305409.html
標籤:其他
上一篇:Linux之無人值守安裝系統
下一篇:高防服務器和高防CDN
