本帖最后由 libai500 于 2024-7-26 22:30 编辑
正文
第一章 构建相关图形(手把手) 第一节 构建串口初始化图形 如上图,串口初始化范例很多,这里不重点讲解,我们说说串口超时设置的重要性。 串口超时设置的作用: “串口超时设置”是针对“字符串接收”指令的,如上图。 读取字符串指令,需要判断是否在超过“超时时间”后,串口不再收到新数据,这对方串口发送已经结束。通常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,......。接收无误。
本文中的程序文件
ASRPRO_串口接收数组(读取字符串法)范例.zip
(2.83 KB, 下载次数: 59)
|