树莓派 Pico 支持两种串口通信方式:UART 和 USB CDC (USB serial). 接下来通过一个 Hello World 的示例程序来演示如何使用串口来收发数据。
USB CDC 方式
树莓派 Pico 自带一个 Micro USB 接口,所以我们很方便的直接使用 USB CDC 功能。
Hello USB 代码
首先,我们创建一个 Hello World 工程。
mkdir hello_usb
cd hello_usb
创建 CMakeLists.txt 和 hello_usb.c 文件
touch hello_usb.c CMakeLists.txt
cp $PICO_SDK_PATH/external/pico_sdk_import.cmake .
在 CMakeLists.txt 中配置打开 USB CDC 功能:
# 设置Cmake 最小依赖版本
cmake_minimum_required(VERSION 3.17)
# 设置c/c++ 编译版本
set(CMAKE_C_STANDARD 11)
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
# 导入 pico sdk cmake
include(pico_sdk_import.cmake)
# ====================================================================================
# 设置开发板为 pico w (如果你的开发板是 pico 可以注释这行)
set(PICO_BOARD pico_w CACHE STRING "Board type")
# 设置项目名
project(hello_usb C CXX ASM)
# 初始化sdk
pico_sdk_init()
# 添加执行文件
add_executable(hello_usb
hello_usb.c
)
# 设置项目名称字符串
pico_set_program_name(hello_usb "hello_usb")
# 设置项目版本号
pico_set_program_version(hello_usb "0.1")
# Modify the below lines to enable/disable output over UART/USB
# 是否打开 UART 串口
pico_enable_stdio_uart(hello_usb 0)
# 是否打开USB 串口
pico_enable_stdio_usb(hello_usb 1)
# 添加依赖库 (pico w 必须加入 pico_cyw43_arch_none )
target_link_libraries(hello_usb
pico_stdlib # for core functionality
)
# 设置输出文件
pico_add_extra_outputs(hello_usb)
可以使用 CMake 指令更改 stdout 的目标输出,输出指向 UART 或 USB CDC,或同时指向两者。
pico_enable_stdio_usb(hello_world 1) ① pico_enable_stdio_uart(hello_world 0) ② 1.启用通过 USB CDC printf输出(USB串行) 2.禁用 通过 UART printf 输出编写 hello_usb.c 输出打印 “Hello, world” 的代码,如下:
#include <stdio.h>
#include "pico/stdlib.h"
int main() {
stdio_init_all();
while (true) {
printf("Hello, world!\n");
sleep_ms(1000);
}
}
代码很简单,在一个死循环里面每隔 1000 毫秒输出打印 “Hello, world” 。
编译生成 uf2 文件
mkdir build && cd build
cmake ..
make -j4
拖拽 hello_usb.uf2 文件到 RPi-RP2 文件夹,烧录程序。
安装 Mac 桌面端串口工具
Mac 用户可以安装免费图形化串口工具 CoolTerm 或者 minicom 命令行工具,这两个工具是我测试可以直接使用 USB 连接上树莓派串行端口的,有些工具可以找到串口,但是连接不上,比如: 国产工具 WCHSerialPort (具体原因未知)。
使用 CoolTerm
打开 CoolTerm 点击 Options 打开配置菜单
选择 usb 端口(我这边显示的是 usbmodem 1201,可能会不一致),波特率选择 115200,其他默认就好,点击 ok 保存。
点击 connect 连接,即可看到如下打印信息。
UART 方式
UART 即 通用异步收发传输,是串口的一种,可以用来通信,包括单片机和电脑,单片机和单片机,单片机和其它带串口的外设。 UART是全双工的,也就是说发送的发送的同时可以接收数据,UART需要三根线,一根TX(发送),一根RX(接收)和一根GND(共地)。购买硬件
接线
需要使用杜邦线将 USB转串口模块和树莓派 Pico 连接,连接方式为:
串口模块的 RXD 连接 Pico UART0_TX ,TXD 连接 Pico UART0_RX,即将串口的读取端口连接到树莓派 Pico 的发送端口,发送端口连接树莓派读取端口,实现数据的收发。(一开始我 RXD 连 UART0_RX ,TXD 连 UART0_TX 了 🥲)
串口的 GND 连接到 Pico 的 GND (Pin 3),实现共地连接。按照如上图所示将 USB TO TTL 模块连接到树莓派 Pico。
USB TO TTL | Raspberry Pi Pico |
---|---|
GND | GND (Pin 3) |
RXD | GP0 (UART0_TX, Pin 1) |
TXD | GP1 (UART0_RX, Pin 2) |
Hello Serial 代码
代码和 hello_usb.c 是一致的,只需要修改 CMakeLists.txt 配置文件打开 UART 串口输出即可。
# 设置Cmake 最小依赖版本
cmake_minimum_required(VERSION 3.17)
# 设置c/c++ 编译版本
set(CMAKE_C_STANDARD 11)
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
# 导入 pico sdk cmake
include(pico_sdk_import.cmake)
# ====================================================================================
# 设置开发板为 pico w (如果你的开发板是 pico 可以注释这行)
set(PICO_BOARD pico_w CACHE STRING "Board type")
# 设置项目名
project(hello_serial C CXX ASM)
# 初始化sdk
pico_sdk_init()
# 添加执行文件
add_executable(hello_serial
hello_serial.c
)
# 设置项目名称字符串
pico_set_program_name(hello_serial "hello_serial")
# 设置项目版本号
pico_set_program_version(hello_serial "0.1")
# Modify the below lines to enable/disable output over UART/USB
# 是否打开 UART 串口
pico_enable_stdio_uart(hello_serial 1)
# 是否打开USB 串口
pico_enable_stdio_usb(hello_serial 0)
# 添加依赖库 (pico w 必须加入 pico_cyw43_arch_none )
target_link_libraries(hello_serial
pico_stdlib # for core functionality
)
# 设置输出文件
pico_add_extra_outputs(hello_serial)
和上面一样的步骤编译烧录程序。
使用 CoolTerm
打开 CoolTerm 点击 Options 打开配置菜单,选择 UART 串口模块端口。