ESC/POS指令集在Android设备上使用实例(通过socket)

热敏打印技术深度解析:从化学显影到ESC/POS指令集 热敏打印是一种通过热量在特殊涂层纸张上触发化学反应生成图像的非接触式打印技术。其核心原理在于打印头的发热电阻阵列在微秒级脉冲控制下精准加热,使热敏纸涂层中的无色染料与显色剂发生反应,从而显影出文字或图案。这项技术的工程价值在于其无墨设计带来的高可靠性、低维护成本和快速响应能力,使其在零售收银、物流面单、医疗记录等需要即时、低成本输出的场景中成为首选方案。从硬件层面看,打印头的点密度(DPI)与脉冲宽度调制(PWM)控制决定了打印精度与灰度层次;在软件集成中,广泛采用的ESC/POS指令集为开发者提供了标准化 阅读详情

http://www.it165.net/pro/html/201503/35460.html

网上关于通过android来操作打印机的例子太少了,为了方便更多的开发同仁,将近日所学分享一下。

我这边是通过android设备通过无线来对打印机(佳博58mm热敏式-58130iC)操作,实现餐厅小票的打印。写了一个简单的小demo,分享下。

前提:

1、android设备一个(coolPad8085N)

2、小票打印机(佳博 58mm热敏式打印机-58130IC)

这里将打印机IP设置为固定IP(这里略微复杂,是前辈设置过的,我没有具体操作,问了一下:打印机自检出的条子可以显示IP、通过自带或者官网的window管理软件设置)

3、无线路由器一个(从局域网口引出一根网线接到小票打印机网口)

4、android设备连接wifi到同一网络

(这样就保证了android和打印机在同一网络内,并且打印机的IP是固定的,开发人员是知道的,很变态)

流程:

1、android运行app,根据打印机的IP地址和端口号创建套接字socket,得到可写流outputStream

2、根据订单号,获取订单信息(demo是模拟的)

3、套入模板,打印小票

难点在于小票的排版的实现,我做了个工具库,如下:


