C#控制DataMax指令打印DPL问题总结
最近這幾天在測(cè)試DataMAx-I-4208采用DPL[Developer Programm Language]指令方式進(jìn)行遇到諸多問(wèn)題.解決這個(gè)問(wèn)題過(guò)程中也是不斷打印測(cè)試得到驗(yàn)證.今天早上用程序批量打印發(fā)先DAtaMax打印出來(lái)的條碼效果和ZeBar斑馬沒(méi)什么區(qū)別.有人也詢問(wèn)很多采用DPL打印細(xì)節(jié)問(wèn)題 就此對(duì)C#控制DAtaMAx指令DPL打印條碼中遇到問(wèn)題進(jìn)行總結(jié)一下.
首先在講遇到問(wèn)題前搞明白我們要打印一個(gè)Code128格式的條碼需要具體控制什么因素? 知道我們要在程序中要做什么 這很重要.DataMax發(fā)送DPL指令給打印機(jī)Code128條碼:
?
?
?
打印一條Code128條碼通過(guò)串口通信向打印機(jī)DataMax發(fā)送DPL指令打印. 首先要建立串口連接,同時(shí)要知道DPL中關(guān)于Code128條碼打印指令語(yǔ)法.剩下就是條碼位置? 等細(xì)節(jié)調(diào)試問(wèn)題. 具體總結(jié)如下:
<1>DPL中打印Code128指令語(yǔ)法
<2>DPL指令中控制BarCode和文本 寬度和高度
<3>DPL設(shè)置條碼打印在底板上初始位置X,Y
<4>采用密爾值控制DPL中條碼寬高比例.
<5>Code128條碼格式控制
分析好問(wèn)題,我們?cè)陧?xiàng)目采用是界面先建立打印模板:
?
?
?
?
?
?
?
?
?
?
打印系統(tǒng)條碼數(shù)據(jù)時(shí)指定不同的打印模板:
?
?
?
?
?
后臺(tái)程序自動(dòng)解析打印模板和打印數(shù)據(jù)稱DataMax支持的DPL指令方式 再發(fā)送給打印機(jī)批量打印.整個(gè)流程:
?
?
?
?
?
?
?
?
?
在上一篇中C#控制DataMax打印機(jī)問(wèn)題總結(jié)中提到.Code128基本打印指令:
1: //Code128 DPL手冊(cè)上打印指令 2: <STX>L 3: D11<CR> 4: 1E000000015010001234567890<CR> 5: 121100000000100Barcode E<CR> 6: E在DPL手冊(cè)Code128基本能看到基礎(chǔ)語(yǔ)法:
<STX>L對(duì)應(yīng)DPL語(yǔ)法特定打印標(biāo)識(shí)頭, 如果直接通過(guò)串口工具發(fā)送給打印機(jī) 則不執(zhí)行 測(cè)試發(fā)現(xiàn)需要把<STX>轉(zhuǎn)換成16進(jìn)制ACII碼格式.
<D11>用來(lái)設(shè)置設(shè)置條碼中平均的英寸范圍內(nèi)每個(gè)打印點(diǎn)寬度和高度. 類似打印DAtaMAx-i-4208對(duì)飲DPI203 則每英寸的打印點(diǎn)DOT 固定為8個(gè),在DPL手冊(cè)中設(shè)置語(yǔ)法:
?
?
?
?
?
?
?
在說(shuō)明我可以看出打印機(jī)為203DPI的Dot點(diǎn)設(shè)置默認(rèn)為D22. DWH語(yǔ)法能夠設(shè)置的值組合總共有6個(gè).來(lái)調(diào)節(jié)條碼寬度.
第三行是核心打印條碼的指令:
1: //核心打印條碼DPL指令 分為兩部分 2: 1E0000000150100 01234567890<CR> 3: ?如上清晰看出大概分為兩部分. 前一部分是打印條碼Code128格式字符串,?? 后面一部分則是條碼中指定負(fù)載數(shù)據(jù).其實(shí)如果你進(jìn)一步深入會(huì)問(wèn): 不同條碼間格式如何定義的?后來(lái)我翻遍整個(gè)DPL手冊(cè)終于在一個(gè)小角落[150頁(yè)]找到相關(guān)說(shuō)明:
?
?
?
?
?
?
?
對(duì)打印整個(gè)條碼指令進(jìn)行結(jié)構(gòu)拆解:
?
?
?
?
?
?
?
?
?
1E0000000150100 這端標(biāo)識(shí)頭字符串代表什么意思?繼續(xù)進(jìn)行拆解發(fā)現(xiàn):
?
?
?
?
?
?
?
?
?
這時(shí)是否有些徹底明白了吧那一段代碼具體代表什么意思.如下我會(huì)演示用C#發(fā)送DPLCode 128打印條碼.整個(gè)過(guò)程,.在上篇中C#控制DataMax打印機(jī)問(wèn)題總結(jié).提到<STX>標(biāo)識(shí)指令頭轉(zhuǎn)換16進(jìn)制問(wèn)題.
?
?
?
?
?
這時(shí)轉(zhuǎn)換后16進(jìn)制字符串,我們通過(guò)ASII16進(jìn)制修改工具查看一下這個(gè)字符16進(jìn)制碼:
?
?
?
?
?
?
?
?
?
?
?
經(jīng)測(cè)試發(fā)現(xiàn)<STX>對(duì)應(yīng)16進(jìn)制碼為: 3C?? 53?? 54?? 58? 3E? . ok 到此在C#程序把程序拼接時(shí)發(fā)現(xiàn) 把這些16進(jìn)制發(fā)送給打印機(jī)依然無(wú)法識(shí)別.后來(lái)找到串口工具.發(fā)現(xiàn)文本中拷貝進(jìn)入成功打印:
?
?
?
?
?
發(fā)現(xiàn)DAtaMAx打印機(jī)識(shí)別則是<STX>轉(zhuǎn)換16進(jìn)制后指令字符是 ? ,既然有了有了<STX> 16進(jìn)制編碼我們進(jìn)行反編譯字符:
1: //格式化字符指令頭<STX> 2: //Author:chenkai DAta:12/08 11 AM 3: protected override string Leading() 4: { 5: #region 轉(zhuǎn)16進(jìn)制數(shù)據(jù) 6: StringBuilder getbuilder = new StringBuilder(); 7: string getconverstr = "<STX>"; 8: char[] values = getconverstr.ToCharArray(); 9: ? 10: foreach (char getchar in values) 11: { 12: int value = Convert.ToInt32(getchar); 13: getbuilder.AppendFormat(String.Format("{0:X}", value)); 14: } 15: #endregion 17: this.StartStr = "<STX>".ToString();//3c 53 54 58 3E[16進(jìn)制結(jié)果一直 無(wú)打印效果] 18: string teststr = "EF BB BF 02"; 19: ? 20: #region 16進(jìn)制轉(zhuǎn)字符串 21: StringBuilder getAsibuilder = new StringBuilder(); 22: string[] spiltstr = teststr.Split(' '); 24: string[] charstr = new string[spiltstr.Length]; 25: int count = 0; 26: foreach (string hex in spiltstr) 27: { 28: int value = Convert.ToInt32(hex, 16); 29: string stringValue = Char.ConvertFromUtf32(value); 31: //回歸字符 32: char charValue = (char)value; 33: charstr[count] = charValue.ToString(); 35: count++; 36: getAsibuilder.AppendFormat(charValue.ToString());//測(cè)試發(fā)現(xiàn) 最后一位16ASII碼即為有效字符[Fuck] 37: } 38: #endregion 39: return charstr[charstr.Length - 1] + "L" + "\n";//D11<CR>\n";//[測(cè)試成功 但每次出現(xiàn)WebServer重啟現(xiàn)象] 40: }經(jīng)過(guò)對(duì)<STX>16進(jìn)制編碼進(jìn)行反編譯成字符發(fā)現(xiàn)最后一個(gè)16進(jìn)制碼3E對(duì)應(yīng)就是打印識(shí)別特殊字符 . ok至此第一步讓DataMAX打印機(jī)識(shí)別DPL指令.如下在來(lái)解決涉及BArcode 128在打印中涉及具體問(wèn)題.
首先來(lái)看如何在利用DPL指令方式控制BarCode在打印中初始位置X,Y: 在打印中如果想知道打印元素對(duì)應(yīng)的方位坐標(biāo)則需要知道目前打印機(jī)對(duì)坐標(biāo)系統(tǒng)設(shè)置對(duì)應(yīng)關(guān)系:
?
?
?
?
?
?
?
打印機(jī)中不同的坐標(biāo)系統(tǒng).同一個(gè)元素所在坐標(biāo)位置值則不同.類似坐標(biāo)系統(tǒng)A中:條碼對(duì)應(yīng)XY坐標(biāo)也不同:
?
?
?
根據(jù)DPL中說(shuō)明DAtaMAx坐標(biāo)為A方案.那么如何來(lái)通過(guò)DPL指令來(lái)控制條碼在紙帶上初始位置? 在DPL文檔中仔細(xì)研究發(fā)現(xiàn)設(shè)置BArCode初始位置屬性時(shí)Row OffSet和Column OFFset 分別對(duì)應(yīng)語(yǔ)法:
?
?
?
?
?
?
?
?
?
基本語(yǔ)法為R0015,則設(shè)置在紙帶上初始X坐標(biāo)位置15點(diǎn), 值的范圍[0-9999],對(duì)應(yīng)格式必須是4位數(shù)作為標(biāo)識(shí),Column Offset則基本雷同.不在贅述.添加了初始化位置DPL指令如下:
1: //設(shè)置初始位置DPL指令 chenkai 2: L 3: R0044<CR> 4: C0015<CR> 5: D11<CR> 6: 1E000000015010082001590000000013324<CR> 7: E 8: ?從上可以看出對(duì)應(yīng)初始坐標(biāo)為X:y=44:15.程序中控制坐標(biāo)位置格式000R:
1: //格式化初始打印位置數(shù)據(jù) chenkai 2: public string ConvertDataFormat(float getvalue) 3: { 4: string converstr = string.Empty; 5: if (!string.IsNullOrEmpty(getvalue.ToString())) 6: { 7: //Convert Float to int type 8: string getfromtint = Convert.ToInt32(Math.Round(getvalue)).ToString(); 9: if (4 - getfromtint.Length > 0) 10: { 11: int getlength = 4 - getfromtint.Length; 12: for (int count = 0; count < getlength; count++) 13: { 14: getfromtint = "0" + getfromtint; 15: } 16: converstr = getfromtint; 17: } 18: else 19: { 20: //長(zhǎng)度超過(guò)或等于格式長(zhǎng)度4 21: if (4 - getfromtint.Length == 0) 22: converstr = getfromtint; 23: else 24: { 25: converstr = string.Empty; 26: throw new EquipmentException("打印位置超過(guò)本地打印機(jī)設(shè)置 設(shè)置小于等于4位數(shù)"); 27: } 28: } 29: } 30: return converstr; 31: }調(diào)用控制XY坐標(biāo):
1: //設(shè)置初始打印Row OffSet 位置值 2: string topstr = this.ConvertDataFormat(top); 3: string leftstr = this.ConvertDataFormat(left); 4: ? 5: //設(shè)置初始打印Column OffSet 位置值 6: getbuilder.AppendFormat("R{0}<CR>\n", topstr); 7: getbuilder.AppendFormat("C{0}<CR>\n", leftstr);如下在關(guān)注條碼寬度設(shè)置,在圖一中我們對(duì)條碼設(shè)置一個(gè)屬性值叫密爾 即條碼寬度單位.在測(cè)試ZeBar打印計(jì)算ZPL中計(jì)算寬度是每密爾對(duì)應(yīng)0.25CM. 但是在DPL設(shè)置則不同,單一單位區(qū)域內(nèi)打印點(diǎn)DOt數(shù)量是不變的,只有設(shè)置DOt的高度和寬度才能設(shè)置條碼外在寬度效果.203DPI 對(duì)應(yīng)每英寸8個(gè)點(diǎn)Dot. DPL如何來(lái)設(shè)置每個(gè)點(diǎn)的Width和Height:具體語(yǔ)法格式
?
?
?
?
?
?
?
D11是默認(rèn)值,針對(duì)300、400 600DPI打印機(jī),DAtaMAx-i-4208的DPi為203,則對(duì)應(yīng)的設(shè)置為D22. 在界面中密爾值范圍8-17共10個(gè)值:
?
?
?
?
?
?
?
?
?
10值范圍對(duì)應(yīng)可以設(shè)置的比例關(guān)系為6個(gè): 分別為1:1 /1:2/1:3/2:1/2:2/2:3. C#中進(jìn)行范圍指定控制:
1: #region 設(shè)置密爾值. 2: string miwidth="1", miheight="1"; 3: int barLineWidth = PubMethod.ToInt(detailtmp.BARLINEWIDTH); 4: int midvalue = barLineWidth; 5: if (barLineWidth < 10) 6: { 7: //Default Code128 Bint 8: miwidth = "1"; 9: miheight = "1"; 10: } 11: else if (barLineWidth >= 10 && midvalue < 12) 12: { 13: miwidth = "1"; 14: miheight = "2"; 15: } 16: //密爾值設(shè)置BarCode 寬高比例關(guān)系. 17: //DPL使用Dot 在Inch中密度在決定寬高. 不能直接設(shè)置 值范圍Width[1-2] Height[1-3] 18: //DAtaMAx中DPi203 默認(rèn)值 為D22 Code 128設(shè)置Defaul D11 19: string setLocation="D"+miwidth+miheight; 20: getbuilder.AppendFormat(setLocation+"<CR>\n"); 21: #endregion如果采用默認(rèn)的D11設(shè)置發(fā)現(xiàn)打印出來(lái)效果 總體條碼寬度或高度過(guò)小.需要對(duì)條碼寬高進(jìn)行重新設(shè)置.在Code128語(yǔ)法命令有一段說(shuō)明很重要:
?
?
?
?
?
其中明確提到第四個(gè)字符用來(lái)設(shè)置條碼寬度,從第五個(gè)字符串到第七位設(shè)置條碼高度值. Height[0-999] C#則需要憑借字符串方式來(lái)組合DPL指令:
1: #region 處理?xiàng)l碼寬高比例 2: //BarCode設(shè)置寬高比例需要Header FrmatString設(shè)置 寬第四個(gè)字符 高 第五至第七個(gè)字符串 3: //Width[0-9]-Common[0-4] height[0-999]-Common[32-45] 4: string widthstr = string.Empty; 5: string heightstr = string.Empty; 6: ? 7: //元素在打印效果中寬高 8: width = (detailtmp.ENDX - detailtmp.BEGINX); 9: height = (detailtmp.ENDY - detailtmp.BEGINY); 10: ? 11: if (this.Template != null) 12: { 13: widthstr = ((int)width/100).ToString(); 14: heightstr =this.FormatBarCodeHeight(((int)height-25).ToString()); 16: if (Convert.ToInt32(widthstr) > 9) 18: widthstr = "9"; 20: else if (Convert.ToInt32(widthstr) == 0) 22: widthstr = "1"; 24: } 26: #endregion 27: getbuilder.AppendFormat("1E0{0}{1}00150100{2}\n","1",heightstr,barcode);//剔除<CR>至此從程序發(fā)給DAtaMAx最終打印DPL指令為:
1: //最終DPL指令 2: L 3: D22<CR> 4: R0044<CR> 5: C0015<CR> 6: 1E01032001501008200745869542876<CR> 7: 121100000000100Barcode T<CR> 8: E最終控制打印效果[居中設(shè)置]:
?
?
?
?
最后關(guān)于<CR>如果在傳入條碼值時(shí)最好去掉 在指令中有時(shí)會(huì)把CR作為字符串打印條碼數(shù)據(jù)中.
總結(jié)
以上是生活随笔為你收集整理的C#控制DataMax指令打印DPL问题总结的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 采用CSS+JS实现简洁的滑动导航栏_网
- 下一篇: ISO9000互联网管理办法