You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用Raspberry Pi Pico通过USB执行电脑端系统命令

问题原因说明

你之前的代码逻辑存在本质偏差:

  • system() 函数是运行在Pico的RP2040处理器上的,Pico本身没有搭载桌面操作系统,该函数在Pico SDK中没有对应执行环境,自然不会生效
  • 你代码里的printf是输出到USB串口,电脑默认只会把串口收到的内容当做普通数据展示,不会自动识别为系统命令执行
C语言实现方案(模拟HID键盘)

实现原理是将Pico配置为USB HID键盘设备,通过向电脑发送按键输入指令,自动调出终端/命令提示符、输入对应命令并按下回车,触发电脑执行命令,这也是同类项目的核心逻辑。

前置依赖

Pico SDK默认已经集成TinyUSB库,无需额外安装,直接调用即可。

示例代码

#include <stdio.h>
#include "pico/stdlib.h"
#include "bsp/board.h"
#include "tusb.h"
#include "class/hid/hid.h"

// HID键盘按键报告结构体
typedef struct {
  uint8_t modifiers;
  uint8_t reserved;
  uint8_t keycode[6];
} hid_keyboard_report_t;

// 发送按键报告的函数
void send_key(uint8_t mod, uint8_t key) {
  hid_keyboard_report_t report = {0};
  report.modifiers = mod;
  report.keycode[0] = key;
  tud_hid_report(0, &report, sizeof(report));
  sleep_ms(10);
  // 发送空报告释放按键
  report.modifiers = 0;
  report.keycode[0] = 0;
  tud_hid_report(0, &report, sizeof(report));
  sleep_ms(50);
}

// 输入字符串的函数(仅支持基础字符,可自行扩展映射)
void type_string(const char *str) {
  while (*str) {
    char c = *str++;
    if (c >= 'a' && c <= 'z') {
      send_key(0, HID_KEY_A + (c - 'a'));
    } else if (c >= 'A' && c <= 'Z') {
      send_key(KEYBOARD_MODIFIER_LEFTSHIFT, HID_KEY_A + (c - 'A'));
    } else if (c == ' ') {
      send_key(0, HID_KEY_SPACE);
    } else if (c == '\n') {
      send_key(0, HID_KEY_ENTER);
    }
    // 可自行添加数字、符号、功能键的映射逻辑
  }
}

int main(void) {
  board_init();
  tusb_init();

  // 等待USB枚举完成
  while (!tud_mounted()) {
    tud_task();
    sleep_ms(10);
  }
  sleep_ms(1000);

  // Windows示例:按下Win+R打开运行窗口,执行cmd后运行dir命令
  send_key(KEYBOARD_MODIFIER_LEFTGUI, HID_KEY_R);
  sleep_ms(500);
  type_string("cmd\n");
  sleep_ms(1000);
  type_string("dir\n");

  // Linux/macOS示例:按下Ctrl+Alt+T打开终端,执行ls命令(注释Windows代码后启用)
  // send_key(KEYBOARD_MODIFIER_LEFTCTRL | KEYBOARD_MODIFIER_LEFTALT, HID_KEY_T);
  // sleep_ms(1000);
  // type_string("ls\n");

  while (1) {
    tud_task();
    sleep_ms(10);
  }

  return 0;
}

编译配置

需要在项目的CMakeLists.txt中添加TinyUSB依赖,示例配置如下:

cmake_minimum_required(VERSION 3.13)
include(pico_sdk_import.cmake)
project(pico_hid_keyboard C CXX ASM)
pico_sdk_init()

add_executable(pico_hid_keyboard
  main.c
  tusb_config.h
)

target_include_directories(pico_hid_keyboard PRIVATE ${CMAKE_CURRENT_LIST_DIR})
target_link_libraries(pico_hid_keyboard PRIVATE pico_stdlib tinyusb_device tinyusb_board)
pico_add_extra_outputs(pico_hid_keyboard)

注意事项

  • 不同操作系统的快捷键、终端启动逻辑存在差异,你需要根据目标系统调整按键触发逻辑
  • 可自行扩展按键映射表,支持更多特殊字符、组合键操作
  • 该方案仅模拟普通键盘输入,不会触发系统安全软件的异常拦截

内容的提问来源于stack exchange,提问作者Polarspetroll

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 09:30:05