加载中...
001. 1 package com;
002. 2
003. 3
004. 4
005. 5 public class printerCmdUtils {
006. 6
007. 7     public static final byte ESC = 27;//换码
008. 8     public static final byte FS = 28;//文本分隔符
009. 9     public static final byte GS = 29;//组分隔符
010. 10     public static final byte DLE = 16;//数据连接换码
011. 11     public static final byte EOT = 4;//传输结束
012. 12     public static final byte ENQ = 5;//询问字符
013. 13     public static final byte SP = 32;//空格
014. 14     public static final byte HT = 9;//横向列表
015. 15     public static final byte LF = 10;//打印并换行(水平定位)
016. 16     public static final byte CR = 13;//归位键
017. 17     public static final byte FF = 12;//走纸控制(打印并回到标准模式(在页模式下) )
018. 18     public static final byte CAN = 24;//作废(页模式下取消打印数据 )
019. 19    
020. 20    
021. 21    
022. 22 //------------------------打印机初始化-----------------------------
023. 23    
024. 24    
025. 25     /**
026. 26      * 打印机初始化
027. 27      * @return
028. 28      */
029. 29     public static byte[] init_printer()
030. 30     {
031. 31         byte[] result = new byte[2];
032. 32         result[0] = ESC;
033. 33         result[1] = 64;
034. 34         return result;
035. 35     }
036. 36    
037. 37    
038. 38 //------------------------换行-----------------------------
039. 39  
040. 40    
041. 41     /**
042. 42      * 换行
043. 43      * @param lineNum要换几行
044. 44      * @return
045. 45      */
046. 46     public static byte[] nextLine(int lineNum)
047. 47     {
048. 48             byte[] result = new byte[lineNum];
049. 49             for(int i=0;i<lineNum;i++)
050. 50             {
051. 51                 result[i] = LF;
052. 52             }
053. 53            
054. 54             return result;
055. 55     }
056. 56    
057. 57
058. 58 //------------------------下划线-----------------------------   
059. 59    
060. 60    
061. 61     /**
062. 62      * 绘制下划线(1点宽)
063. 63      * @return
064. 64      */
065. 65     public static byte[] underlineWithOneDotWidthOn()
066. 66     {
067. 67             byte[] result = new byte[3];
068. 68         result[0] = ESC;
069. 69         result[1] = 45;
070. 70         result[2] = 1;
071. 71         return result;
072. 72     }
073. 73    
074. 74    
075. 75     /**
076. 76      * 绘制下划线(2点宽)
077. 77      * @return
078. 78      */
079. 79     public static byte[] underlineWithTwoDotWidthOn()
080. 80     {
081. 81             byte[] result = new byte[3];
082. 82         result[0] = ESC;
083. 83         result[1] = 45;
084. 84         result[2] = 2;
085. 85         return result;
086. 86     }
087. 87    
088. 88    
089. 89     /**
090. 90      * 取消绘制下划线
091. 91      * @return
092. 92      */
093. 93     public static byte[] underlineOff()
094. 94     {
095. 95             byte[] result = new byte[3];
096. 96         result[0] = ESC;
097. 97         result[1] = 45;
098. 98         result[2] = 0;
099. 99         return result;
100. 100     }
101. 101
102. 102    
103. 103 //------------------------加粗-----------------------------
104. 104 
105. 105    
106. 106     /**
107. 107      * 选择加粗模式
108. 108      * @return
109. 109      */
110. 110     public static byte[] boldOn()
111. 111     {
112. 112             byte[] result = new byte[3];
113. 113         result[0] = ESC;
114. 114         result[1] = 69;
115. 115         result[2] = 0xF;
116. 116         return result;
117. 117     }
118. 118    
119. 119    
120. 120     /**
121. 121      * 取消加粗模式
122. 122      * @return
123. 123      */
124. 124     public static byte[] boldOff()
125. 125     {
126. 126             byte[] result = new byte[3];
127. 127         result[0] = ESC;
128. 128         result[1] = 69;
129. 129         result[2] = 0;
130. 130         return result;
131. 131     }
132. 132
133. 133
134. 134 //------------------------对齐-----------------------------
135. 135   
136. 136    
137. 137     /**
138. 138      * 左对齐
139. 139      * @return
140. 140      */
141. 141     public static byte[] alignLeft()
142. 142     {
143. 143             byte[] result = new byte[3];
144. 144         result[0] = ESC;
145. 145         result[1] = 97;
146. 146         result[2] = 0;
147. 147         return result;
148. 148     }
149. 149    
150. 150    
151. 151     /**
152. 152      * 居中对齐
153. 153      * @return
154. 154      */
155. 155     public static byte[] alignCenter()
156. 156     {
157. 157             byte[] result = new byte[3];
158. 158         result[0] = ESC;
159. 159         result[1] = 97;
160. 160         result[2] = 1;
161. 161         return result;
162. 162     }
163. 163    
164. 164    
165. 165     /**
166. 166      * 右对齐
167. 167      * @return
168. 168      */
169. 169     public static byte[] alignRight()
170. 170     {
171. 171             byte[] result = new byte[3];
172. 172         result[0] = ESC;
173. 173         result[1] = 97;
174. 174         result[2] = 2;
175. 175         return result;
176. 176     }
177. 177
178. 178    
179. 179     /**
180. 180      * 水平方向向右移动col列
181. 181      * @param col
182. 182      * @return
183. 183      */
184. 184     public static byte[] set_HT_position( byte col )
185. 185     {
186. 186         byte[] result = new byte[4];
187. 187         result[0] = ESC;
188. 188         result[1] = 68;
189. 189         result[2] = col;
190. 190         result[3] = 0;
191. 191         return result;
192. 192     }
193. 193 //------------------------字体变大-----------------------------
194. 194 
195. 195    
196. 196     /**
197. 197      * 字体变大为标准的n倍
198. 198      * @param num
199. 199      * @return
200. 200      */
201. 201     public static byte[] fontSizeSetBig(int num)
202. 202     {
203. 203             byte realSize = 0;
204. 204             switch (num)
205. 205             {
206. 206             case 1:
207. 207                 realSize = 0;break;
208. 208             case 2:
209. 209                 realSize = 17;break;
210. 210             case 3:
211. 211                 realSize = 34;break;
212. 212             case 4:
213. 213                 realSize = 51;break;
214. 214             case 5:
215. 215                 realSize = 68;break;
216. 216             case 6:
217. 217                 realSize = 85;break;
218. 218             case 7:
219. 219                 realSize = 102;break;
220. 220             case 8:
221. 221                 realSize = 119;break;
222. 222             }
223. 223             byte[] result = new byte[3];
224. 224             result[0] = 29;
225. 225             result[1] = 33;
226. 226             result[2] = realSize;
227. 227             return result;
228. 228     }
229. 229
230. 230    
231. 231 //------------------------字体变小-----------------------------
232. 232 
233. 233    
234. 234     /**
235. 235      * 字体取消倍宽倍高
236. 236      * @param num
237. 237      * @return
238. 238      */
239. 239     public static byte[] fontSizeSetSmall(int num)
240. 240     {
241. 241             byte[] result = new byte[3];
242. 242             result[0] = ESC;
243. 243             result[1] = 33;
244. 244        
245. 245         return result;
246. 246     }
247. 247
248. 248
249. 249 //------------------------切纸-----------------------------   
250. 250  
251. 251    
252. 252     /**
253. 253      * 进纸并全部切割
254. 254      * @return
255. 255      */
256. 256     public static byte[] feedPaperCutAll()
257. 257     {
258. 258              byte[] result = new byte[4];
259. 259          result[0] = GS;
260. 260          result[1] = 86;
261. 261          result[2] = 65;
262. 262          result[3] = 0;
263. 263          return result;
264. 264     }
265. 265    
266. 266    
267. 267     /**
268. 268      * 进纸并切割(左边留一点不切)
269. 269      * @return
270. 270      */
271. 271     public static byte[] feedPaperCutPartial()
272. 272     {
273. 273              byte[] result = new byte[4];
274. 274          result[0] = GS;
275. 275          result[1] = 86;
276. 276          result[2] = 66;
277. 277          result[3] = 0;
278. 278          return result;
279. 279     }
280. 280
281. 281    
282. 282 //------------------------切纸-----------------------------
283. 283     public static byte[] byteMerger(byte[] byte_1, byte[] byte_2){ 
284. 284         byte[] byte_3 = new byte[byte_1.length+byte_2.length]; 
285. 285         System.arraycopy(byte_1, 0, byte_3, 0, byte_1.length); 
286. 286         System.arraycopy(byte_2, 0, byte_3, byte_1.length, byte_2.length); 
287. 287         return byte_3; 
288. 288     } 
289. 289    
290. 290    
291. 291     public static byte[] byteMerger(byte[][] byteList){ 
292. 292        
293. 293             int length = 0;
294. 294         for(int i=0;i<byteList.length;i++)
295. 295         {
296. 296                 length += byteList[i].length;
297. 297         }
298. 298         byte[] result = new byte[length];
299. 299        
300. 300         int index = 0;
301. 301         for(int i=0;i<byteList.length;i++)
302. 302         {
303. 303                 byte[] nowByte = byteList[i];
304. 304                 for(int k=0;k<byteList[i].length;k++)
305. 305                 {
306. 306                     result[index] = nowByte[k];
307. 307                     index++;
308. 308                 }
309. 309         }
310. 310         for(int i =0;i<index;i++)
311. 311         {
312. 312                 CommonUtils.LogWuwei('', 'result['+i+'] is '+result[i]);
313. 313         }
314. 314         return result; 
315. 315     } 
316. 316    
317. 317 
318. 318    
319. 319 }

