0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

rt-thread 驱动篇(五)serialX 小试牛刀

出出 来源:出出 作者:出出 2022-06-16 11:29 次阅读

前言

终于来到了 serialX 的实践篇,期待很久了。

笔者曾经在 [rt-thread 使用宝典(2022-0516更新)](https://club.rt-thread.org/ask/article/2460fcd7db4821ae.html) 这篇文章的“使用篇: Q1. 串口通讯数据被分多次接收了,怎么办?”里贴了一段代码,那段代码有很强的适用性,稍作修改就能用到多种串口协议处理场合。今天我们尝试在 finsh 上应用 serialX,看看它能给我们带来什么神奇效果。

打开控制台

我们的 serialX 支持中断收发、DMA 收发。所以我们可以随意组合使用 中断收、中断发、DMA 收、DMA 发,共四种组合(前提是对应芯片底层驱动支持 DMA)。

   if (rt_device_open(new_device, RT_DEVICE_OFLAG_RDWR                                | RT_DEVICE_FLAG_STREAM                                | RT_DEVICE_FLAG_INT_RX                                | RT_DEVICE_FLAG_INT_TX       ) == RT_EOK) {   }

或者

   if (rt_device_open(new_device, RT_DEVICE_OFLAG_RDWR                                | RT_DEVICE_FLAG_STREAM                                | RT_DEVICE_FLAG_DMA_RX                                | RT_DEVICE_FLAG_DMA_TX       ) == RT_EOK) {   }

因为 serialX 自带阻塞读特性,所以它不需要执行 `rt_device_set_rx_indicate(dev, finsh_rx_ind);` 这句代码,我们接收数据自有同步妙法,请往下看。

finsh 线程

对 finsh 线程入口函数稍作修改:

void finsh_thread_entry(void *parameter){   int i, cnt;   char istream[32];   ... 省略部分操作   while (1) {       cnt = finsh_instream(istream, 32);       for (i = 0; i < cnt; i++) {           finsh_handle_onebyte(istream[i]);       }   }}

1. finsh 线程提供一个应用层的数据缓存 `istream` ,这里只用的 32 个字节。
2. `finsh_instream` 函数代替 `finsh_getchar` ,它用来读串口终端设备数据流,函数实现见下文。它可能返回多个字节数据,返回值表示有效数据个数
3. 接下来对 `finsh_instream` 读到的每字节数据进行处理
4. `finsh_handle_onebyte` 是对原来 `finsh_thread_entry` 函数中的 `while` 循环进行的改造

读终端串口设备

如果 serialX 的阻塞模式打开的,同时串口接收缓存里是空的,执行 `rt_device_read` 会永久等待下去,当前线程进入睡眠态。

int finsh_instream(char *buf, int len){#ifdef RT_USING_DEVICE   int i;   RT_ASSERT(shell != RT_NULL);   i = rt_device_read(shell->device, -1, buf, len);   return i;#else   extern char rt_hw_console_getchar(void);   return rt_hw_console_getchar();#endif /* RT_USING_DEVICE */}

读串口设备的数据放到 buf 指向的内存中,最多 len 个字节,最终返回实际读到的数据量。

注:`rt_device_read` 的返回值可能是 0,也可能会是 -1。

处理命令行字符

这部分笔者把他们放到了一个单独的函数,不这么做也没影响。
笔者做了一点儿小改进。

static void finsh_handle_onebyte(int ch){   static int last_ch = 0x20;   ...   /* handle end of line, break */   if (last_ch == '\r' && ch == '\n') {       last_ch = ch;       return;   }   if (ch == '\r' || ch == '\n')   {#ifdef FINSH_USING_HISTORY       shell_push_history(shell);#endif       if (shell->echo_mode)           rt_kprintf("\n");       msh_exec(shell->line, shell->line_position);       rt_kprintf(FINSH_PROMPT);       rt_memset(shell->line, 0, sizeof(shell->line));       shell->line_curpos = shell->line_position = 0;       last_ch = ch;       return;   }   ...   last_ch = ch;   //        ch = 0;   ...}

这样一来,对以 '\r' '\n' "\r\n" 三种组合结束的命令都能识别,**更重要的是,它可以识别以 '\r' '\n' "\r\n" 分割的多条命令!!!**
如下命令列表,可以全复制,粘贴到终端,四条命令逐个被执行。

lspslist_devicelist_thread

效果图

pYYBAGKoI1yASW4hAAONcCR-Fko872.png

结束语

在 rt-thread 的 finsh 终端串口设备使用 serialX 驱动。初战告捷!

这次解决两个问题:一个是, finsh 执行 `rt_device_read` 时可以一次返回多个字节。另一个是,我们可以在终端里粘贴多条命令执行啦。




审核编辑:汤梓红

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 串口
    +关注

    关注

    14

    文章

    1483

    浏览量

    74500
  • RT-Thread
    +关注

    关注

    31

    文章

    1148

    浏览量

    38865
  • serialX
    +关注

    关注

    0

    文章

    7

    浏览量

    786
收藏 人收藏

    评论

    相关推荐

    4月25日北京站RT-Thread线下workshop,探索RT-Thread混合部署新模式

    4月25日,下午我们将在北京举办RT-Thread混合部署线下workshop,在瑞芯微RK3568平台上实现同时运行RT-Thread和linux,本次workshop邀请到RT-Thread资深
    的头像 发表于 04-16 08:35 77次阅读
    4月25日北京站<b class='flag-5'>RT-Thread</b>线下workshop,探索<b class='flag-5'>RT-Thread</b>混合部署新模式

    4月10日深圳场RT-Thread线下workshop,探索RT-Thread混合部署新模式!

    4月10日我们将在深圳福田举办RT-Thread混合部署线下workshop,在瑞芯微RK3568平台上实现同时运行RT-Thread和linux,本次workshop邀请到RT-Thread资深嵌入式软件工程师农晓明老师为您讲
    的头像 发表于 03-27 11:36 415次阅读
    4月10日深圳场<b class='flag-5'>RT-Thread</b>线下workshop,探索<b class='flag-5'>RT-Thread</b>混合部署新模式!

    4月10日深圳场RT-Thread线下workshop,探索RT-Thread混合部署新模式!

    4月10日我们将在深圳福田举办RT-Thread混合部署线下workshop,在瑞芯微RK3568平台上实现同时运行RT-Thread和linux,本次workshop邀请到RT-Thread资深
    的头像 发表于 03-27 08:34 143次阅读
    4月10日深圳场<b class='flag-5'>RT-Thread</b>线下workshop,探索<b class='flag-5'>RT-Thread</b>混合部署新模式!

    RT-Thread设备驱动开发指南基础篇—以先楫bsp的hwtimer设备为例

    RT-Thread设备驱动开发指南》书籍是RT-thread官方出品撰写,系统讲解RT-thread IO设备驱动开发方法,从三方面进行讲解
    的头像 发表于 02-20 16:01 812次阅读
    <b class='flag-5'>RT-Thread</b>设备<b class='flag-5'>驱动</b>开发指南基础篇—以先楫bsp的hwtimer设备为例

    基于rt-thread的socket通信设计

    最近再研究 rt-thread 的通信 ,想设计出 eps8266(多个) rt-thread(作为中控) 服务器的通信框架,使用的开发板是 潘多拉
    的头像 发表于 10-13 15:02 673次阅读
    基于<b class='flag-5'>rt-thread</b>的socket通信设计

    试用RT-Thread Studio(VSCode)

    想尝试RT-Thread studio (VSCode),先下载安装VSCode,再搜索RT-Thread
    的头像 发表于 10-12 10:58 560次阅读
    试用<b class='flag-5'>RT-Thread</b> Studio(VSCode)

    RT-Thread v5.0.2 发布

    RT-Thread 代码仓库地址: ●  https://github.com/RT-Thread/rt-thread RT-Thread 5.0.2 版本发布日志详情: ●  htt
    的头像 发表于 10-10 18:45 770次阅读
    <b class='flag-5'>RT-Thread</b> v5.0.2 发布

    RT-Thread Studio上配置rtthread CANFD驱动来控制M3508电机

    本文旨在RT-Thread Studio上配置rtthread CANFD驱动来控制M3508电机,不涉及任何原理 开发环境:RT-Thread Studio v2.2.6
    发表于 10-08 11:44 546次阅读
    在<b class='flag-5'>RT-Thread</b> Studio上配置rtthread CANFD<b class='flag-5'>驱动</b>来控制M3508电机

    基于 RT-Thread 的 RoboMaster 电控框架(一)

    由于 RT-Thread 稳定高效的内核,丰富的文档教程,积极活跃的社区氛围,以及设备驱动框架、Kconfig、Scons、日志系统、海量的软件包……很难不选择 RT-Thread 进行项目开发
    的头像 发表于 09-19 19:55 412次阅读

    基于RT-Thread的RoboMaster电控框架设计

    由于 RT-Thread 稳定高效的内核,丰富的文档教程,积极活跃的社区氛围,以及设备驱动框架、Kconfig、Scons、日志系统、海量的软件包……很难不选择 RT-Thread 进行项目开发。
    发表于 09-06 15:21 407次阅读

    新书上架|RT-Thread带你解密“芯”世界

    夏木荫荫,人间八月,RT-Thread又上新了!自2018年RT-Thread首本书籍问世后,越来越多的创作者因为RT-Thread的自主可控、稳定可靠、友好生态,把RT-Thread
    的头像 发表于 08-22 20:10 451次阅读
    新书上架|<b class='flag-5'>RT-Thread</b>带你解密“芯”世界

    教你手上没有开发板如何跑RT-THREAD STM32应用?

    首先打开 RT-Thread Studio,新建RT-Thread
    的头像 发表于 07-18 16:09 1048次阅读
    教你手上没有开发板如何跑<b class='flag-5'>RT-THREAD</b> STM32应用?

    【灵动微】FTHR-G0140开发板移植RT-Thread驱动

    灵动微G0140移植RT-Thread驱动
    的头像 发表于 06-05 13:45 21.6w次阅读
    【灵动微】FTHR-G0140开发板移植<b class='flag-5'>RT-Thread</b><b class='flag-5'>驱动</b>

    RT-Thread中的Github Actions

    RT-Thread中一共有五个Github Action(rt-thread/.github/workflow) 分别是: RT-Thread BSP build check(.github
    的头像 发表于 06-01 03:10 350次阅读
    <b class='flag-5'>RT-Thread</b>中的Github Actions

    基于RT-Thread Studio学习

    前期准备:从官网下载 RT-Thread Studio,弄个账号登陆,开启rt-thread学习之旅。
    的头像 发表于 05-15 11:00 2576次阅读
    基于<b class='flag-5'>RT-Thread</b> Studio学习