劉晉,金禹含,步亞楠,蘇臣
?
基于3D打印機傳輸中斷解決方案的設計與實現
劉晉,金禹含,步亞楠,蘇臣
摘 要:PC機使用C#語言在VS2008的工具上編寫實現“數據處理”軟件。下位機選取STM32系列的STM32F103RBT6作為主控系統,采用串口作為硬件傳輸媒介,下位機軟件設計借助uC/OS-III實現多任務并發處理。數據傳輸過程中傳輸中斷現象設計方法和解決方案,借助此方案很容易快速查詢出錯位置以及信息。經過理論分析和軟硬件結合測試,不但證明了傳輸系統的可行性和實用性,而且還為降低研發成本、實用性、方便性構建數據傳輸系統提供了問題解決思路及參考價值。關鍵詞:C#;STM32;uC/OS-II;中斷傳輸
3D打印機為保證打印出3D實體,宿主機應用軟件中導入由CAD[1](Computer Aided Design)生成的實物數據,通過PC機所攜有的器件與下位機傳輸數據,但有時會突發傳輸中斷現象,即文件數據傳輸到中間位置時中斷傳輸。一旦發生此類問題,很難判斷是上位機還是下位機導致的中斷現象,如何能快速的發現出錯位置和信息值得深入研究和探討。
本文3D打印系統[2]采用采用的是快速成型技術(Rapid Prototyping,RP)[3]之一的熔融沉積成型原理,通過分層加工和疊加成形相結合的方法,逐層打印材料來生成3D實體。官網提供的Cure軟件打開如圖1所示:

圖1 3D實物圖原形
后生成右圖的chinese__laser.gcode文件如圖2所示:

圖2 3D實物圖數據
左圖上的29 minutes說明打印此3D實物需要29分鐘,而下面的0.26 meter 2gram說明此實物的耗材需0.26米2克。右圖為3D實物圖的數據量,即515KB,從這點看3D打印系統傳輸速度不需過快。不少專家指出我國3D打印機落后原因[4]是成本過高、研發技術落后等,出于落后原因、實用性、方便性、以及對打印速度的要求為出發點與考慮,采用UART作為硬件傳輸媒介,即PC機利用C#語言編寫基于上位機的軟件,把3D圖像通過計算機輔助軟件生成“.gcode”文件進行讀、修改后通過串口發送給下位機(STM32)。
此實物圖數據量為515KB,若采用串口通信機制的波特率為115200時,不過一分鐘就能把數據傳送完。根據官網提供的打印信息以及底層機械處理因素知,應采取校驗碼來控制傳輸狀態。下位機采用的是STM32系列的STM32F103RBT6作為主控制器,借助嵌入式實時操作系統最新版uC/OS-III,把接收到的數據通過消息、信號量等信息發送給特定任務進行后續處理。PC機與下位機發送大量的數據時,偶爾會遇到傳輸中斷現象,即PC機不再發送數據且下位機不再接收數據。剛開始傳輸出現此現象根據邏輯分析、程序運行過程是很容易查詢出錯位置,但過程中中斷,即數據傳輸中間時中斷,是很難判斷是PC機應用軟件問題還是下位機STM32原因造成的。
針對此類問題,本系統在實驗過程中自定義調試方法,來快速查找出錯位置、糾正錯誤信息及時改正。通過多次試驗和對比驗證,證明大量數據傳輸過程中在無法判斷是上層PC機軟件還是下位機主控程序出錯導致傳輸中斷時,可參考此調試方法進行查找,為用戶快速查詢問題提供參考價值。
因本系統以降低研發成本、實用性、方便性為出發點與考慮,研發出一套基于低價格的打印系統,以便適用更多的用戶群體,所以下位機的選擇以低成本、實用性為考慮選取STM32為硬件開發平臺。該研發版采用ST公司32為ARM[5]處理器STM32F103RBT6:該芯片最大時鐘頻率是72MHZ;采用LQFP64封裝;內置大容量存儲器包括128 KB 的高速Flash和20 K 的SRAM;豐富的外設接口;工作電壓2.0--3.6V、64 個I/O 接口、2 個USART、2 個I2C、2 個SPI、RTC 等。本系選取STM32主控的UART1作為硬件傳輸媒介,PA9為數據接收引腳、PA10為數據發送引腳。因uC/OS[6]任務運行起來的調度主要是通過周期時鐘中斷來實現的,每個時鐘節拍到來都會產生一次定時中斷,中斷后啟動調度器運行,運行就緒表中優先級最高的任務。選取STM32主控的滴答定時器來產生周期中斷,并設置OS_CFG_TICK_RATE_HZ 宏定義為1000u,即1ms產生一次中斷。中斷產生后進入中斷服務程序SysTick_Handler(),退出時調度器進行調度。
3.1文件傳輸格式
文件并不能完全適用于下位機的處理,它不但有多余的注釋信息,而且還有大量的冗余空格和回車換行等。為減輕下位機負擔,提高系統整體工作效率,此時設計數據傳輸格式如圖3所示:

