eefocus_3896990 发表于 2026-10-25 22:16:37

【欧时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]
查看完整版本: 【欧时RS x Arduino】3、Arduino UNO Q Debian应用开发

Baidu
map