工具库包括字体加粗、字体放大缩小、切纸、换行等基本操作,还有就是对byte数组的拼接,byte数组的拼接有很多方式,只实现了一种方式

效果图:

简单的代码解析:

01. public byte[] clientPaper()
02. {
03.  
04. try {
05. byte[] next2Line = printerCmdUtils.nextLine(2);
06. byte[] title = '出餐单(午餐)**万通中心店'.getBytes('gb2312');
07.  
08. byte[] boldOn = printerCmdUtils.boldOn();
09. byte[] fontSize2Big = printerCmdUtils.fontSizeSetBig(3);
10. byte[] center= printerCmdUtils.alignCenter();
11. byte[] Focus = '网 507'.getBytes('gb2312');
12. byte[] boldOff = printerCmdUtils.boldOff();
13. byte[] fontSize2Small = printerCmdUtils.fontSizeSetSmall(3);
14.  
15. byte[] left= printerCmdUtils.alignLeft();
16. byte[] orderSerinum = '订单编号:11234'.getBytes('gb2312');
17. boldOn = printerCmdUtils.boldOn();
18. byte[] fontSize1Big = printerCmdUtils.fontSizeSetBig(2);
19. byte[] FocusOrderContent = '韭菜鸡蛋饺子-小份(单)'.getBytes('gb2312');
20. boldOff = printerCmdUtils.boldOff();
21. byte[] fontSize1Small = printerCmdUtils.fontSizeSetSmall(2);
22.  
23.  
24. next2Line = printerCmdUtils.nextLine(2);
25.  
26. byte[] priceInfo = '应收:22元 优惠:2.5元 '.getBytes('gb2312');
27. byte[] nextLine = printerCmdUtils.nextLine(1);
28.  
29. byte[] priceShouldPay = '实收:19.5元'.getBytes('gb2312');
30. nextLine = printerCmdUtils.nextLine(1);
31.  
32. byte[] takeTime = '取餐时间:2015-02-13 12:51:59'.getBytes('gb2312');
33. nextLine = printerCmdUtils.nextLine(1);
34. byte[] setOrderTime = '下单时间:2015-02-13 12:35:15'.getBytes('gb2312');
35.  
36. byte[] tips_1 = '微信关注'**'自助下单每天免1元'.getBytes('gb2312');
37. nextLine = printerCmdUtils.nextLine(1);
38. byte[] tips_2 = '饭后点评再奖5毛'.getBytes('gb2312');
39. nextLine = printerCmdUtils.nextLine(1);
40.  
41. byte[] breakPartial = printerCmdUtils.feedPaperCutPartial();
42.  
43. byte[][] cmdBytes= {
44. title,nextLine,
45. center,boldOn,fontSize2Big,Focus,boldOff,fontSize2Small,next2Line,
46. left,orderSerinum,nextLine,
47. center,boldOn,fontSize1Big,FocusOrderContent,boldOff,fontSize1Small,nextLine,
48. left,next2Line,
49. priceInfo,nextLine,
50. priceShouldPay,next2Line,
51. takeTime,nextLine,
52. setOrderTime,next2Line,
53. center,tips_1,nextLine,
54. center,tips_2,next2Line,
55. breakPartial
56. };
57.  
58. return printerCmdUtils.byteMerger(cmdBytes);
59.  
60. } catch (UnsupportedEncodingException e) {
61. // TODO Auto-generated catch block
62. e.printStackTrace();
63. }
64. return null;
65. }