圖3 數據傳輸格式生成的“.gcode”
即以G、M、X字符標記一行數據命令的開始,中間以空格的形式隔開。PC機下發的每一行數據通過下位機STM32解析后,發出控制命令控制電機在X、Y、Z軸方向移動以及擠壓耗材。
研究設計傳輸模式為:上位機應用軟件首先發送“傳輸頭”0x01,下位機接收到0x01,說明上位機準備傳輸數據。下位機從“程序初始化時建立的緩沖池”中申請存儲塊,申請成功回發0x06,未成功則發數據0x15。上位機接收到0x06后,則傳送一行字符,傳送完一行數據后下發數據0x00,下位機接收到0x00后說明一行數據傳送完成,下位機發消息到任務的內建消息隊列中為后續解析以及向電機發控制命令等做準備。消息向內建消息隊列發送成功,向上位機回發0x04,當上位機接收到0x04說明一行數據發送成功。若上位機未完成所有數據的傳輸,則上位機繼續發送“數據頭”0x01,為下次傳輸做準備。但是若上位機發送0x01,接收到的回響數據是0x15時,說明下位機從緩沖池中申請內存塊沒成功,則上位機等待400ms左右,繼續發送0x01,直到接收到下位機的回響數據0x06后,才能繼續傳輸。PC機在向下位機STM32傳輸數據之前刪除無用的gcode文件數據,不但使傳輸的文件數據看起來簡單易懂,而且減輕了下位機STM32的負擔,更滿足此3D傳輸系統的簡潔、方便的特性。
3.2 下位機軟件程序流程
下位機數據流程設計如圖4所示:

