【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次,發文人進小黑屋喔~

評論