若我们今日发起一项投票,Python、C和C++很可能会位列树莓派编程语言排行榜前列。但最近,我偶然发现了另一种语言。尽管它不那么广为人知,但潜力巨大,尤其是当你在项目中追求速度与性能时。
Rust融合了C/C++的速度、现代语言的安全性以及日益增长的物联网支持,成为树莓派项目的强大选择。
在本教程中,我们将从安装Rust开始,一路探索到编写首个“Hello World”程序。更进一步,我们还将编写一个小程序,让树莓派上的LED灯闪烁起来。
为何在树莓派上使用Rust?
初用树莓派时,我首先接触的语言(有趣的)是C++。几乎每个人都是从Python开始的,但那时,我正在进行的项目是以C++为基础的。那是一个循迹机器人。
https://raspberrytips.com/best-raspberry-pi-robots-kits/
项目完成后,我转而使用Python。它最终成了我的最爱,因为Python资源丰富、库众多,且语法易用、可读性强。你可以查看我们关于树莓派Python与C++对比的文章,了解哪种语言更适合你的项目。
几年后,我偶然接触到了Rust。我说“偶然”是因为,尽管我有扎实的软件开发背景,但在此之前从未使用过或编写过一行Rust代码。
我决定在一个之前用Python做过的与网络安全相关的小项目上使用Rust,我发现Rust赋予了我们C和C++般的速度。
你看,Python是解释型语言,这意味着运行时需要解释器来逐行解释代码,因此执行速度较慢。而Rust是编译型语言,在执行前直接转换为机器码。因此,Rust一旦编译完成,运行速度就快得多。
与其他树莓派语言的对比
| 语言 | 优势 | 劣势 | 最佳用途 |
| Python | 易于学习,社区庞大,树莓派教程众多。 | 适合初学者,快速原型设计,自动化脚本 | 适合初学者,快速原型设计,自动化脚本。 |
| C/C++ | 高性能,直接硬件访问,广泛用于嵌入式系统。 | 手动内存管理,学习曲线陡峭。 | 适合初学者,快速原型设计,和自动化脚本。 |
| Rust | 性能接近C/C++,内存安全,现代工具(cargo)。 | 编译时间长,生态系统比Python小。 | 可靠的物联网应用,安全高效的树莓派项目。 |
在树莓派上设置Rust
现在你已经对Rust有了很好的了解,我将带你完成在树莓派上安装和设置Rust的过程。这是一个简单的过程,只需几分钟。
但首先,让我回顾一下本教程所需的一些物品。
要求
要继续学习,请确保你已具备:
更新的树莓派操作系统:在终端中运行以下命令以保持软件包更新是一个好方法:
sudo apt updatesudo apt upgrade
无论如何,如果你还没有安装操作系统,可以查看我们关于如何在树莓派上安装(或重新安装)树莓派操作系统的文章。
https://raspberrytips.com/install-raspberry-pi-os/
稳定的互联网连接:由于我们将安装多个软件包,你需要一个良好且活跃的互联网连接,无论是通过WiFi还是以太网。
访问终端:可以直接在树莓派终端上访问,也可以通过SSH访问。
cURL(客户端URL):你需要这个工具来下载Rust安装脚本。你可以使用以下命令检查是否已安装:
curl --version
如果未安装,请使用以下命令安装:
sudo apt install curl
在树莓派上安装Rust
安装Rust最简单的方法是使用rustup。它是安装和管理Rust编程语言的官方推荐工具。https://rustup.rs/
打开终端并运行以下命令:
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
这将下载并安装Rust以及Cargo(Rust的软件包管理器和构建工具)。在安装过程中,你会看到一个提示,要求选择你想要的“安装选项”。它们包括:
继续标准安装(默认-只需按回车键)。
自定义安装。
取消安装。
只需输入“1”并按回车键继续。
如果你的互联网连接良好,安装只需几分钟。完成后,我们需要做的第一件事是确保终端知道在哪里找到Rust。通常,rustup会处理这一点,但为了确保无误,请运行以下命令:
source $HOME/.cargo/env
验证Rust安装
安装Rust后,下一步是在开始编写代码前验证安装。你可以使用以下命令轻松完成:
rustc --version
在树莓派上编写首个Rust程序
至此,我们已经一切就绪。Rust已经安装在树莓派上,现在我们可以深入到精彩的部分——编写我们的首个Rust程序。
使用Cargo创建新项目
我将使用Rust内置的软件包管理器和构建系统Cargo,它使项目设置和管理变得超级简单。Download now
打开终端并运行以下命令:
cargo new hello_rustcd hello_rust
这两个命令做了两件简单的事情。第一个命令创建了一个全新的Rust项目,名为hello_rust。Cargo立即设置了我们需要的一切,无需寻找文件或构建工具。
第二个命令帮助你导航到新创建的hello_rust目录。
如果你遇到“Command ‘cargo’ not found”错误,这意味着Crago未随rustup成功安装。不过,你可以使用以下命令继续安装:
sudo apt install cargo
了解项目结构
当你查看项目结构(hello_rust文件夹)时,你会发现两个主要部分:
Cargo.toml:这是项目的配置文件。它就像一张“配方卡”,我们在上面列出项目名称、版本以及我们想要使用的任何依赖项(额外的库)。如果你之前使用过JavaScript框架,如ReactJS,它有点类似于“package.json”文件。
src/main.rs:这是实际的Rust源代码文件。默认情况下,Cargo会在这里为我们放置一个简单的“Hello, world!”程序。
以下是我文件夹的截图:
现在,如果你进入src文件夹并打开main.rs文件,你会看到一些默认代码,如下所示。
fn main() {println!("Hello, world!");}
打印“Hello, Raspberry Pi!”
那只是一行简单的代码。为了体验Rust编程语言的魅力,让我们做点稍微复杂的事情,这需要几行代码。
我们将创建一个Rust程序,提示用户输入他们的名字(比如Joe),然后打印一条消息,如“Welcome Joe – this is Raspberrytips.com”。
use std::io;fn main() {println!("What is your name?");// Create a new mutable String to store inputlet mut name = String::new();// Read input from the terminal// This prompts users to enter their name in the terminalio::stdin().read_line(&mut name).expect("Failed to read line");// Trim whitespace (like newline) from the inputlet name = name.trim();// Print the personalized messageprintln!("Welcome {} - this is Raspberrytips.com", name);}
现在,让我快速概述一下这个程序的功能:
我们导入std::io:这将使你能够在程序中实现读取输入或输出(I/O)的功能。这使我们能够从终端读取用户的名字。
接下来,我们使用以下行提示用户输入他们的名字:println!(“What is your name?”);。
我们使用read_line()来获取用户输入的内容。
用户输入名字后,会按回车键。这会在我们的代码中引入一个不需要的换行符(n)。我们使用.trim()来移除这个换行符。
最后,我们使用{}来插入他们的名字,打印欢迎消息。
运行程序
现在,让我们运行这个程序,看看结果如何。要运行Rust程序,你只需导航到项目文件夹并输入以下命令:
cargo run
Cargo将编译代码并运行它。如果一切正常,你会看到一个提示,要求你输入名字。
输入你的名字并按回车键。程序将显示包含你名字的欢迎消息。
那真的很有趣。这让我想起了几年前学习C语言的时光。那是我学的第一种编程语言,我们可以编写一些像这样需要用户输入的有趣程序。
将Rust与树莓派GPIO结合使用
至此,我相信我们已经对Rust有了很好的掌握。我们学会了如何在树莓派上安装它,甚至编写了一个提示用户输入的简单程序。
在本节中,我们将编写一个Rust程序,让连接到树莓派GPIO引脚之一的LED灯闪烁。
要求
这是一个动手项目,需要一些物品。以下是项目所需的一些物品:
LED灯:我使用的是(8mm,3.5V,30mA)的LED灯。
电阻:这将取决于你使用的LED灯。但需要注意的是,“电阻值越高,LED灯越暗”。
面包板:如果你擅长焊接并能完美地将LED灯和电阻焊接到GPIO引脚上,这是可选的(但我不推荐)。
跳线。
LED灯闪烁代码
要编写让LED灯闪烁的代码,首先,我们需要使用Cargo创建一个新的Rust项目。你还记得我们在上一节中是怎么做的吗:
cargo new blink_led
然后导航到blink_led文件夹并编辑main.rs文件。
接下来,使用你喜欢的代码编辑器打开main.rs文件,并粘贴以下代码。在我这里,我使用的是nano编辑器。
use std::error::Error;use std::thread;use std::time::Duration;use rppal::gpio::Gpio;use rppal::system::DeviceInfo;// Gpio uses BCM pin numbering. BCM GPIO 23 is tied to physical pin 16.const GPIO_LED: u8 = 23;fn main() -> Result<(), Box<dyn Error>> {println!("Blinking an LED on a {}.", DeviceInfo::new()?.model());let mut pin = Gpio::new()?.get(GPIO_LED)?.into_output();loop {// Turn LED onpin.set_high();thread::sleep(Duration::from_millis(1000));// Turn LED offpin.set_low();thread::sleep(Duration::from_millis(1000));}}
运行程序
要运行程序,我们将像上一节中那样使用cargo:
cargo run
以下是我得到的结果。
……
从上面的视频中,你可以看到我们成功地用Rust让LED灯闪烁了起来。这清楚地表明,Rust也可以用于处理复杂的硬件项目。
我希望我已经为你提供了在树莓派上开始使用Rust的清晰指南。如果你是初学者,你可以先从事不需要太多硬件调整的项目。一旦你掌握了这门语言,你就可以进一步探索GPIO引脚了。
常见问题解答
Rust 中的交叉编译是什么?
交叉编译指的是在一台机器上构建你的 Rust 程序,但目标却是另一台不同机器或架构。
例如,你不直接在树莓派上进行编译(这在大型项目中可能会很慢),而是在性能更强的台式机或笔记本电脑上编译代码,然后将生成的二进制文件复制到树莓派上。
树莓派上关于 Rust 的资源多吗?
遗憾的是,与 Python 不同,树莓派上 Rust 资源的可用性并不广泛,也不成熟。不过,随着 Rust 在树莓派社区中继续受到欢迎,几年之后情况可能会完全不同。
如果你想查看具体产品内容,可以通过原文进行了解:
https://raspberrytips.com/rust-programming-raspberry-pi/
官方网站:https://edatec.cn/zh/cm0
淘宝店铺:https://edatec.taobao.com/
1172