1. 项目概述:为什么选择 reTerminal E1004 作为你的第一个边缘计算设备?
如果你正在寻找一款能让你快速上手、功能全面且开箱即用的边缘计算和物联网开发板,那么 reTerminal E1004 绝对是一个绕不开的选择。它不像那些只有核心板和密密麻麻排针的“准系统”,需要你额外准备屏幕、外壳和一堆外设才能工作。reTerminal E1004 是一个高度集成化的完整终端设备,拿到手插上电就能跑起来,这对于初学者、教育场景和需要快速原型验证的开发者来说,吸引力是巨大的。
简单来说,reTerminal E1004 是一款基于树莓派计算模块 4(CM4)的工业级边缘智能终端。它的核心魅力在于“All-in-One”的设计理念:一块 5 英寸的 IPS 电容触摸屏、一个坚固的金属外壳、丰富的工业接口(如 RS-232/485、CAN、数字 IO),以及内置的 IMU(惯性测量单元)、RTC(实时时钟)和可编程 LED。这意味着,你无需在硬件组装和基础驱动调试上花费大量时间,可以直接聚焦于上层应用逻辑的开发,无论是想做一个车间数据看板、一个智能农业监控终端,还是一个带交互的机器人控制面板,reTerminal 都能提供一个坚实的硬件起点。
我最初接触它,就是为了快速搭建一个产线工位的作业指导与数据采集终端。当时评估了几种方案,要么是屏幕和主机分离布线麻烦,要么是工业触摸屏价格高昂且二次开发困难。reTerminal 完美地平衡了性能、易用性和成本。它的 CM4 核心提供了足够的算力(可选 1GB 到 8GB RAM),能流畅运行带图形界面的应用;丰富的接口可以直接连接扫码枪、PLC 或传感器;而预装的 Raspberry Pi OS 则让软件生态变得异常友好,Python、Node-RED、Docker 等工具链可以无缝迁移。接下来,我将从开箱验机到第一个实际应用的开发,为你拆解这份完整的入门指南。
2. 开箱与初体验:从拆包到点亮屏幕
当你拿到 reTerminal E1004 的包装盒,第一印象会是它的工业感。打开后,你会看到主机本体、一根 USB-C 电源线(用于供电和调试)、一套用于壁挂或 DIN 导轨安装的支架,以及快速入门指南。主机拿在手里颇有分量,全金属外壳提供了良好的散热和电磁屏蔽,正面是一块覆盖了钢化玻璃的 5 英寸屏幕,分辨率为 720x1280(竖屏显示),显示效果清晰细腻。
2.1 硬件接口快速导览
在通电前,花几分钟熟悉一下机身的接口布局至关重要,这能帮你规划好后续的外设连接。接口主要分布在设备的底部和顶部:
底部:
- USB-C 电源/调试口:这是最重要的接口。它既用于供电(要求 5V/3A),也用于通过 USB 线连接电脑进行串口调试或 ADB 连接。这是你第一次与设备“对话”的主要通道。
- 千兆以太网口:提供稳定的有线网络连接,对于工业环境或需要低延迟数据传输的场景是首选。
- Micro HDMI 接口:可以外接一个更大的显示器,将 reTerminal 作为主机使用。注意,它输出的是与内置屏幕相同的画面,而非扩展显示。
- USB 2.0 Type-A 口:可以连接键盘、鼠标、U 盘或 USB 适配器(如 4G 模块)。
顶部(保护盖下):
- 这里是工业接口的聚集地,通过一个可拆卸的端子排引出:
- RS-232 和 RS-485:用于连接传统的工业设备,如数控机床、仪表、老款 PLC 等。这是 reTerminal 工业属性的核心体现。
- CAN 总线接口:在汽车电子和工业自动化中广泛应用,可用于连接汽车 ECU 或工业现场总线设备。
- 数字输入/输出(DIO):4 路隔离数字输入(用于检测开关量信号)和 4 路隔离数字输出(用于控制继电器等)。它们都支持可配置的电压范围,适应性很强。
- 电源输出端子:可以提供 5V 或 12V 的电源,用于给外部传感器或小功率设备供电,非常贴心。
注意:首次使用前,请务必检查顶部端子排的保护盖是否盖紧,防止灰尘或金属碎屑进入导致短路。连接工业信号线时,务必确认设备的共地情况和信号电压,避免损坏接口。
2.2 首次上电与系统初始化
用附带的 USB-C 线连接电脑或一个 5V/3A 的电源适配器,给 reTerminal 通电。你会看到屏幕亮起,并开始首次启动流程。设备预装了 Raspberry Pi OS(一个树莓派官方的 Linux 发行版),因此启动过程与树莓派类似。
首次启动会进入一个图形化的设置向导(raspi-config),你需要完成一些基本配置:
- 选择语言和区域:建议设置为中文(简体)和对应的时区(Asia/Shanghai),这样系统日志和时间显示会更准确。
- 修改默认密码:系统默认用户是
pi,密码是raspberry。强烈建议你在首次使用时修改一个强密码,这是安全的第一步。 - 连接 Wi-Fi:如果你不打算用网线,在这里配置 Wi-Fi 网络。找到你的网络并输入密码。
- 更新软件:向导会询问是否更新系统软件包。我建议选择“是”,但这会花费一些时间。你也可以稍后在终端里用
sudo apt update && sudo apt upgrade -y来完成。
完成设置后,系统会重启,然后你就进入了熟悉的 Raspberry Pi OS 桌面环境。触摸屏的操作非常跟手,你可以像操作平板电脑一样点击图标、滑动页面。
3. 开发环境搭建与基础配置
现在设备已经可以正常使用了,但我们还需要为开发做一些优化配置。通过 SSH 远程登录是更高效的开发方式。
3.1 启用 SSH 与获取 IP 地址
- 在 reTerminal 上:打开终端(桌面左上角的黑色图标),输入
hostname -I命令,它会显示设备获取到的 IP 地址(比如 192.168.1.100)。 - 在你的电脑上:打开一个 SSH 客户端(如 Windows 的 PowerShell 或 CMD,macOS/Linux 的终端),输入:
例如:ssh pi@<你的reTerminal IP地址>ssh pi@192.168.1.100。首次连接会询问是否信任主机,输入yes,然后输入你设置的密码。
成功登录后,你就获得了 reTerminal 的命令行控制权,所有后续的安装和配置都可以在这里完成。
3.2 关键软件包安装与配置
为了充分发挥 reTerminal 的硬件特性,我们需要安装一些额外的库和工具。
安装 reTerminal 专用 Python 库:这是控制 reTerminal 特有硬件(如 LED、按钮、IMU)的关键。
sudo apt update sudo apt install python3-pip pip3 install reterminal安装后,你可以尝试运行一个简单的测试脚本,点亮设备侧面的可编程 LED:
# test_led.py from reterminal import led import time led.set(0, (255, 0, 0)) # 设置第一个LED为红色 time.sleep(2) led.set(0, (0, 0, 0)) # 关闭LED用
python3 test_led.py运行,你会看到设备侧面的 LED 亮起红光。配置串口权限:为了在普通用户权限下访问 RS-232/485 接口,需要将用户加入
dialout组。sudo usermod -a -G dialout pi执行后需要注销并重新登录(或重启)才能生效。
安装常用的开发工具:根据你的需求选择。
# 版本控制 sudo apt install git # Python 虚拟环境管理 sudo apt install python3-venv python3-virtualenv # 轻量级编辑器 sudo apt install vim
3.3 系统优化与固件更新
为了保证长期稳定运行,建议进行一些系统优化:
- 扩展文件系统:如果预装系统没有占满整个存储卡空间,需要手动扩展。在终端输入
sudo raspi-config,选择Advanced Options->Expand Filesystem,然后重启。 - 禁用不必要的服务:对于无头(无桌面)运行的应用,可以关闭图形界面以节省资源。
如果需要恢复图形界面,将sudo systemctl set-default multi-user.target # 设置默认启动到命令行 sudo rebootmulti-user.target换回graphical.target。 - 检查并更新 CM4 固件:偶尔更新可以解决一些兼容性问题。
sudo rpi-eeprom-update -a sudo reboot
4. 核心功能实战:从 GPIO 到工业接口
理论学习之后,我们来点实际的。通过几个小项目,深入理解 reTerminal 各项功能的用法。
4.1 使用 Python 控制 LED 与读取按键
reTerminal 侧面有一个可编程 RGB LED 和一个用户按键(User Button)。我们可以写一个简单的状态指示灯程序。
# led_button_demo.py from reterminal import led, button import time def button_callback(): """按键回调函数:按下时切换LED颜色""" current_color = led.get(0) if current_color == (0, 255, 0): # 如果是绿色 led.set(0, (255, 255, 0)) # 改为黄色 else: led.set(0, (0, 255, 0)) # 改为绿色 print(f"Button pressed! LED color changed to {led.get(0)}") # 初始化LED为红色 led.set(0, (255, 0, 0)) print("System started. LED is RED. Press the side button to change color.") # 注册按键回调函数 button.on_press(button_callback) try: # 主循环,保持程序运行 while True: time.sleep(1) except KeyboardInterrupt: print("\nProgram exited.") led.set(0, (0, 0, 0)) # 退出时关闭LED这个程序演示了事件驱动编程。LED 初始为红色,每次按下侧面按键,都会触发button_callback函数,在绿色和黄色之间切换 LED 颜色。你可以把这个程序设置为开机自启动,作为一个简单的系统状态指示器。
4.2 读取 IMU(惯性测量单元)数据
内置的 IMU(通常是加速度计和陀螺仪)让 reTerminal 能感知自身的运动和姿态。这在倾斜控制、震动监测等场景很有用。
# imu_demo.py from reterminal import imu import time # 初始化IMU imu_device = imu.IMU() print("Reading IMU data. Press Ctrl+C to stop.") try: while True: # 读取加速度(单位:g)和角速度(单位:dps) accel = imu_device.acceleration gyro = imu_device.gyro # 读取温度(单位:摄氏度) temp = imu_device.temperature print(f"Accel: X={accel[0]:.2f}g, Y={accel[1]:.2f}g, Z={accel[2]:.2f}g | " f"Gyro: X={gyro[0]:.2f}dps, Y={gyro[1]:.2f}dps, Z={gyro[2]:.2f}dps | " f"Temp: {temp:.1f}C") time.sleep(0.5) # 每0.5秒读取一次 except KeyboardInterrupt: print("\nIMU reading stopped.")运行这个脚本,拿起 reTerminal 移动或旋转,观察终端打印的数据变化。你可以基于这些数据计算设备的倾斜角度,或者设置一个阈值来检测异常震动。
4.3 通过 RS-485 与 Modbus 设备通信
这是 reTerminal 的“杀手级”应用之一。工业现场大量使用 Modbus RTU 协议(基于 RS-485)的设备。我们将使用 Python 的pymodbus库来读取一个 Modbus 电表的数据。
首先安装库:
pip3 install pymodbus假设我们连接了一个支持 Modbus RTU 的电表,从站地址为 1,我们要读取其电压寄存器(地址 0x0000)。
# modbus_rtu_demo.py from pymodbus.client import ModbusSerialClient as ModbusClient import time # 配置串口参数 - 这些参数必须与从站设备严格匹配! SERIAL_PORT = '/dev/ttyAMA0' # reTerminal 的 RS-485 对应此设备文件 BAUD_RATE = 9600 PARITY = 'N' STOP_BITS = 1 BYTE_SIZE = 8 SLAVE_ID = 1 # 创建Modbus RTU客户端 client = ModbusClient(method='rtu', port=SERIAL_PORT, baudrate=BAUD_RATE, parity=PARITY, stopbits=STOP_BITS, bytesize=BYTE_SIZE, timeout=2) # 连接 connection = client.connect() if connection: print("Successfully connected to Modbus RTU device.") else: print("Connection failed.") exit(1) try: while True: # 读取保持寄存器:地址0,数量1,从站ID为1 # 注意:寄存器地址在pymodbus中是从0开始计算的。 response = client.read_holding_registers(address=0, count=1, slave=SLAVE_ID) if not response.isError(): # 假设读取到的值需要除以10才是实际电压(V) voltage = response.registers[0] / 10.0 print(f"Measured Voltage: {voltage:.1f} V") else: print(f"Modbus read error: {response}") time.sleep(2) # 每2秒读取一次 except KeyboardInterrupt: print("\nStopping Modbus reader.") finally: client.close() # 务必关闭连接实操心得:工业通信调试,参数匹配是第一要务。务必从设备手册中确认波特率、数据位、停止位、校验位。接线时,RS-485 是差分信号,需要接 A+ 和 B- 两根线,并且总线两端需要接 120 欧姆的终端电阻。如果通信不上,先用
sudo apt install minicom安装串口工具,用minicom -D /dev/ttyAMA0 -b 9600命令手动测试串口收发是否正常,排除硬件和基础配置问题。
5. 构建一个完整的应用:车间生产计数器
让我们综合运用以上知识,构建一个简单的车间生产计数看板。这个应用将:1) 通过数字输入(DIO)连接一个光电传感器来计数产品;2) 在 reTerminal 屏幕上显示实时计数和状态;3) 通过侧面 LED 和按键提供状态指示和重置功能。
5.1 硬件连接与电路设计
- 光电传感器:选择 NPN 常开型。将其输出线连接到 reTerminal 顶部端子的DIO 0(数字输入 0),将传感器的 GND 和 VCC 分别连接到端子的GND和+12V OUT(为传感器供电)。
- 原理:当产品经过,传感器输出低电平(0V),reTerminal 检测到输入信号从高电平变为低电平,即计一次数。
5.2 软件实现:使用 PyQt5 创建图形界面
我们需要一个简单的 GUI 来显示计数。安装 PyQt5:
sudo apt install python3-pyqt5主程序代码如下:
# production_counter.py import sys import time from PyQt5.QtWidgets import QApplication, QWidget, QLabel, QVBoxLayout, QPushButton from PyQt5.QtCore import QTimer, Qt from threading import Thread, Event import RPi.GPIO as GPIO from reterminal import led, button # 硬件配置 DIO_INPUT_PIN = 17 # 对应 reTerminal 的 DIO 0,BCM 编号为 17 LED_INDEX = 0 class ProductionCounter(QWidget): def __init__(self): super().__init__() self.count = 0 self.init_ui() self.init_gpio() self.init_hardware_events() self.stop_event = Event() def init_ui(self): """初始化用户界面""" self.setWindowTitle('车间生产计数器') self.setGeometry(100, 100, 400, 300) # 窗口大小 layout = QVBoxLayout() self.title_label = QLabel('实时生产计数系统', self) self.title_label.setAlignment(Qt.AlignCenter) self.title_label.setStyleSheet("font-size: 24px; font-weight: bold; margin: 20px;") layout.addWidget(self.title_label) self.count_label = QLabel(f'计数: {self.count}', self) self.count_label.setAlignment(Qt.AlignCenter) self.count_label.setStyleSheet("font-size: 72px; color: blue; margin: 40px;") layout.addWidget(self.count_label) self.status_label = QLabel('状态: 运行中', self) self.status_label.setAlignment(Qt.AlignCenter) self.status_label.setStyleSheet("font-size: 18px; margin: 20px;") layout.addWidget(self.status_label) reset_btn = QPushButton('重置计数 (R)', self) reset_btn.clicked.connect(self.reset_count) reset_btn.setStyleSheet("font-size: 18px; padding: 10px;") layout.addWidget(reset_btn) exit_btn = QPushButton('退出程序 (X)', self) exit_btn.clicked.connect(self.close_application) exit_btn.setStyleSheet("font-size: 18px; padding: 10px; background-color: #ffcccc;") layout.addWidget(exit_btn) self.setLayout(layout) # 设置定时器更新状态(可选) self.timer = QTimer() self.timer.timeout.connect(self.update_status) self.timer.start(1000) # 每秒更新一次 def init_gpio(self): """初始化树莓派GPIO用于读取数字输入""" GPIO.setmode(GPIO.BCM) GPIO.setup(DIO_INPUT_PIN, GPIO.IN, pull_up_down=GPIO.PUD_UP) # 启用内部上拉电阻 # 添加上升沿检测回调(传感器从低到高变化时触发) GPIO.add_event_detect(DIO_INPUT_PIN, GPIO.RISING, callback=self.gpio_callback, bouncetime=50) def gpio_callback(self, channel): """GPIO中断回调函数:计数加一""" self.count += 1 # 由于回调在子线程中,需要用信号槽或直接调用主线程更新UI,这里简化处理 # 实际复杂应用应使用QThread和信号 self.count_label.setText(f'计数: {self.count}') print(f"Product counted! Total: {self.count}") # 短暂点亮LED为绿色作为反馈 led.set(LED_INDEX, (0, 255, 0)) time.sleep(0.1) led.set(LED_INDEX, (0, 0, 255)) # 恢复为蓝色(运行状态) def init_hardware_events(self): """初始化reTerminal硬件事件""" # 设置侧面按键回调:长按2秒重置计数 def long_press_reset(): print("Long press detected, resetting counter.") self.reset_count() button.on_long_press(long_press_reset, hold_time=2.0) # 初始化LED为蓝色(运行状态) led.set(LED_INDEX, (0, 0, 255)) def reset_count(self): """重置计数器""" self.count = 0 self.count_label.setText(f'计数: {self.count}') self.status_label.setText('状态: 计数已重置') led.set(LED_INDEX, (255, 255, 0)) # 黄色提示 time.sleep(0.5) led.set(LED_INDEX, (0, 0, 255)) # 恢复蓝色 def update_status(self): """定时更新状态(示例:显示系统时间)""" current_time = time.strftime("%H:%M:%S") self.status_label.setText(f'状态: 运行中 | 时间: {current_time}') def close_application(self): """安全退出程序""" print("Exiting application...") self.stop_event.set() GPIO.cleanup() # 清理GPIO资源 led.set(LED_INDEX, (0, 0, 0)) # 关闭LED self.close() if __name__ == '__main__': app = QApplication(sys.argv) counter = ProductionCounter() counter.showFullScreen() # 全屏显示,适合终端使用 sys.exit(app.exec_())5.3 部署与自启动
我们希望这个应用在 reTerminal 开机后自动运行。
创建桌面启动文件(如果使用图形界面): 在
/home/pi/.config/autostart/目录下创建一个文件production_counter.desktop(如果目录不存在就创建):[Desktop Entry] Type=Application Name=Production Counter Exec=python3 /home/pi/production_counter.py Hidden=false NoDisplay=false X-GNOME-Autostart-enabled=true创建系统服务(如果使用无头模式,更稳定): 创建服务文件
/etc/systemd/system/production-counter.service:[Unit] Description=Production Counter Service After=graphical.target [Service] User=pi WorkingDirectory=/home/pi ExecStart=/usr/bin/python3 /home/pi/production_counter.py Restart=on-failure RestartSec=5s [Install] WantedBy=multi-user.target然后启用并启动服务:
sudo systemctl daemon-reload sudo systemctl enable production-counter.service sudo systemctl start production-counter.service
现在,每次 reTerminal 启动,你的生产计数器应用就会自动运行,成为一个独立的工作终端。
6. 高级主题与性能调优
当你的应用变得越来越复杂,或者需要 7x24 小时稳定运行时,下面这些高级技巧和调优建议会非常有用。
6.1 使用 Docker 容器化部署
Docker 能保证应用环境的一致性,简化依赖管理,非常适合在 reTerminal 上部署复杂应用。
在 reTerminal 上安装 Docker:
curl -fsSL https://get.docker.com -o get-docker.sh sudo sh get-docker.sh sudo usermod -aG docker pi # 将pi用户加入docker组 # 注销并重新登录使组生效编写 Dockerfile: 为上面的生产计数器应用创建一个
Dockerfile:# 使用树莓派/ARM兼容的Python镜像 FROM python:3.9-slim-bullseye # 安装系统依赖(PyQt5需要) RUN apt-get update && apt-get install -y \ libgl1-mesa-glx \ libglib2.0-0 \ libsm6 \ libxrender1 \ libxext6 \ && rm -rf /var/lib/apt/lists/* # 安装Python依赖 COPY requirements.txt . RUN pip3 install --no-cache-dir -r requirements.txt # 复制应用代码 COPY production_counter.py . # 设置启动命令 CMD ["python3", "production_counter.py"]对应的
requirements.txt文件:pymodbus==3.3.4 RPi.GPIO==0.7.1 # reterminal库可能需要从源码安装或找兼容的wheel构建并运行容器:
docker build -t production-counter . docker run -d --restart unless-stopped \ --device /dev/ttyAMA0 \ --device /dev/gpiomem \ -v /run/dbus:/run/dbus:ro \ --name counter-app \ production-counter--device参数将宿主机的串口和 GPIO 设备映射到容器内,这是硬件访问的关键。
6.2 电源管理与可靠性设计
工业现场可能面临电源波动或意外断电。
- 使用 UPS 模块:考虑为 reTerminal 配备一个专用的 UPS(不间断电源)模块,它可以在主电源断开后提供几分钟的电力,让系统有时间执行安全关机(
sudo shutdown -h now),避免文件系统损坏。 - 配置只读根文件系统:对于部署后应用和配置不再改变的场景,可以将根文件系统挂载为只读,极大提高对意外断电的抵抗力。
启用后,系统启动后根文件系统变为只读,所有临时修改保存在内存中,重启后恢复原样。sudo raspi-config # 选择 Performance Options -> Overlay File System -> Yes - 监控系统健康:编写一个简单的监控脚本,定期检查 CPU 温度、内存使用率和磁盘空间,并通过 LED 颜色或网络报警提示。
# 检查CPU温度 vcgencmd measure_temp # 检查内存使用 free -h # 检查磁盘使用 df -h /
6.3 屏幕显示优化与无头模式
- 禁用屏幕保护与睡眠:为了让屏幕常亮,需要修改电源管理设置。
同时,在桌面环境的电源设置中,将屏幕关闭和睡眠时间设为“从不”。# 编辑LightDM配置(如果使用图形登录管理器) sudo nano /etc/lightdm/lightdm.conf # 在[Seat:*]部分添加 xserver-command=X -s 0 -dpms - 无头模式运行:如果应用只需要通过网络访问,可以完全关闭图形界面和屏幕背光以省电。
sudo systemctl set-default multi-user.target sudo apt install xserver-xorg-video-fbdev # 确保有基础驱动 # 关闭屏幕背光(可能需要具体命令,取决于驱动) echo 0 | sudo tee /sys/class/backlight/*/brightness
7. 常见问题排查与调试技巧
即使准备得再充分,实际开发中总会遇到问题。这里记录了一些我踩过的坑和解决方法。
7.1 硬件与连接问题
| 问题现象 | 可能原因 | 排查步骤与解决方案 |
|---|---|---|
| 设备无法开机,屏幕不亮 | 1. 电源问题。 2. CM4 模块接触不良。 | 1. 确认使用 5V/3A 电源,并尝试更换电源线和适配器。 2. 尝试重新插拔 CM4 核心板(需拆机,谨慎操作)。 3. 连接 USB 到电脑,查看是否有串口日志输出(需安装串口驱动)。 |
| 触摸屏失灵或不准 | 1. 屏幕校准问题。 2. 驱动或固件问题。 | 1. 重新校准触摸屏:在终端执行sudo apt install xinput-calibrator,然后运行xinput_calibrator按提示操作。2. 更新系统: sudo apt update && sudo apt full-upgrade。3. 检查是否有保护膜影响触摸。 |
| RS-485 通信失败 | 1. 接线错误(A+/B-反接)。 2. 波特率等参数不匹配。 3. 缺少终端电阻。 | 1. 用万用表确认 A+ 和 B- 线序,或交换测试。 2.使用 minicom或screen工具手动测试:sudo minicom -D /dev/ttyAMA0 -b 9600,发送数据看从站是否有反应。3. 在总线最远端的设备上接入 120Ω 终端电阻。 |
| 数字输入无反应 | 1. 输入信号电压不匹配。 2. 内部上拉/下拉未正确配置。 3. 接线松动。 | 1. 确认传感器输出电平在 DIO 输入电压范围内(0-24V)。 2. 在代码中明确配置上拉电阻 GPIO.PUD_UP或下拉电阻GPIO.PUD_DOWN。3. 用万用表测量输入端子在触发时的电压变化。 |
7.2 软件与系统问题
Python 导入
reterminal库失败:- 错误:
ModuleNotFoundError: No module named 'reterminal' - 解决:确保使用
pip3为 Python3 安装。如果安装在虚拟环境中,请确认已激活该环境。有时需要重启 Python 进程或整个系统。
- 错误:
GPIO 操作报权限错误:
- 错误:
RuntimeError: No access to /dev/mem. Try running as root! - 解决:运行
sudo前缀执行脚本,或者将用户加入gpio组:sudo usermod -a -G gpio pi,然后注销重登。
- 错误:
PyQt5 应用在无显示器环境下运行报错:
- 错误:
QXcbConnection: Could not connect to display - 解决:需要在无头模式下配置虚拟显示。安装
xvfb:sudo apt install xvfb,然后使用xvfb-run来启动你的 PyQt5 应用:xvfb-run --auto-servernum --server-args="-screen 0 720x1280x24" python3 your_app.py。
- 错误:
系统运行一段时间后变卡:
- 排查:使用
htop命令查看 CPU 和内存占用。检查是否有内存泄漏的进程。 - 解决:1) 增加虚拟内存(交换空间):
sudo dphys-swapfile swapoff && sudo nano /etc/dphys-swapfile修改CONF_SWAPSIZE=1024,然后sudo dphys-swapfile setup && sudo dphys-swapfile swapon。2) 优化应用代码,避免循环内频繁创建大对象。3) 考虑使用更轻量的窗口管理器(如openbox)替代完整的 Raspberry Pi OS 桌面。
- 排查:使用
7.3 网络与远程访问问题
- SSH 连接突然断开:可能是 Wi-Fi 节能模式导致。编辑
/etc/rc.local文件,在exit 0之前添加禁用 Wi-Fi 节能的命令:iwconfig wlan0 power off。 - 需要远程访问图形界面:安装 VNC 服务器
sudo apt install realvnc-vnc-server,然后在raspi-config的Interfacing Options中启用 VNC。使用 VNC Viewer 客户端进行连接。
开发 reTerminal E1004 应用,最深刻的体会是“硬件是基础,软件是灵魂”。它的价值在于将复杂的工业硬件集成变得简单,让你能专注于解决业务逻辑。从简单的 GPIO 控制到复杂的 Modbus 网络通信,每一步的调试成功都带来巨大的成就感。建议新手不要一开始就追求大而全的系统,从一个能跑通的小功能点开始,比如先让 LED 亮起来,再读取一个传感器,最后把它们组合起来。遇到问题时,善用系统的日志(dmesg,journalctl -f)和硬件测试工具(minicom,i2cdetect),大部分问题都能找到线索。这个平台的可玩性和实用性远超一块普通的开发板,它更像一个随时可以投入实战的工业级解决方案雏形。