[作品] 【树莓派Pico测评】- USB CDC串口通信(BSP编译,非MicroPython)

fxyc87   2021-2-5 16:52 楼主

我的前几个贴子中有介绍如何编译BSP,也有普通TTL串口输出的例子

初始化基本串口

stdio_init_all();

输出数据

puts("Hello, world!");

上边这种方式需要外接USB转串口模块才能接收数据,

即然RP2040本身带有USB功能,当然要玩内置USB通信,不需要其它串口转接模块

 

在一切准备就绪后(GIT,PYTHON,GCC,VS2019,CMAKE),还要单独下载 【tinyusb】

这个tinyusb默认是不含在官方SDK中的,需要到另一位置下载,然后解压到【pico-sdk\lib\tinyusb】

下载地址是:https://github.com/hathach/tinyusb 

这个模块下载并放到指令位置后才能使用RP2040的USB功能

并且官方SDK是有几个BUG的,需要修改:

问题1:

D:\ZL\RP2040\pico-sdk\src\rp2_common\pico_stdio_usb\stdio_usb.c 文件

第91行,修改为 bool stdio_usb_init(void) {,去除左边的static标记

问题2:

D:\ZL\RP2040\pico-sdk\src\rp2_common\pico_stdio_usb\include\pico\stdio_usb.h

增加两个函数的申明:

void stdio_usb_out_chars(const char *buf, int length);

int stdio_usb_in_chars(char *buf, int length);

这个stdio_usb.h中只有bool stdio_usb_init()申明,但没有stdio_usb_out_chars和stdio_usb_in_chars

问题3:

D:\ZL\RP2040\pico-sdk\src\host\pico_stdio\include\pico\stdio.h第14行,注释掉

//static inline void stdio_usb_init() {}

以上3个问题点在最新的SDK(2021/02/05)中仍然存在,

 

修改以上几个问题点后,再写主程序:

#include <stdio.h>
#include "pico/stdlib.h"
#include "pico/stdio_usb.h"
#define LED 25
int main()
{
    //stdio_init_all();

    stdio_usb_init();

    gpio_init(LED);
    gpio_set_dir(LED,GPIO_OUT);

    gpio_put(LED,1);

    sleep_ms(5000);
    for(int i=0;i<10;i++){
        sleep_ms(100);
        gpio_put(LED,0);
        sleep_ms(100);
        gpio_put(LED,1);
    }
    while(1){
        stdio_usb_out_chars("hello\n",6);
        sleep_ms(500);
        gpio_put(LED,0);
        sleep_ms(500);
        gpio_put(LED,1);    
    }

    return 0;
}

代码比较简单,就没加注释了

然后编译,下载

 

运行,然后设备管理器此时已经有个串口了,打开串口软件,查看效果

纳尼?没接收到数据?

是的,我本人重试波特率,停止位,奇偶校验无数次还是收不到,准备再次查看源码时,试了下DTR,勾上了终于出来数据了

企业微信截图_20210205164809.png

 

 

 

回复评论 (5)

我把我修改好的SDK及程序示例发布出来

可以直接编译测试

pico-sdk.7z (3.04 MB)
(下载次数: 28, 2021-2-5 17:05 上传)

uart_test.7z (889.01 KB)
(下载次数: 20, 2021-2-5 17:06 上传)

点赞  2021-2-5 17:06

还需要DTR/CTS这些控制信号吗?

点赞  2021-2-6 08:34
引用: dcexpert 发表于 2021-2-6 08:34 还需要DTR/CTS这些控制信号吗?

是的,否则就接收不到数据

点赞  2021-2-7 08:37

我直接使用官方SDK,编译是没问题的,使用putty读写串口也没问题,但tiny-usb cdc缺省的波特率是115200,不是9600,我找不到改变这个缺省波特率的方法,不知道答主是如何在9600波特率下工作的。

点赞  2021-2-16 22:15
引用: flyox 发表于 2021-2-16 22:15 我直接使用官方SDK,编译是没问题的,使用putty读写串口也没问题,但tiny-usb cdc缺省的波特率是115200,不 ...

我是在windows下玩的,linux下没试过

点赞  2021-2-20 17:13
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复