谢大蟀智能家居

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 16|回复: 0

ASRPRO小白串口接收数组基础教程_直接读取字符串法

[复制链接]

41

主题

46

帖子

162

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
162
发表于 7 天前 | 显示全部楼层 |阅读模式
第一章 构建相关图形(手把手)
第一节 构建串口初始化图形
    如上图,串口初始化范例很多,这里不重点讲解,我们说说串口超时设置的重要性。
    串口超时设置的作用:
    “串口超时设置”是针对“字符串接收”指令的,如上图。
    读取字符串指令,需要判断是否在超过“超时时间”后,串口不再收到新数据,这对方串口发送已经结束。通常10mS为发送信息间隔,也就是“超时设定值”。如果设10mS,则意味着,在陆续收到n字节后,如果超过10mS不再有新的字节被收到,则判定对方串口已经发送结束,此时“读取字符串”指令才会将收到的所有信息,提交回来。
    因此,如果“超时时间”设的太长,“读取字符串”指令会长时间不返回数据,产生阻塞效应,接收信息提交会延误。如果“超时时间”设的太短,则可能捕获不到对方发送结束时间间隔。
    值得注意的是,系统默认超时时间,并不确定。根据版本不同,有的是1000mS,有的是10mS,因此我们不要去赌默认值,我们应该老老实实的设定好超时时间。

第二节 建立串口接收主循环任务
    如上图,我们需要建立一个线程循环任务,命名为“UART0_RX",这里只支持英文。
    在线程任务内的主循环,大约每2mS循环执行一次,用于检测串口0是否接收到了新信息。
    注意,线程任务必须有一个延时,也叫休息期,否则会大量消耗处理器时间,导致优先级不够的任务没有机会运行,因此我们必须加一个延迟,最小单位为2mS。不要小瞧2mS时间,大部分程序组合执行时间可能几十微妙就结束了,2mS是相当长的空余时间。可以为很多任务让出决定性的处理时间。如果线程循环中,没有延迟,则会压垮ASRPRO系统中大部分低级任务,比如“播报”,“语音信息服务"等,导致系统工作不正常。

第三节 循环检测串口接收情况

    如上图,在循环任务中,不断检测串口0是否有信息被收到。

第四节 读取串口接收到的数据,直到不再有新数据


    如上图,当串口刚一有数据到来时,就开始读取。
    “读取字符串”指令会一直搬运陆续接收到的字节信息,直到超时规定时间中不再有新的信息。也因此,我们可以认为“读取字符串”指令是阻塞式的,没有读取完一个完整数据帧,是不会退出的。

    !!!在这里,我们要特别注意到,接收字符串信息用的变量“Rec",一定要临时声明。因为我们有理由认为,临时声明的变量,在转移装载字符串数据时,是完整拷贝的,它不遵循字符串0结尾规范。即,无论信息中是否有0,都会完整的转移过来,而不会丢弃。这对于数组接收是有利的。如上图。

第五节 将数组信息从Rec字符串中提取出来



    如上图,我们可以直接用数组图形访问Rec字符串。这个功能来自于ASRPRO字符串来自与C++String类对象的强大功能集合。它允许用访问数组的指令来访问字符串对象中的每一个信息项。

    值得注意的是,Rec中的字节信息,数据类型是字符型,即C语法当中的"Char"型,如果我们需要以无符号8位类型或其它类型访问,应加类型转换指令。如上图。

    最后,我们用“串口原始输出”指令,将Rec中的第0项内容,发回串口0,用来验证是不是正确收到了串口0的信息。

第六节 获取Rec中接收到了多少字节,并一一输出到串口0




    如上图,我们先建立一个变量“P00接收长度”,并使用“数组文本”指令组中,“字符串长度”指令来获取Rec中到底接收了多少字节。



    最后,我们建立一个以接收长度为范围的循环体,循环访问和输出Rec中的每一项内容到串口0,用来验证串口发来的数组信息是否被正确完整的接收到了。如上图,我们用串口监视器,发送一组数组0x00,11,22,33,......。接收无误。

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|谢大蟀智能家居 ( 闽ICP备18020392号-1 )

GMT+8, 2025-4-20 12:02 , Processed in 0.061815 second(s), 21 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表