字节码拼接过程如下:

01. 1  public static byte[] byteMerger(byte[][] byteList){ 
02. 2        
03. 3             int length = 0;
04. 4         for(int i=0;i<byteList.length;i++)
05. 5         {
06. 6                 length += byteList[i].length;
07. 7         }
08. 8         byte[] result = new byte[length];
09. 9        
10. 10         int index = 0;
11. 11         for(int i=0;i<byteList.length;i++)
12. 12         {
13. 13                 byte[] nowByte = byteList[i];
14. 14                 for(int k=0;k<byteList[i].length;k++)
15. 15                 {
16. 16                     result[index] = nowByte[k];
17. 17                     index++;
18. 18                 }
19. 19         }
20. 20         for(int i =0;i<index;i++)
21. 21         {
22. 22                 CommonUtils.LogWuwei('', 'result['+i+'] is '+result[i]);
23. 23         }
24. 24         return result; 
25. 25     }

将上步得到的字节码通过可写流写入套接字,这时小票打印机就会打印对应的内容。

1、demo链接地址如下:

http://pan.baidu.com/s/1eQ9y8mQ

uniapp多端打印实战:蓝牙/USB/局域网/打印机全适配指南 本文详细介绍了uniapp实现多端打印功能的实战指南,涵盖蓝牙、USB、局域网等多种打印连接方式的适配方案。通过具体代码示例和开发经验分享,帮助开发者解决跨平台打印中的兼容性问题,提升打印功能的稳定性和效率。 阅读详情

