【Marlin】_串口命令处理

一、前言

Marlin 是一个用于 3D 打印机的开源固件,其功能强大,集成 LCD 控制器,步进电机控制算法(梯形加减速,S 形加减速),PID,多轴电机控制,Bresenham 直线算法,串口命令解析等等功能。本文简要介绍其接收串口命令并初步做解析的过程。以 2.1.2 版本的固件为例进行说明。固件可以自行到 Marlin 官网进行下载。

二、解析

Marlin 首先会把串口接收到的数据存放至环形缓冲区。

大致介绍一下环形缓冲区,缓冲区的结构体大致如下图。固件中可能命名不一致,这里只是举例说明。

串口接收到的数据都会一次存放到 buffer 中,每存进去 1 个 Byte,head 加 1,直到存满为止,每往外取一个 Byte,tail 加 1。head 与 tail 相同,则代表缓冲区中没有数据。可能会有疑问说串口不会一直接收数据到存满吗,不会,Marlin 与上位机之间有协议,上位机不会一直发,只有得到 Marlin 相应的应答,上位机才会通过串口发送命令,Marlin 接收数据然后存放到环形缓冲区。

在 Marlin 固件中处理接收到的数据的函数主要是

void GCodeQueue::get_available_commands()

这个函数放在主循环 loop() 里面,每执行一次,会把数据从串口环形缓冲区里面取出,处理然后放在一个行(hang)缓冲区。这个行缓冲区的结构如下图。

每取一个 Byte都会判断它是不是换行符号或者回车符号,不是的话就存到 line_buffer[] 这个数组里面,然后 count 加 1。

如果检测到空格或者换行,就代表已经读取到了一行完整的命令,然后会把这个 line_buffer[] 的数据拷贝到一个命令专用的环形缓冲区,这个命令专用的环形缓冲区与上面的串口数据缓冲区结构大致相同。如下图。

其中 CommandLine 的定义如下。

这个命令的环形缓冲区还包含了十一个对这个缓冲区做操作的方法。到这里,读取的串口数据就还原成一条条的 G-Code 命令了。一条 G-Code 命令就是一个 CommandLine,后面 Marlin 将从这个缓冲区中取命令,然后执行。

其中 length 代表当前这个缓冲区中目前有多少条 G-Code,每写入一条完整的 G-Code,index_w 加 1,每往外取一条命令,index_r 加 1。

这就是一个完整的流程。现在整理一下画个简单的框图如下。


三、总结

本文简单分析了 Marlin 接收串口数据然后将其还原成 G-Code 命令并且存放到相应 buffer 的过程。

★博文内容均由个人提供,与平台无关,如有违法或侵权,请与网站管理员联系。

★文明上网,请理性发言。内容一周内被举报5次,发文人进小黑屋喔~

评论