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` 时可以一次返回多个字节。另一个是,我们可以在终端里粘贴多条命令执行啦。




审核编辑:汤梓红

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

    关注

    15

    文章

    1607

    浏览量

    81932
  • RT-Thread
    +关注

    关注

    32

    文章

    1540

    浏览量

    44273
  • serialX
    +关注

    关注

    0

    文章

    7

    浏览量

    872
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    首搭RT-Thread程翧车控平台| RT-Thread程翧 S32K344 快速原型开发平台正式上市!| 产品动态

    在智能汽车迈向高集成与高安全的时代,VCU/ECU开发正面临效率与可靠性的双重考验。依赖单一硬件或拼凑软件方案的传统模式,已成为制约创新的瓶颈。为此,RT-Thread带来里程碑式的解决方案
    的头像 发表于 10-31 11:53 483次阅读
    首搭<b class='flag-5'>RT-Thread</b>程翧车控平台| <b class='flag-5'>RT-Thread</b>程翧 S32K344 快速原型开发平台正式上市!| 产品动态

    基于RT-Thread的EK-RA2E2 设备驱动移植与应用 | 技术集结

    目录前言环境配置HelloRT-ThreadGPIO输入与中断I2C主机驱动SPI主机驱动ADC设备驱动PWM设备驱动Flash设备驱动WD
    的头像 发表于 10-05 10:06 5726次阅读
    基于<b class='flag-5'>RT-Thread</b>的EK-RA2E2 设备<b class='flag-5'>驱动</b>移植与应用 | 技术集结

    2025年RT-Thread开发者巡回培训报名正式启动!

    亲爱的RT-Thread社区成员们:新程再启,共赴热爱!2025年RT-Thread开发者巡回培训正式启动报名!今年,我们选择了西安、武汉、北京、杭州、深圳、上海、成都这7座城市,为大家带来
    的头像 发表于 09-27 10:39 1139次阅读
    2025年<b class='flag-5'>RT-Thread</b>开发者巡回培训报名正式启动!

    使用RT-Thread studio 开发RT-Thread Nano项目的时候 串口的驱动是要自己写吗?

    刚入坑。使用RT-Thread studio 开发RT-Thread 标准板项目的时候直接使用里边的串口uart_dev=rt_device_find(“uart5”);然后操作设备,在开发R
    发表于 09-26 08:14

    rt-thread studio 2.2.9如何使用最新的RT-Thread v5.2.0 released?

    rt-thread studio2.2.9如何使用最新的RT-Thread v5.2.0 released? 原先以为修改index_all.json,发现联网的时候,会自动覆盖 另lastet版本
    发表于 09-16 06:06

    STM32cubeMX生成配置rt-thread引用问题求解

    如题,本人小白,刚接触rt-thread,STM32F1/4简便配置起见利用cubeMX自动生成,测试几次后直接蒙了,不知道哪些文件是rt-thread项目必须的,网上说法也花八门,说代码屏蔽某些
    发表于 09-12 07:21

    【好书推荐】RT-Thread第20本相关书籍!《嵌入式实时操作系统RT-Thread原理与应用》| 技术集结

    01内容简介ContentSummary本书为读者提供了一个全面、系统的RT-Thread学习指南,旨在帮助初学者及有经验的开发者掌握RT-Thread实时操作系统和STM32嵌入式微控制器的核心
    的头像 发表于 08-24 10:05 685次阅读
    【好书推荐】<b class='flag-5'>RT-Thread</b>第20本相关书籍!《嵌入式实时操作系统<b class='flag-5'>RT-Thread</b>原理与应用》| 技术集结

    RT-Thread Nano硬核移植指南:手把手实现VGLite图形驱动适配 | 技术集结

    VGLite是NXP提供的轻量级2D图形API,本文将手把手带你实现VGLite图形驱动适配RT-Thread。文章分为上、下两,将手把手教您移植。上篇对RT-ThreadNano内
    的头像 发表于 07-17 14:40 3041次阅读
    <b class='flag-5'>RT-Thread</b> Nano硬核移植指南:手把手实现VGLite图形<b class='flag-5'>驱动</b>适配 | 技术集结

    用SPI玩转WiFi,RT-Thread ESP-Hosted驱动深度适配指南 | 技术集结

    还在为MCU的WiFi连接方案发愁?RT-Thread社区开源ESP-Hosted驱动,通过标准SPI接口即可实现,并且该仓库已整理成RT-Thread软件包。RT
    的头像 发表于 07-09 19:03 1116次阅读
    用SPI玩转WiFi,<b class='flag-5'>RT-Thread</b> ESP-Hosted<b class='flag-5'>驱动</b>深度适配指南 | 技术集结

    RT-Thread荣获2025优秀开源项目 | 新闻速递

    6月底,RT-Thread睿赛德受邀参与由上海开源信息技术协会主办的2025上海开源创新精英荟。上海市商委副主任张杰出席会议并致辞。RT-Thread嵌入式操作系统项目凭借其卓越的技术创新与开源生态
    的头像 发表于 07-04 09:04 2421次阅读
    <b class='flag-5'>RT-Thread</b>荣获2025优秀开源项目 | 新闻速递

    深度剖析 RT-Thread 线程调度流程

    RT-Thread调度第一个线程的主要流程分如下:rtthread_startup:RTT的启动函数,主要负责板级驱动,调度器,系统线程初始化,启动调度的工作
    的头像 发表于 06-25 18:24 1437次阅读
    深度剖析 <b class='flag-5'>RT-Thread</b> 线程调度流程

    揭秘RT-Thread上的AUTOSAR CP系统

    本文探讨了RT-Thread与AUTOSARCP的融合,解决车载ECU开发中实时性、安全性与灵活性的平衡问题。通过分层安全内核(rt-safetyos/autoos)和工具链整合,兼容AUTOSAR
    的头像 发表于 06-23 20:22 2939次阅读
    揭秘<b class='flag-5'>RT-Thread</b>上的AUTOSAR CP系统

    2025 RT-Thread全球技术大会议程正式发布!

    RT-ThreadGlobalTechConference(RT-ThreadGTC,RT-Thread全球技术大会)是聚焦基础软件技术创新与实践的嵌入式技术盛会,持续推动技术价值转化
    的头像 发表于 05-27 19:28 1070次阅读
    2025 <b class='flag-5'>RT-Thread</b>全球技术大会议程正式发布!

    RT-Thread审核团招募: 深度参与开源RTOS社区治理与演进

    全球开发者招募:RT-Thread审核团(ReviewTeam)正式开放申请!在开源的世界里,代码审查(CodeReview)是保证软件质量、促进技术交流的关键环节。RT-Thread作为全球领先
    的头像 发表于 05-21 18:02 1065次阅读
    <b class='flag-5'>RT-Thread</b>审核团招募: 深度参与开源RTOS社区治理与演进

    如何将RT-Thread移植到NXP MCUXPressoIDE上

    RT-Thread默认支持的IDE只有IAR 和 Keil, 那如何将RT-Thread移植到NXP MCUXPressoIDE上呢?本文内容比较简单但稍有琐碎,希望对有需要的小伙伴有所帮助。
    的头像 发表于 02-13 10:37 2433次阅读
    如何将<b class='flag-5'>RT-Thread</b>移植到NXP MCUXPressoIDE上