【欧时RS x Arduino】3、Arduino UNO Q Debian应用开发
Arduino UNO Q运行的操作系统是Debian13,意味着可以开发Linux应用,安装Linux软件包,学习Linux系统的应用程序开发# 1、软件源更换
开发板固件设置的软件源**慢,修改系统下载资源的软件源,用于提高软件的**。
通过`cat /etc/os-release`可以获得系统版本的详细信息,可知Arduino UNO Q使用的是最新的Debian13版本。
```
arduino@EEFocus2026:~$ cat /etc/os-release
PRETTY_NAME="Debian GNU/Linux 13 (trixie)"
NAME="Debian GNU/Linux"
VERSION_ID="13"
VERSION="13 (trixie)"
VERSION_CODENAME=trixie
DEBIAN_VERSION_FULL=13.5
ID=debian
HOME_URL="https://www.debian.org/"
SUPPORT_URL="https://www.debian.org/support"
BUG_REPORT_URL="https://bugs.debian.org/"
```
由于 UNO Q 使用的是新版 Debian 的 DEB822 格式,配置文件位于 `/etc/apt/sources.list.d/`目录下,而非传统的 sources.list。通过查看该目录下的文件,
```
arduino@EEFocus2026:~$ ls /etc/apt/sources.list.d
arduino.listdebian-backports.sourcesdebian.sourcesqsc-deb-releases.sources
```
查看其中的`debian.sources`的内容,确定当前系统的源的URI的值。
```
arduino@EEFocus2026:~$ cat /etc/apt/sources.list.d/debian.sources
# Debian archive
Types: deb
URIs: http://deb.debian.org/debian/
Suites: trixie
Components: main contrib non-free non-free-firmware
Signed-By: /usr/share/keyrings/debian-archive-keyring.gpg
# Debian stable updates
Types: deb
URIs: http://deb.debian.org/debian/
Suites: trixie-updates
Components: main contrib non-free non-free-firmware
Signed-By: /usr/share/keyrings/debian-archive-keyring.gpg
# Debian security updates
Types: deb
URIs: http://deb.debian.org/debian-security/
Suites: trixie-security
Components: main contrib non-free non-free-firmware
Signed-By: /usr/share/keyrings/debian-archive-keyring.gpg
```
备份当前的`debian.sources`文件
```c
sudo cp /etc/apt/sources.list.d/debian.sources /etc/apt/sources.list.d/debian.sources.bak
```
查看国内清华源的帮助说明,https://mirrors.tuna.tsinghua.edu.cn/help/debian/,编辑`debian.sources`文件,修改其中的URIs的值。
```
arduino@EEFocus2026:~$ cat /etc/apt/sources.list.d/debian.sources
# Debian archive
Types: deb
URIs: https://mirrors.tuna.tsinghua.edu.cn/debian
Suites: trixie
Components: main contrib non-free non-free-firmware
Signed-By: /usr/share/keyrings/debian-archive-keyring.gpg
# Debian stable updates
Types: deb
URIs: https://mirrors.tuna.tsinghua.edu.cn/debian
Suites: trixie-updates
Components: main contrib non-free non-free-firmware
Signed-By: /usr/share/keyrings/debian-archive-keyring.gpg
# Debian security updates
Types: deb
URIs: https://mirrors.tuna.tsinghua.edu.cn/debian-security
Suites: trixie-security
Components: main contrib non-free non-free-firmware
Signed-By: /usr/share/keyrings/debian-archive-keyring.gpg
```
运行`sudo apt update`更新配置
# 2、ncurses应用开发
ncurses 是一个在 Linux/Unix 环境下广泛使用的编程库,用于在终端中创建基于文本的用户界面(TUI)。运行以下指令安装开发ncurses应用需要的编译器和基本库
```
sudo apt install build-essential libncurses-dev
```
编译以下代码,获取系统信息,并调用ncurses的接口函数,居中显示获取的系统信息。
```c
#include <ncurses.h>
#include <sys/utsname.h>
#include <sys/sysinfo.h>
#include <ifaddrs.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <string.h>
#include <stdio.h>
/* 计算内存使用率并格式化 */
static void get_mem_info(char *buf, size_t len) {
struct sysinfo si;
if (sysinfo(&si) != 0) {
snprintf(buf, len, "N/A");
return;
}
unsigned long unit = si.mem_unit ? si.mem_unit : 1;
unsigned long total = si.totalram * unit;
unsigned long free= si.freeram* unit;
unsigned long used= total - free;
double pct = total ? (double)used / total * 100.0 : 0.0;
snprintf(buf, len, "%.1f%% (%lu MB / %lu MB)",
pct,
used/ (1024 * 1024),
total / (1024 * 1024));
}
/* 获取第一个非回环 IPv4 地址 */
static void get_ip_info(char *buf, size_t len) {
struct ifaddrs *ifa, *p;
buf = '\0';
if (getifaddrs(&ifa) != 0) {
snprintf(buf, len, "N/A");
return;
}
for (p = ifa; p != NULL; p = p->ifa_next) {
if (p->ifa_addr == NULL) continue;
if (p->ifa_addr->sa_family != AF_INET) continue;
if (strcmp(p->ifa_name, "lo") == 0) continue;
struct sockaddr_in *sin = (struct sockaddr_in *)p->ifa_addr;
char ip;
inet_ntop(AF_INET, &sin->sin_addr, ip, sizeof(ip));
snprintf(buf, len, "%s (%s)", ip, p->ifa_name);
break;
}
freeifaddrs(ifa);
if (buf == '\0')
snprintf(buf, len, "no IPv4 found");
}
int main(void) {
struct utsname u;
char mem, ip;
int row, col, y;
initscr();
cbreak();
noecho();
curs_set(0);
keypad(stdscr, TRUE);
if (has_colors()) {
start_color();
init_pair(1, COLOR_CYAN, COLOR_BLACK);
}
/* 获取数据 */
if (uname(&u) != 0) {
endwin();
fprintf(stderr, "uname failed\n");
return 1;
}
get_mem_info(mem, sizeof(mem));
get_ip_info(ip, sizeof(ip));
getmaxyx(stdscr, row, col);
y = row / 2 - 4;
/* 标题 */
attron(COLOR_PAIR(1) | A_BOLD);
mvprintw(y - 2, (col - 18) / 2, "System Information");
attroff(COLOR_PAIR(1) | A_BOLD);
/* 逐项显示 */
mvprintw(y++, 4, "Kernel name : %s", u.sysname);
mvprintw(y++, 4, "Hostname : %s", u.nodename);
mvprintw(y++, 4, "Kernel ver: %s", u.release);
mvprintw(y++, 4, "Architecture: %s", u.machine);
mvprintw(y++, 4, "Memory usage: %s", mem);
mvprintw(y++, 4, "IP address: %s", ip);
mvprintw(row - 2, 4, "Press any key to exit...");
refresh();
getch();
endwin();
return 0;
}
```
编译上述源代码,并链接ncurses库
```
gcc demo.c -o demo -lncurses
```
运行得到的可执行文件`.\demo`,可以得到以下输出
!(//m.qjumbo.com/forum/data/attachment/forum/202610/25/221500t0zb0fun5t05o5b0.png)
作为一块单板计算机,Arduino UNO Q用于开发Linux应用程序,是一个不错的平台。
页:
[1]