相关推荐

安卓蓝牙打印XE10全攻略:SPP连接、ESC/POS指令与避坑指南

蓝牙串口技术(SPP)是许多嵌入式设备实现无线数据传输的基础,它通过模拟串口通道让手机与硬件自由交换字节流。对于热敏打印机这类依靠指令控制的设备,ESC/POS指令集定义了排版、切纸、加粗等操作的标准格式,成为行业通用的控制语言。安卓系统对蓝牙SPP的成熟支持,使移动端直接驱动便携打印成为可能,广泛适用于外卖小票、物流标签、移动付款凭证等场景。但在实际开发中,开发者常面临权限适配、UUID配置、GBK编码转换、数据分块发送等问题。本文以XE10热敏打印机为例,完整梳理了从设备选型、SPP连接、权限处理到ES

weixin_29190573的博客 228

php escpos指令集,ESC/POS指令集完整版

【实例简介】个人精心整理的ESC/POS指令集,希望能帮助到打印机及打印机相关开发者TM-T88VTM-U220●TM-U230amePrint and return to Standard mode (in Page modeASCIIForma tHexDecimal12DEscriptionn Page mode, prints all the data in the print buffe...

weixin_29609733的博客 1723

Android连接网络打印机全攻略:协议选型、Socket直连与踩坑实录

网络打印看似简单,实则涉及多种通信协议与系统机制。在Android平台上,由于打印机厂商各自为政,IPP、RAW/9100、ESC/POS等协议并存,导致开发者难以用统一方案应对所有设备。本文从技术原理出发,先梳理三类主流协议的适用场景,再对比系统PrintManager、厂商SDK与Socket直连三种接入路线的优劣。针对小票、标签等高频打印场景,重点详解基于9100端口的Socket直连与ESC/POS指令拼装,并给出编码处理、超时重连、明文流量豁免等关键细节。同时覆盖mDNS设备发现与静态IP配置等实

axfcjwkbi259888707的博客 329

ESC/POS 指令集和打印机开发

ESC/POS命令集(转摘) 切纸指令: 发送:十六进制:1B69 4.1 基本控制指令 4.1.1 ESC @ [名称] 初始化打印机 [格式] ASCII码 ESC @ 十六进制码 1B 40 十进制码 27 64 [描述] 清除打印缓冲区中的数据,复位打印机打印参数到当打印机缺省参数。 [注意] * 不是完全恢复到出厂设置,用户参数设置(见三、JPM112打印机工具软件)不会被更改。 [例子] char SendStr[3]; SendStr[0] = 0x

baidu_34933057的博客 1万+

POS机安卓开发实战:支付接入、外设管理与可靠性设计全解析

在商用收银场景中,POS机安卓端App与普通应用有本质区别,其核心诉求是长期稳定运行与金额数据绝对准确。开发时常面临聚合支付回调延迟、蓝牙小票打印机乱码、扫码枪兼容性、后台进程被杀导致外设掉线等工程挑战。解决这些问题的关键在于架构选型与模块化设计:以经典MVC搭配单Activity多Fragment保证基础流畅度,对外设通信统一构建连接状态机,并内置订单待确认队列与定时查单机制,以应对掉单补偿场景。同时,支付流程必须严守客户端不信任原则,金额运算一律以“分”为单位,签名校验与轮询补单缺一不可。这些实践不仅适

weixin_34378969的博客 444

安卓POS机开发实战:串口通信、蓝牙打印与扫码适配全攻略

安卓系统凭借开放性与低成本,正在成为商业收银、移动支付等场景的主流终端形态。在智能硬件开发中,外设通信是绕不开的核心环节:串口负责连接密码键盘与钱箱,蓝牙基于SPP协议驱动小票打印,USB扫码枪则需处理HID类设备与输入法冲突。理解这些底层原理后,开发者才能设计出高可用的硬件抽象层,将设备差异隔离在驱动模块内,实现快速替换与稳定运行。从交易状态机、金额精度到异常恢复,再到打印编码与电量管理,这些工程实践共同构成了商用POS安卓版本的关键技术栈。本文围绕真实项目中的架构设计、代码实现与排障经验,系统梳理安卓P

weixin_34161064的博客 371

esc pos命令 java使用_18、ESC/POS指令集在android设备上使用实例(通过socket)

网上关于通过android来操作打印机的例子太少了,为了方便更多的开发同仁,将近日所学分享一下。我这边是通过android设备通过无线来对打印机(佳博58mm热敏式-58130iC)操作,实现餐厅小票的打印。写了一个简单的小demo,分享下。前提:1、android设备一个(coolPad8085N)2、小票打印机(佳博 58mm热敏式打印机-58130IC)这里将打印机IP设置为固定IP(这里略...

weixin_30000735的博客 767

Android连佳博蓝牙打印机:SPP Socket与ESC/POS实战

蓝牙打印是移动支付和餐饮后厨最常见的输出方式,其本质是手机通过经典蓝牙SPP协议与打印机建立RFCOMM通道,再按ESC/POS指令集发送字节流。Android平台实现佳博等热敏打印机通信,不需要依赖厂商SDK,只需理解蓝牙Socket连接、权限适配、数据组包与编码转换。从权限声明、设备扫描、RFCOMM连接,到GBK字节流构造、单线程队列串行化,完整演示小票打印链路,并剖析UUID不匹配、并发写流导致乱票、中文乱码等典型坑点。适合扫码回执、厨打、排队叫号等场景,是一份可直接落地的工程实践指南。

weixin_29174013的博客 121

18、ESC/POS指令集在android设备上使用实例(通过socket)

网上关于通过android来操作打印机的例子太少了,为了方便更多的开发同仁,将近日所学分享一下。 我这边是通过android设备通过无线来对打印机(佳博58mm热敏式-58130iC)操作,实现餐厅小票的打印。写了一个简单的小demo,分享下。 前提: 1、android设备一个(coolPad8085N) 2、小票打印机(佳博 58mm热敏式打印机-58130IC) 这里将...

weixin_34228617的博客 313

ESC/POS指令集完整版

个人精心整理的ESC/POS指令集,希望能帮助到打印机及打印机相关开发者

Android ESC-POS 打印源代码(支持蓝牙和WiFi)

标准ESC-POS命令打印,固定IPWiFi或蓝牙打印,支持黑白图片打印。 其中PrintCommands类列出了基本所有的ESC-POS打印命令。 打印指令参考自Commande ESCPOS.pdf文档。

Android进阶——安卓调用ESC/POS打印机打印

前言前一段时间由于工作需要,要研究一下安卓程序调用打印机打印小票,并且要求不能使用蓝牙调用,研究了一下,可以利用socket连接,来实现打印功能。写了个Demo,分享一下。工具:一台打印机(芯烨XP-80XX),一台安卓测试机开发环境:Android Studio 1.5需求:点击按钮,实现打印小票功能,小票上除必要文字外,还要有二维码。封装了一个Pos打印工具类:package com.exam...

贵宝的博客 1万+

java esc/pos 打印

java 网口打印机 esc/pos 打印

android 控制POS机图文打印(二)

上一篇文章结束了ESC/POS的指令集,没看过的可以去看一下,可以当作工具文档来使用的 android 控制POS机图文打印(一) 这一篇正式介绍如何使用POS机来打印图文信息。 首先介绍一下,ESC/POS指令是如何使用的, 字体加粗指令: byte[] FONT_B = new byte[3]; FONT_B[0] = 27; FONT_B[1] = 33;

meHao的专栏 6237

Android 蓝牙连接 ESC/POS 热敏打印机打印实例(蓝牙连接篇)

主要介绍了Android 蓝牙连接 ESC/POS 热敏打印机打印实例(蓝牙连接篇),具有一定的参考价值,感兴趣的小伙伴们可以参考一下。

大语言模型推理机制:Prefill、Decode与KV Cache解析

Transformer架构中的推理过程涉及Prefill、Decode和KV Cache三个关键技术阶段。Prefill阶段负责将输入文本转换为token序列并生成初始隐藏状态,其计算复杂度与输入长度成正比。Decode阶段则以自回归方式逐token生成输出,依赖KV Cache存储历史键值对来避免重复计算。KV Cache作为核心优化机制,通过智能管理对话记忆显著提升推理效率。这些技术在聊天机器人、代码生成等场景中至关重要,特别是KV Cache的内存优化策略直接影响大模型在边缘设备等资源受限环境中的部署

weixin_30664615的博客 435

uni-app蓝牙打印全攻略:ESC/POS指令集、二维码生成与排版实战

蓝牙通信作为一种经典的短距离无线技术,其核心原理在于设备间的射频信号传输与数据交换。在移动开发领域,通过蓝牙连接外部设备(如打印机)是实现离线、即时数据输出的关键技术,尤其在零售、餐饮、仓储等线下业务场景中具有不可替代的价值。ESC/POS指令集是热敏打印机行业的通用“语言”,通过发送特定的十六进制指令序列,开发者可以精确控制打印机的字符、排版、条码乃至切纸动作。本文将深入解析如何利用uni-app的蓝牙API,结合ESC/POS指令集,解决中文乱码、二维码生成、数据分片发送等工程实践难题,最终实现稳定、高

weixin_30633405的博客 407

CocosCreator3.8实战指南:动态字体与位图字体性能优化技巧

本文深入解析CocosCreator3.8中系统字体、动态字体(TTF)与位图字体(FNT)的核心差异与性能表现。针对动态字体运行时解析开销大、内存占用高的痛点,提供了字体子集化、共享资源等优化技巧;同时详细介绍了位图字体制作流程及其在渲染速度、内存可控性上的绝对优势,并给出跨平台场景下的字体选型与优化策略,帮助开发者有效提升游戏性能。

weixin_29006701的博客 563

Android 与设备交互资料汇总

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_33811961的博客 107

在 CentOS7 下安装 Cadence IC验证平台 INCISIVE152

前言 本文所使用的软件 虚拟机软件:VMware Workstation 15 PRO 如何安装? 操作系统:CentOS-7, CentOS-7-x86_64-DVD-1810.iso 如何安装? 简介 INCISIVE Incisive是nc_verilog, nc_sim, nc_lauch,以及ABV,TBV的集合,用于仿真和验证。 InstallScape InstallSc...

沈醉不知的博客 2万+

120、NPU的Mythic M1076:模拟存算一体NPU

这篇文章分享了作者调试Mythic M1076模拟存算一体NPU的实战经验,主要包含以下要点: 硬件设计陷阱:参考电压输入必须使用低ESR电容,普通贴片电容会导致模拟计算阵列工作异常。 核心技术原理: 采用真正的存算一体架构,将权重存储为模拟电压 使用浮栅晶体管存储权重,通过电流叠加实现乘法运算 包含108个计算单元阵列(Tile),每个256×256规模 使用注意事项: 编程模型特殊,需要依赖SDK自动映射网络层 存在6-8位有效精度限制,需用量化感知训练 功耗特性独特,静态偏置电流占主要功耗 调试手段有

m0_50546716的博客 122
上一篇: Android手机出现"已安装了存在签名冲突的同名数据包"的原因及解决办法
下一篇: EPSON ESC/POS指令
千雅爸爸
博客等级 码龄18年 292粉丝 639原创
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值