【Linux應用】開發板快速上手:鏡像燒錄、串口shell、外設掛載、WiFi配置、SSH連接、文件交互(RADXA ZERO 3為例)
參考:
ZERO 3 | Radxa Docs
大部分的Linux開發板等設備都大同小異 如樹莓派、香橙派、STM32MP135的Linux開發板等
使用該文章實際上是一種比較通用的方式 其操作與別的板子大同小異
文章目錄
- ZERO 3燒錄
- ZERO 3串口shell
- 外設掛載
- 連接WiFi
- SSH連接
- SSH的文件交互
- 換源
- 附錄:C語言到C++的入門知識點(主要適用于C語言精通到Qt的C++開發入門)
- C語言與C++的不同
- C++中寫C語言代碼
- C語言到C++的知識點
- Qt開發中需要了解的C++基礎知識
- namespace
- 輸入輸出
- 字符串類型
- class類
- 構造函數和析構函數(解析函數)
- 類的繼承
ZERO 3燒錄
ZERO 3有兩種 最本質的就是一個帶WiFi一個不帶WiFi
ZERO 3作為一個Linux板 其存儲支持從sd卡EFI啟動
系統安裝則直接通過Balena Etcher來進行
可以使用其Windows版本即可
官方文檔:
官方文檔快速上手描述
鏡像下載則也可以使用官方鏡像:
Radxa ZERO 3 Debian Build 6
該鏡像是最初的鏡像 很多依賴都沒有
如果開發的話 可以直接下載第三方鏡像 或者自己在原有官方鏡像上去安裝鏡像包等等
燒錄很簡單 直接用工具選擇U盤 選擇鏡像即可
下圖為燒錄好了的sd卡
除了系統分區外 就是一個config分區 其掛載根根目錄名稱即為config
ZERO 3串口shell
串口與ZERO 3鏈接如下圖:
鏈接后 配置串口為
baudrate: 1500000
data bit: 8
stop bit: 1
parity : none
flow control: none
啟動后 用戶名和密碼都為radxa
外設掛載
根據df
命令查詢系統掛載點
其做好了的U盤外部存儲空間為/config
連接WiFi
使用如下指令鏈接WiFi:
nmcli device wifi #掃描WiFi
sudo nmcli device wifi connect <ssid> password <passwd> #連接WiFi
連上后 使用ip a
命令即可查看連接狀態和ip
SSH連接
使用命令sudo systemctl status ssh
查看ssh狀態
前提是要安裝ssh
如果沒有安裝 則通過shell安裝ssh:
sudo apt-get update
sudo apt-get install openssh-server openssh-sftp-server
根據Active
判斷是否需要重啟ssh服務:
重啟ssh服務:
sudo systemctl restart ssh
啟動后如下:
Active
狀態就被設置為了running
開機自啟動ssh則使用命令:
sudo systemctl enable --now ssh
在PC上 支持ssh的設備中 使用以下指令鏈接到板子:
ssh [username]@[IP address] # or ssh [username]@[hostname]
如下圖:
SSH的文件交互
若是在PC上作為主機去訪問設備
那么就是在PC的cmd中運行shell
有的終端軟件配備了ssh的文件管理傳輸功能
連上以后就可以直接搜素到當前目錄下的各類文件 以便于實現文件管理
并且可以直接download
# 復制 Windows 文件到 Linux
scp D:\data\1.txt root@192.168.88.161:/root/data
# 復制 Windows 目錄到 Linux(記得加 -r)
scp -r D:\data root@192.168.88.161:/root/data# 復制 Linux 文件到 Windows
scp root@192.168.88.161:/root/data/1.txt D:\data
# 復制 Linux 目錄到 Windows(記得加 -r)
scp -r root@192.168.88.161:/root/data D:\data
前提是設備開啟了ssh可以被鏈接
發過去后便能在板子上看到:
回傳文件夾:
如果是Linux設備去連接Windows設備 則需要在Windows里面設置對應的服務 相關教程很多 這里不過多贅述
如果是Linux設備訪問Linux設備 則主設備也要指定IP
scp root@192.168.88.161:/root/1.txt root@192.168.88.162:/root# 如果設置了Linux之間的免密登錄,可這樣寫:
scp 192.168.88.161:///root/1.txt 192.168.88.162:///root
換源
Linux系統的源都在/etc/apt/
下 一般有兩個文件
一個是sources.list
另外一個是sources.list.d
目錄下的品牌list文件
如樹莓派需要備份原本的源:
sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak
sudo cp /etc/apt/sources.list.d/raspi.list /etc/apt/sources.list.d/raspi.list.bak
而radxa的則是:
sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak
sudo cp /etc/apt/sources.list.d/radxa.list /etc/apt/sources.list.d/radxa.list.bak
將原本的文件進行編輯:
sudo nano /etc/apt/sources.list
注釋掉最初的源 并添加新的源:
deb https://mirrors.tuna.tsinghua.edu.cn/debian bookworm main contrib non-free-firmware
deb https://mirrors.tuna.tsinghua.edu.cn/debian-security bookworm-security main contrib non-free-firmware
deb https://mirrors.tuna.tsinghua.edu.cn/debian bookworm-updates main contrib non-free-firmware
如圖:
然后再換子目錄下的源
sudo nano /etc/apt/sources.list.d/raspi.list
替換成:
deb https://mirrors.tuna.tsinghua.edu.cn/raspberrypi/ bullseye main
不過很可惜 清華源沒有radxa 但是可以換debian的源(/etc/apt/sources.list
):
deb https://mirrors.tuna.tsinghua.edu.cn/debian/ bullseye main contrib non-free
deb-src https://mirrors.tuna.tsinghua.edu.cn/debian/ bullseye main contrib non-free
deb https://mirrors.tuna.tsinghua.edu.cn/debian/ bullseye-updates main contrib non-free
deb-src https://mirrors.tuna.tsinghua.edu.cn/debian/ bullseye-updates main contrib non-free
deb https://mirrors.tuna.tsinghua.edu.cn/debian/ bullseye-backports main contrib non-free
deb-src https://mirrors.tuna.tsinghua.edu.cn/debian/ bullseye-backports main contrib non-free
deb https://mirrors.tuna.tsinghua.edu.cn/debian-security bullseye-security main contrib non-free
deb-src https://mirrors.tuna.tsinghua.edu.cn/debian-security bullseye-security main contrib non-free
換源后 執行
sudo apt-get upgrade
sudo apt-get update
附錄:C語言到C++的入門知識點(主要適用于C語言精通到Qt的C++開發入門)
C語言與C++的不同
C語言是一門主要是面向工程的語言
C++則是面向對象
C語言中 某些功能實現起來較為繁瑣
比如結構體定義:
一般寫作:
typedef struct stu_A
{
}A;
也可以寫作:
typedef struct
{
}A;
但 大括號后面的名稱是不可省去的
不過 C++的寫法就比較簡單
除了支持上述寫法外
也支持直接聲明
typedef struct A
{
}
另外 C++是完全支持C語言庫和語法的
不過C++里面的庫也有些很方便的高級功能用法 只不過實現起來可能不如C的速度快
再者 C語言與C++的編譯流程不一樣
C語言沒有函數重載 所以給編譯器傳參就是直接傳函數名稱
但是C++除了傳函數名稱外 還會穿函數的參數、類型等等 以實現函數重載
C++中寫C語言代碼
上文提到 C++可以完全兼容C的寫法
但是編譯流程也還是不一樣
所以如果在編譯層面進行C語言代碼編譯 則通常用以下方法:
extern "C"
{
...
}
表面大括號內的內容用C的方法進行編譯
另外 如果還是用C++的編譯器 但要實現C語言函數 則需要用到C語言的庫
在C語言中 我們一般用如下方法導入庫
#include <stdio.h>
此方法同樣適用于C++ 但是C++可以更方便的寫成去掉.h的方式
比如:
#include <iostream>
在C++中 為了調用C語言的庫 可以采用在原庫名稱前加一個"c"的方式導入
如:
#include <cstdio>
這樣就可以使用printf等函數了 甚至比C++的std方法更快
C語言到C++的知識點
Qt開發中需要了解的C++基礎知識
namespace
C++面向對象的特性下誕生的一個名稱
表示某個函數、變量在某個集合下 用作namespace
比如 <iostream>
庫中的關鍵字cin在std下 則寫作std::cin
std就是namespace
::表示某空間下的某某
前面是空間名稱 后面是變量、函數名稱
用using namespace
可以告訴編譯器以下都用xx名稱空間
比如:
using namespace std;
cout<<"a";
如果沒有告訴編譯器所使用的空間名稱 則要寫成:
std::cout<<"a";
同樣 可以自定義某一段代碼屬于哪個空間:
namespace xx
{
...
}
輸入輸出
在C++中 用iostream作為輸入輸出流的庫
#include <iostream>
用cin和cout關鍵字進行輸入和輸出
如:
using namespace std;
int a=0;
cin>>a; //輸入到acout<<a; //輸出a
類比scanf和printf
同樣 還有一個關鍵字endl表示換行
cout和cin的傳參是不固定的
由編譯器自行裁定
字符串類型
在C語言中 常用char *表示字符串
但是在C++中 可以直接用string類型
比如:
char * s="456";
string str="123";
由于cout的特性 這兩種字符串都可以直接打印
但如果使用C語言中printf的打印方式時 采用%s方式打印字符串 則不能傳入string類型
class類
C++的核心就是class
同Python等支持面向對象的語言一樣
可以理解成一個支持函數、繼承、自動初始化、銷毀的結構體
在class類中 有private
私有、public
公有變量
前者只能內部訪問 后者可以外部調用使用
如:
class A
{
public:
int a;
private:
int b;
}
a可以用A.a的方式方位 b則外部無法訪問
構造函數和析構函數(解析函數)
構造函數可以理解成對類的初始化 反之析構函數則是退出時進行銷毀前的函數
兩者需要與類的名稱相同 析構函數則在前面加一個~表示非
如:
class A
{
public:
int a;
A();
~A();
private:
int b;
}A::A()
{
...
}A::~A()
{
...
}
構造函數可以定義傳參 析構函數則不行
類的繼承
如果有兩個類A和B 想讓A里面包含B 則可以寫作繼承的寫法
繼承后 A類的變量可以直接調用B下面的成員
如:
class B
{
int b;
}
class A: public B
{
int a;
}
在定義A后 可以訪問到B的成員b 當然 繼承也可以私有