圖4 下位機數據流程設計圖
根據圖4知,下位機有數據到來時直接促發中斷產生,為降低中斷服務時間,接收數據后直接發送消息到“Uart Process”任務的內建消息隊列中。uC/OS-III中每一個任務都有其內建的消息隊列,用戶可以不用通過外部的消息隊列而直接向任務發布消息。uC/OS-III對此的設計不但簡化了代碼,而且比使用外部消息隊列更加有效。“Uart Process”首先Pend消息,查詢到接收數據是0x01后,從設定的緩沖池中OSMemGet()申請存儲塊,成功后存儲接收到的數據。存儲完一行數據后把存儲塊的首地址當作消息Post到“Data Process”任務的內建消息隊列中,“Data Process”任務首先Pend消息,然后把接收到一行的數據進行解析,給電機發控制信號,對電機方向、運動、擠壓耗材等進行控制,處理完后,把申請的存儲通過OSMenput()函數歸還到空存儲塊的鏈表上,以備后續使用。當下位機接收傳輸頭0x01后,若存儲塊中沒有空閑的存儲塊時,則上位機會繼續發送0x01,直到申請存儲塊成功后才可繼續接收數據。為使接收數據任務與數據處理任務并發的進行,初始化時設定緩沖池,考慮到每行數據約30幾個字符不等,所以設定16個存儲塊并且每個存儲塊設定為40個字節,接收到“傳輸頭”后申請存儲,數據處理完后釋放。不但使用方便,而且避免了在嵌入式系統中使用malloc()函數和free()函數造成存儲空間碎片等問題。
3.3 調試信息模塊設置
通過以上對系統上位機與下位機的設計與實現,整個系統開始運作時偶爾會出現傳輸中斷現象。如系統工作中對“圖1”傳輸實驗,此文件每行有30左右字節數據,共17000多行。有時可成功傳輸,但偶爾會突發中斷傳輸現象,此中斷還不是出現在開始,而是出現在中間,即有可能出現完成5000或10000多行等傳輸后突然中斷傳輸。上位機不再下發數據,下位機也不在處理數據,這時是很難發現是上位機應用軟件還是下位機STM32造成了中斷。調試過程中捕捉錯誤現象是關鍵,并使這種偶然的bug能頻繁的出現為后續解決做準備。通過資料查詢以及借鑒學者的經驗下,基于此不穩定狀態的設置思路為圖5示:

圖5 收發數據校驗流程圖
在上位機應用軟件的編寫過程中設置兩個8字節大小的緩沖區,收發數據顯示在如圖設置的PC機端的緩沖區內。顯示8個字節數據后,當有新接收或發送的數據到來時,8字節數據往后移動,先前第二位置時現變成第一位、先前第三位置時現變成第二位,如此一來,先前第一位的數據舍棄,先前第八位置數據空缺,則新接收和發送的數據填補到第8個字節的位置上,以此形式重復的刷新。void buf_proc(char rch, char tch)//緩沖區處理
{
int i;
for (i = 0; i < 7; i++)
{
buf_rx[i] = buf_rx[i + 1];//接收區數據后移
buf_tx[i] = buf_tx[i + 1];//發送區數據后移
}
buf_tx[7] = tch;
buf_rx[7] = rch;
}以上程序為調試模塊中緩沖區的數據刷新。為方便觀察,若此時是接收數據,則對應的發送數據處補“00”,若此時是發送數據,則對應的接收數據處補“00”。以此通過最后收發數據的對比來查詢出錯位置及信息。
上位機應用軟件在PC機使用C#語言借助VS2008工具下實現的應用軟件,此截圖是傳送完一行數據后中斷的截圖,如圖6所示:

圖6 系統傳輸中斷截圖
為方便觀察,標記了需要觀察的位置,連續的兩個“30”是右上方正在發送文本框中的“0”的十六進制顯示。在發完第一行后,上位機發送數據“00”,即一行的結束標志,但下位機回發數據是06(內存申請成功),上位機在發送01“傳輸頭”后,下位機沒回。對比來看,上位機發送一行結束標志“00”時,下位機應回發04但是下位機回發的是06。上位機沒有接收到字符“04”,所以顯示發送的行數仍然是“0行”。綜合來看,此次中斷的產生是下位機系統的回響數據有問題,即下位機系統造成了此次中斷的產生,更深一步說下位機程序在接收到“00”后的數據處理有問題。
傳輸過程中突然中斷的截圖,如圖7所示:

