前面记录了下命令环形Buffer:RingBuffer

今天记录下Marlin解析串口数据存储进命令缓存,先看执行主函数:

 部分代码做了折叠,这个主函数,首先是个for循环,然后里面又有个LOOP_L_N,本质上也是个for循环。

接下来在里面首先判断命令环形buffer是不是满了,满了直接返回

接下来检查串口是否有数据,没有的话continue

接下来是数据解析了:

读出串口的环形Buffer的一个字节,如果小于0,说明没有取到串口缓存的数据,没有取到的话则continue

接下来读取出来的字节做一下函数内存储,后面操作都是用serial_char

新建一个临时的串口命令缓存serial,这个临时缓存用来存储本次循环中的串口数据,本次循环只针对一个串口(如果有多个串口的话),下一个串口会新建一个临时缓存serial。

接下来判断接收的串口字节serial_char,如果不是‘\r’或者‘\n’,就会将serial_char存进临时缓存serial,存储动作是在:process_stream_char中执行

如果是‘\r’或者‘\n’,则在ring_buffer.enqueue()中将命令由serial.line_buffer存储进RingBuffer.commands[index_w].buffer中。

至此串口数据由串口的缓存解析并转移到了命令缓存中。

如果是‘\r’或者‘\n’,期间还做了以下功能:

1、过滤掉空格

2、处理带行号的G-Code

3、处理M110的设置行号指令

4、计算校验码并校验正确性

5、打印停止时移动指令的警告处理信息

6、处理特殊指令:M108,M112,M410

7、处理SD卡的部分指令

原创文章,转载请注明出处,谢谢!
QQ:26366050

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