如何使用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
相关产品推荐
相关产品推荐