圖7 系統傳輸中斷截圖
因此系統是按最初的設計進行編寫,并沒有按系統中規定的字符顯示形式進行編寫,為分析容易,只是顯示傳輸過程中部分校驗數據。即“1”,“4”,“6”,“15”這些數據,且數據是單字符顯示。為方便觀察,特意用軟件將要觀察的地方標記出來。此截圖是正在發送完859行數據后突然傳輸中斷。分析接收和發送區的數據知,上位機在發送數據“1”(傳輸頭)后,下位機申請內存成功返回數據“6”,最后接收到“4”,,此行發送正確,但當上位機發送準備傳輸數據“1”后,下位機回發“6”,內存申請成功,后產生中斷。分析知,偶爾出現傳輸中斷原因是上位機產生的,即上位機接收到下位機內存申請成功的標志,也就是下位機已準備好接受數據,但是上位機不再操作。通過分析知,上位機在接收到“6”后沒有按程序設定的狀態運行,所以偶爾會在此處中斷傳輸,進一步解釋,上位機在從串口接收區讀取數據的延時時間以及在對接收數據“6”的判斷可能有問題,可從此處所提到的程序處查找問題。
本文的3D打印系統以降低打印成本、簡單、方便、實用性、面向更多的用戶群體為出發點與考慮。PC 機借助C#編程語言設計實現上位機應用軟件,下位機采取STM32作為主控制平臺,借助uC/OS-III實現多任務的并發處理,采用串口作為數據硬件傳輸媒介。通過實踐和理論研究證明此方案的可行性,并對大量數據傳輸過程中偶爾中斷現象設計了解決方案。實驗證明通過此方案很容易查詢出錯原因是在上位機還是下位機,為構建數據傳輸系統提供了解決問題思路及參考價值。由于本文的3D打印系統正處于研發階段,一定還有不少缺陷和不足,需以后加以彌補和改正。也希望將來此傳輸系統能為我國3D打印機的發展提供思路以及參考價值。
參考文獻
[1] 王月圓,楊萍.3D打印技術及其發展趨勢[J].印刷雜志2013,04:10-12.
[2] 古麗萍.蓄勢待發的3D打印機及其發展[J].技術前沿.2014:64-67.
[3] 余冬梅,方奧,張建斌. 3D打印:技術和應用[J].知識園地.2013,06:6-11.
[4] 王雪瑩. 3D 打印技術與產業的發展及前景分析[J].中國高新技術企業.2012,26:3-5.
[5] 宋亮,苗瓊.嵌入式實時操作系統μC/OS-II 串口通信的設計與實現 [J].電子設計工程.2011,1:3-5 .
[6] 逯玉蘭,燕振剛,李廣.uC /OS-III內核在STM32F103VET6芯片上的移植研究[J].計算機與現代化.2014,09:132-136.
Transmission Interruption of Solution Design and Implementation Based on 3D Printer
Liu Jin, Jin Yuhan,Bu Yanan,Su Chen
(College of Computer and Information Technology, Liaoning Normal University, Dalian 116081, China)
Abstract:PC uses C# language to write software for data processing on VS2008. The lower computer selects STM32F103RBT6 from the STM32 series as the main control system, and uss the serial port as the hardware transmission medium. The design of lower computer software uses uC/OS-III to realize the multi-task concurrent processing. It also designs the method and solution scheme for the phenomenon of transmission interruption in the process of data transmission, and the error position and information can be checked out easily and fast by using it. Through theoretical analysis and a testing combining hardware and software, it not only proves the feasibility and practicability of the transmission system, but also provides solution and reference value for cost reducing, practicality, convenience construction of data transmission system.
Key words:C#; STM32; uC/OS-III; Interrupt Transmission
收稿日期:(2015.07.07)
作者簡介:劉 晉(1964-),男,遼寧師范大學,計算機與信息技術學院,教授,研究方向:數字印刷技術與嵌入式系統設計,大連,116081金禹含(1987-),女,遼寧師范大學,計算機與信息技術學院,碩士研究生,研究方向:噴繪機系統設計,大連,116081步亞楠(1989-),男,遼寧師范大學,計算機與信息技術學院,碩士研究生,研究方向:數字印刷技術,大連,116081 蘇 臣(1990-),男,遼寧師范大學,計算機與信息技術學院,碩士研究生,研究方向:嵌入式系統,大連,116081
文章編號:1007-757X(2016)01-0060-03
中圖分類號:TP393
文獻標志碼:A