www.pudn.com > stm32-printer.rar > PrinterDrv.c, change:2014-10-24,size:32484b
#define _OWN_CAPPPRINTDRV #include <stdlib.h> #include "includes.h" #include "stdarg.h" //*********************************************** // 打印命令 #define ESC 0x1B #define GS 0x1D #define FS 0x1C //串口配置 #define UartPrint USART1 //打印机 //基本控制指令 u8 TxBuf_InitPrinter[] = {ESC, '@'}; //打印机初始化 u8 TxBuf_PrintAndNewPage[] = {0x0C}; //打印并走纸到下页首 u8 TxBuf_PrintAndNewLine[] = {'\n'}; //打印并换行 0x0A u8 TxBuf_PrintTest[] = {0x1D, 0x28, 0x41, 0x02, 0x00, 0x00, 0x02}; //执行测试页打印 u8 TxBuf_PrintAndForward[] = {ESC, 'J', 0x00}; //打印并进纸 1B 4A n u8 TxBuf_PrintAndForwardNLine[] = {ESC, 'd', 0x00}; //打印并进纸 1B 64 n u8 TxBuf_MoveToNextTablePos[] = {0x09}; //移动打印位置到下一个水平制表位置 HT //字符参数设置命令 u8 TxBuf_SetPrintMode[] = {ESC, '!', 0x00}; //选择打印模式 1B 21 n u8 TxBuf_EnlargeFont[] = {GS, '!', 0x00}; //放大字符 1D 21 n u8 TxBuf_SelectFont[] = {ESC, 'M', 0x00}; //选择字符字体 1B 4D n u8 TxBuf_SetCancelUnderLine[] = {ESC, '-', 0x00}; //设置/取消下划线 1B 2D n u8 TxBuf_SetCancelBold[] = {ESC, 'E', 0x00}; //设定/解除粗体打印 1B 45 n u8 TxBuf_SetCancelOverlapping[] = {ESC, 'G', 0x00}; //设定/解除重叠打印 1B 47 n u8 TxBuf_SetCancelInverse[] = {GS, 'B', 0x00}; //设定/解除反白打印 1D 42 n u8 TxBuf_SetCancelRevolve[] = {ESC, 'V', 0x00}; //设定/取消字符旋转 1B 56 n u8 TxBuf_SetChinesePrintMode[] = {FS, '&'}; //设定汉字打印模式 1C 26 u8 TxBuf_SetChiAsciiMixPrintMode[] = {FS, '.'}; //设置汉字ASCII字符混合打印模式 1C 2E u8 TxBuf_SelInternationalCharacterSets[] = {ESC, 'R', 0x00}; //选择国际字符集 1B 52 n u8 TxBuf_SelCharacterCodePage[] = {ESC, 't', 0x00}; //选择字符代码页 1B 74 n u8 TxBuf_SetCancelReversePrintMode[] = {ESC, '{', 0x00}; //设置/解除颠倒打印模式 1B 7B n //打印排版参数设置命令 u8 TxBuf_SetAbsolutePosition[] = {ESC, '$', 0x00, 0x00}; //设置绝对打印位置 1B 24 nL nH u8 TxBuf_SetHerTabPos[36] = {ESC, 'D'}; //设置水平制表位 ESC D n1…nk NULL ; 1B 44 n1…nk 00 u8 TxBuf_SelDefaultRowSpace[] = {ESC, '2'}; //选择缺省行间距 1B 32 u8 TxBuf_SetRowSpace[] = {ESC, '3', 0x00}; //设置行间距 1B 33 n u8 TxBuf_SetCharSpace[] = {ESC, 0x20, 0x00}; //设置字符间距 1B 20 n u8 TxBuf_SetAlgin[] = {ESC, 'a', 0x00}; //选择对齐方式 1B 61 n u8 TxBuf_SetLeftSpace[] = {GS, 'L', 0x00, 0x00}; //设置左边距 //图形/图象打印命令 u8 TxBuf_PrintBlackWhiteBitMap[] = {ESC, '*', 0x00, 0x00}; //打印黑白位图 ESC * m nL nH d1…dk ; 十六进制码 1B 2A m nL nH d1…dk u8 TxBuf_DefineDownloadBitMap[] = {GS, '*', 0x00, 0x00}; //定义下传位图 ASCII码 GS * x y d1…dk ; 十六进制码 1D 2A x y d1…dk u8 TxBuf_PrintDownloadBitMap[] = {GS, '/', 0x00}; //打印下传位图 ASCII码 GS / n; 十六进制码 1D 2F n u8 TxBuf_PrintPrestoreBitMap[] = {FS, 'p', 0x00, 0x00}; //打印预存储位图 ASCII码 FS p n m; 十六进制码 1C 70 n m //条形码打印命令 u8 TxBuf_SetBarcodeHeight[] = {GS, 'h', 0x00}; //设置条形码高度 1D 68 n u8 TxBuf_SetBarcodeWidth[] = {GS, 'w', 0x00}; //设置条形码宽度 1D 77 n u8 TxBuf_SelBarcodeIdentifyCharPos[] = {GS, 'H', 0x00}; //选择条码可识读字符的打印位置 1D 48 n u8 TxBuf_SelBarcodeIdentifyCharForm[] = {GS, 'f', 0x00}; //选择条码识读字符字体 1D 66 n //打印机状态反馈 u8 TxBuf_GetPrinterStatus[] = {0x10, 0x04, 0x00}; //打印机实时状态传输 ASCII码 DLE EOT n 十六进制码 10 04 n u8 TxBuf_GetSenserStatus[] = {GS, 'r', 0x00}; //传送打印纸传感器状态 ASCII码 GS r n 十六进制码 1D 72 n //切纸器控制 u8 TxBuf_GoAndCut[] = {ESC, 'V', 0x42, 0x00}; //选择切纸模式并切纸 1D 56 m n u8 TxBuf_FullCut[] = {ESC, 'i'}; //全切 1B 69 u8 TxBuf_HalfCut[] = {ESC, 'm'}; //半切 1B 6D //*********************************************** static u8 cRxDone = 0; //串口收到数据 static u8 cRxData; //串口数据 //*********************************************** void DevPrintRxByte(u8 rxDat) { cRxData = rxDat; cRxDone = 1; } // 打印机初始化 // ESC @ // [描述] 清除打印缓冲区中的数据,复位打印机打印参数到当打印机缺省参数。 // [注意] 不是完全恢复到出厂设置,用户参数设置不会被更改。 void InitPrinter(void) { UartSendNBytes(UartPrint, TxBuf_InitPrinter, sizeof(TxBuf_InitPrinter)); } // 打印并走纸到下页首 // 0x0C // [描述] 将打印缓冲区中的数据全部打印出来。 // [注意] 打印后,删除打印缓冲区中的数据。 // 该命令设置打印位置为行的起始点。 void PrintAndNewPage(void) { UartSendNBytes(UartPrint, TxBuf_PrintAndNewPage, sizeof(TxBuf_PrintAndNewPage)); } // 打印并换行 // 0x0A // [描述] 把打印缓冲区中的数据打印出来,并且按照当前行间距,并换行。 // [注意] 该命令把打印位置设置为行的开始位置。 void PrintAndNewLine(void) { UartSendNBytes(UartPrint, TxBuf_PrintAndNewLine, sizeof(TxBuf_PrintAndNewLine)); } // 执行测试页打印 // 0x1D, 0x28, 0x41, 0x02, 0x00, 0x00, 0x02 // [描述] 打印测试页,跟上电自检测试打印一样的内容。 // [注意] 打印结束后,将下一行的开始设定为打印起始位置。 void PrintTest(void) { UartSendNBytes(UartPrint, TxBuf_PrintTest, sizeof(TxBuf_PrintTest)); } // 打印并进纸 // ESC J n // [范围] 0 ≤ n ≤ 255 // [描述] 打印输出打印缓冲区中的数据,并进纸n个 垂直点距。 // [注意] 打印结束后,将下一行的开始设定为打印起始位置。 // 一个垂直点距为0.125mm, 例如dat=8,则走纸8*0.125=1mm。 void PrintAndForward(u8 dat) { TxBuf_PrintAndForward[2] = dat; UartSendNBytes(UartPrint, TxBuf_PrintAndForward, sizeof(TxBuf_PrintAndForward)); } // 打印并进纸 n行 // ESC d n // [范围] 0 ≤ n ≤ 255 // [描述] 打印打印缓冲区中的数据并进纸n字符行。 // [注意] 该命令设置打印起始位置为行起点。 void PrintAndForwardNLine(u8 nLine) { TxBuf_PrintAndForwardNLine[2] = nLine; UartSendNBytes(UartPrint, TxBuf_PrintAndForwardNLine, sizeof(TxBuf_PrintAndForwardNLine)); } // 移动打印位置到下一个水平制表位置 // 0x09 // [描述] 移动打印位置到下一个水平制表位置。 // [注意] 通过ESC D命令设置水平制表位的位置。 // 如果没有设置下一个水平制表位置,则该命令被忽略。 void MoveToNextTablePos(void) { UartSendNBytes(UartPrint, TxBuf_MoveToNextTablePos, sizeof(TxBuf_MoveToNextTablePos)); } // 0x1B,0x21,n ESC ! n 选择打印模式 // [范围] 0 ≤ n ≤ 255 // [注意] 本命令对英数字符和汉字都有效 //#define CHAR_FONT_12_24 0x00 //字符字型A (12*24) //#define CHAR_FONT_9_17 0x01 //字符字型B (9*17) //#define EMPHASIS_MODE_ON 0x08 //加粗模式 //#define DOUBLE_HEIGHT_MODE 0x10 //倍高模式 //#define DOUBLE_WIDTH_MODE 0x20 //倍宽模式 //#define UNDERLINE_MODE 0x80 //下划线 //sMode可以是以上的或值 void SetPrintMode(u8 sMode) { //u8 TxData[] = {ESC, '!', 0x00}; TxBuf_SetPrintMode[2] = sMode; UartSendNBytes(UartPrint, TxBuf_SetPrintMode, sizeof(TxBuf_SetPrintMode)); } //#define CHAR_FONT_9_17 0x01 //字符字型B (9*17) //#define EMPHASIS_MODE_ON 0x08 //加粗模式 //#define DOUBLE_HEIGHT_MODE 0x10 //倍高模式 //#define DOUBLE_WIDTH_MODE 0x20 //倍宽模式 //#define UNDERLINE_MODE 0x80 //下划线 //cMode可以是以上的任意值 void CancelPrintMode(u8 cMode) { TxBuf_SetPrintMode[2] &= ~cMode; UartSendNBytes(UartPrint, TxBuf_SetPrintMode, sizeof(TxBuf_SetPrintMode)); } // 0x1D,0x21,n GS ! n 放大字符 // [范围] 0 ≤ n ≤ 255(1 ≤垂直倍数≤ 2, 1 ≤ 水平倍数≤ 8) // [描述] 用位0~3位选择字符高度,用位4~7位选择字符宽度 //#define HEIGHT_1TIMES 0x00 //1倍高度 //#define HEIGHT_2TIMES 0x01 //2倍高度 //#define HEIGHT_3TIMES 0x02 //3倍高度 //#define HEIGHT_4TIMES 0x03 //4倍高度 //#define HEIGHT_5TIMES 0x04 //5倍高度 //#define HEIGHT_6TIMES 0x05 //6倍高度 //#define HEIGHT_7TIMES 0x06 //7倍高度 //#define HEIGHT_8TIMES 0x07 //8倍高度 //#define WIDTH_1TIMES 0x00 //1倍宽度 //#define WIDTH_2TIMES 0x10 //2倍宽度 //value可以是以上高度和宽度的或值 void EnlargeFont(u8 value) { TxBuf_EnlargeFont[2] = value; UartSendNBytes(UartPrint, TxBuf_EnlargeFont, sizeof(TxBuf_EnlargeFont)); } //0x1D,0x21 GS ! //设置字符大小 void SetFontSize(u8 cWidth, u8 cHeight) { u8 TxData[3]; //参数保护 if(cWidth > 15) cWidth = 15; if(cHeight > 15) cHeight = 15; //配置 TxData[0] = GS; TxData[1] = '!'; TxData[2] = (cWidth<<4) | cHeight; //高位为字宽,低位为字高. UartSendNBytes(UartPrint, TxData, sizeof(TxData)); } //[名称]选择字符字体 //[格式] ASCII码 ESC M n; 十六进制码 1B 4D n //[范围] n = 0, 1, 16, 17,18,19 // #define FONT_12_24 0x00 //西文字符(半宽)字体(12×24) // #define FONT_8_16 0x01 //西文字符(半宽)字体(8×16) // #define FONT_24_24 16 //简体汉字字符字体24×24 // #define FONT_16_16 17 //简体汉字字符字体16×16 // fontType可以是以上任意值 void SelectFont(u8 fontType) { TxBuf_SelectFont[2] = fontType; UartSendNBytes(UartPrint, TxBuf_SelectFont, sizeof(TxBuf_SelectFont)); } // [名称] 设置/取消下划线 // [格式] ASCII码 ESC – n; 十六进制码 1B 2D n // [范围] 0 ≤ n ≤ 2 // n(十进制) 意义 宏定义 // 0 解除下划线模式 UNDER_LINE_MODE_CANCEL // 1 设定下划线模式(1 点粗) UNDER_LINE_MODE_1POINT // 2 设定下划线模式(2 点粗) UNDER_LINE_MODE_2POINT void SetCancelUnderLineMode(u8 sMode) { TxBuf_SetCancelUnderLine[2] = sMode; UartSendNBytes(UartPrint, TxBuf_SetCancelUnderLine, sizeof(TxBuf_SetCancelUnderLine)); } // [名称] 设定/解除粗体打印 // [格式] ASCII码 ESC E n; 十六进制码 1B 45 n // [范围] 0 ≤ n ≤ 255 // [描述] 设定或解除粗体打印模式。 // 当n 的最低位(LSB)为0时,解除粗体打印模式。 OVERLAP_MODE_CANCEL // 当n 的最低位(LSB)为1时,设定粗体打印模式。 OVERLAP_MODE_SET // [注意] 仅n 的最低有效位允许使用。 // 使用ESC !也可以设置或取消粗体模式。最后接收的命令设定有效。 void SetCancelBold(u8 sta) { TxBuf_SetCancelBold[2] = sta; UartSendNBytes(UartPrint, TxBuf_SetCancelBold, sizeof(TxBuf_SetCancelBold)); } // [名称] 设定/解除重叠打印 // [格式] ASCII码 ESC G n; 十六进制码 1B 47 n // [范围] 0 ≤ n ≤ 255 // [描述] 设定或解除重叠打印模式。 // 当n 的最低有效位(LSB)为0时,解除重叠打印模式。 OVERLAP_MODE_CANCEL // 当n 的最低有效位(LSB)为1时,设定重叠打印模式。 OVERLAP_MODE_SET // [注意] 仅n 的最低有效位允许使用。 // 在重叠模式和粗体模式中打印机输出是相同的。 void SetCancelOverlapping(u8 sta) { TxBuf_SetCancelOverlapping[2] = sta; UartSendNBytes(UartPrint, TxBuf_SetCancelOverlapping, sizeof(TxBuf_SetCancelOverlapping)); } // [名称] 设定/解除反白打印 // [格式] ASCII码 GS B n; 十六进制码 1D 42 n // [范围] 0 ≤ n ≤ 255 // [描述] 设定或解除反白打印模式。 // 当n 的最低有效位(LSB)为0时,解除反白打印模式。 INVERSE_MODE_CANCEL // 当n 的最低有效位(LSB)为1时,设定反白打印模式。 INVERSE_MODE_SET // [注意] 仅n 的最低有效位允许使用。 // 该命令不影响位图,条形码,HRI字符。 void SetCancelInverse(u8 sta) { TxBuf_SetCancelInverse[2] = sta; UartSendNBytes(UartPrint, TxBuf_SetCancelInverse, sizeof(TxBuf_SetCancelInverse)); } // [名称] 设定/取消字符旋转 // [格式] ASCII码 ESC V n; 十六进制码 1B 56 n // N(十进制) 意义 宏定义 // 0 解除旋转模式 REVOLVE_MODE_CANCEL // 1 设置90°顺时针旋转模式 REVOLVE_MODE_90_DEGREE_CLOCKWISE // [注意] 当设置了下划线模式时,对于顺时针90旋转的字符,打印机不加下划线。 // 在旋转模式下,倍宽和倍高命令放大字符的方向与一般模式下倍高倍宽命令放大字符的 // 方向相反。 // [缺省值] n = 0 void SetCancelRevolve(u8 sta) { TxBuf_SetCancelRevolve[2] = sta; UartSendNBytes(UartPrint, TxBuf_SetCancelRevolve, sizeof(TxBuf_SetCancelRevolve)); } // [名称] 设定汉字打印模式 // [格式] ASCII码 FS & ; 十六进制码 1C 26 // [描述] 选择汉字字符模式 // [注意] 该命令仅在选择GB18030编码系统时有效。 void SetChinesePrintMode(void) { UartSendNBytes(UartPrint, TxBuf_SetChinesePrintMode, sizeof(TxBuf_SetChinesePrintMode)); } // [名称] 设置汉字ASCII字符混合打印模式 // [格式] ASCII码 FS . ; 十六进制码 1C 2E // [描述] 选择汉字ASCII字符混合模式 // [注意] 该命令仅在选择GB18030编码系统时有效。 void SetChiAsciiMixPrintMode(void) { UartSendNBytes(UartPrint, TxBuf_SetChiAsciiMixPrintMode, sizeof(TxBuf_SetChiAsciiMixPrintMode)); } // [名称] 选择国际字符集 // [格式] ASCII码 ESC R n ; 十六进制码 1B 52 n // [范围] 0<= n <= 13 // #define CHAR_SETS_USA 0 //美国 // #define CHAR_SETS_FRA 1 //法国 // #define CHAR_SETS_GER 2 //德国 // #define CHAR_SETS_GBR 3 //英国 // #define CHAR_SETS_DEN1 4 //丹麦 // #define CHAR_SETS_SWE 5 //瑞典 // #define CHAR_SETS_ITA 6 //意大利 // #define CHAR_SETS_ESP1 7 //西班牙 // #define CHAR_SETS_JPN 8 //日本 // #define CHAR_SETS_NOR 9 //挪威 // #define CHAR_SETS_DEN2 10 //丹麦 // #define CHAR_SETS_ESP2 11 //西班牙 // #define CHAR_SETS_LATIN 12 //拉丁美洲 // #define CHAR_SETS_KOR 13 //韩国 void SelInternationalCharacterSets(u8 type) { TxBuf_SelInternationalCharacterSets[2] = type; UartSendNBytes(UartPrint, TxBuf_SelInternationalCharacterSets, sizeof(TxBuf_SelInternationalCharacterSets)); } // [名称] 选择字符代码页 // [格式] ASCII码 ESC t n ; 十六进制码 1B 74 n // [范围] 0<= n <= 5 16<= n <= 19 n=255 void SelCharacterCodePage(u8 type) { TxBuf_SelCharacterCodePage[2] = type; UartSendNBytes(UartPrint, TxBuf_SelCharacterCodePage, sizeof(TxBuf_SelCharacterCodePage)); } // [名称] 设置/解除颠倒打印模式 // [格式] ASCII码 ESC { n ; 十六进制码 1B 7B n // [范围] 0<= n <= 255 // [描述] 设置或解除颠倒打印模式 // [注意] 仅n的最低位有效 // #define REVERSE_PRINT_MODE_CANCEL 0x00 //解除颠倒打印模式 // #define REVERSE_PRINT_MODE_SET 0x01 //设定颠倒打印模式 void SetCancelReversePrintMode(u8 sta) { TxBuf_SetCancelReversePrintMode[2] = sta; UartSendNBytes(UartPrint, TxBuf_SetCancelReversePrintMode, sizeof(TxBuf_SetCancelReversePrintMode)); } // [名称] 设置绝对打印位置 // [格式] ASCII 码 ESC $ nL nH ; 十六进制码 1B 24 nL nH // [范围] // 0 ≤ nL ≤ 255 // 0 ≤ nH ≤ 255 // [描述] 设定从一行的开始到将要打印字符的位置之间的距离。 // 从一行的开始到打印位置的距离为 // [(nL + nH*256)*0.125 毫米] 。 void SetAbsolutePosition(u8 nL, u8 nH) { TxBuf_SetAbsolutePosition[2] = nL; TxBuf_SetAbsolutePosition[3] = nH; UartSendNBytes(UartPrint, TxBuf_SetAbsolutePosition, sizeof(TxBuf_SetAbsolutePosition)); } // [名称] 设置水平制表位 // [格式] ASCII码 ESC D n1…nk NULL ; 十六进制码 1B 44 n1…nk 00 // [范围] 1 ≤ n ≤ 255 0 ≤ k ≤ 32 // [描述] 设置水平定位位置。 // n 指定从一行开始的列号,用来设置水平定位位置。 // k 表示将被设置水平定位点的总数。 void SetHerTabPos(int n1, ...) { u8 temp[32]={0}; va_list arg_ptr; //申请一个变量 int nArgValue = n1; u8 nArgCout=0; //可变参数的数目 u8 totLen=0; temp[0] = (u8)nArgValue; va_start(arg_ptr,n1); //以最后一个固定参数的地址为起点确定变参的内存起始地址。 do { ++nArgCout; if(nArgCout >= 32) { return; } nArgValue = va_arg(arg_ptr, int); //得到下一个可变参数的值 temp[nArgCout] = (u8)nArgValue; }while(nArgValue != -1); va_end(arg_ptr); memcpy((char*)&TxBuf_SetHerTabPos[2], &temp[0], nArgCout); TxBuf_SetHerTabPos[2+nArgCout] = NULL; totLen = 2+nArgCout+1; UartSendNBytes(UartPrint, TxBuf_SetHerTabPos, totLen); return; } // [名称] 选择缺省行间距 // [格式] ASCII码 ESC 2 ; 十六进制码 1B 32 // [描述] 将当前字符行间距设置为缺省行间距:1mm(8个垂直点距)。 // [注意] 该命令将影响图片与字符之间的行间距。 void SelDefaultRowSpace(void) { UartSendNBytes(UartPrint, TxBuf_SelDefaultRowSpace, sizeof(TxBuf_SelDefaultRowSpace)); } // [名称] 设置行间距 // [格式] ASCII码 ESC 3 n ; 十六进制码 1B 33 n // [范围] 0 ≤ n ≤ 255 // [描述] 设置字符行间距为n个垂直点距。 间距 = n * 0.125(mm) // [注意] 该命令将影响图片与字符之间的行间距。 // [缺省值] n = 8 void SetRowSpace(u8 value) { TxBuf_SetRowSpace[2] = value; UartSendNBytes(UartPrint, TxBuf_SetRowSpace, sizeof(TxBuf_SetRowSpace)); } // [名称] 设置字符间距 // [格式] ASCII码 ESC SP n ; 十六进制码 1B 20 n // [范围] 0 ≤ n ≤ 255 // [描述] 设置字符右侧的间距为n 个水平点距。 // [注意] 在倍宽模式下,字符右侧间距是正常值的两倍。当字符被放大时,字符右侧间距被放大同样的倍数。 // 该命令同时影响英文和汉字字符的设定。 void SetCharSpace(u8 value) { TxBuf_SetCharSpace[2] = value; UartSendNBytes(UartPrint, TxBuf_SetCharSpace, sizeof(TxBuf_SetCharSpace)); } // [名称] 选择对齐方式 // [格式] ASCII码 ESC a n ; 十六进制码 1B 61 n // [范围] 0 ≤ n ≤ 2 // [描述] 将一行数据按照n指定的位置对齐。 // #define DT_LEFT 0 // #define DT_CENTER 1 // #define DT_RIGHT 2 void SetAlgin(u8 cFormat) { //u8 TxData[] = {ESC, 'a', 0x00}; TxBuf_SetAlgin[2] = cFormat; UartSendNBytes(UartPrint, TxBuf_SetAlgin, sizeof(TxBuf_SetAlgin)); } // [名称] 设置左边距 // [格式] ASCII码 GS L nL nH ; 十六进制码 1D 4C nL nH // [范围] 0 ≤ nL ≤ 255 0 ≤ nH ≤ 255 // [描述] 左边距设置为N个 水平点距。N=nL+nH*256,左边距为可打印区域左边距离打印区域宽度。 void SetLeftSpace(u8 nL, u8 nH) { TxBuf_SetLeftSpace[2] = nL; TxBuf_SetLeftSpace[3] = nH; UartSendNBytes(UartPrint, TxBuf_SetLeftSpace, sizeof(TxBuf_SetLeftSpace)); } // [名称] 打印黑白位图 // [格式] ASCII码 ESC * m nL nH d1…dk // 十六进制码 1B 2A m nL nH d1…dk // 十进制码 27 42 m nL nH d1…dk // [范围] m = 0, 1, 32, 33 // 0 ≤ nL ≤ 255 // 0 ≤ nH ≤ 1 // 0 ≤ d ≤ 255 // [描述] 本命令只能打印高度为8点或24点,宽度不超过可打印区域的黑白位图。 // 各参数含义如下: // 用m 选择位图的模式,位图的水平方向点数由nL 和nH 指定,如下所示: // // m 垂直点数(高度) 倍宽模式 // 0 8 两倍宽 // 1 8 单倍宽 // 32 24 两倍宽 // 33 24 单倍宽 // #define BIP_MAP_MODE_8HEIGHT_2WIDTH 0 //8点高度,两倍宽 // #define BIP_MAP_MODE_8HEIGHT_1WIDTH 1 //8点高度,单倍宽 // #define BIP_MAP_MODE_24HEIGHT_2WIDTH 32 //24点高度,两倍宽 // #define BIP_MAP_MODE_24HEIGHT_1WIDTH 33 //24点高度,单倍宽 // // nL nH分别为无符号型双字节整数N的高位和低位字节,表示水平方向上位图中的点数。N在 // 单倍宽时最大值为384,在双倍宽时其值最大为192。 // d1~dk 表示位图数据 void PrintBlackWhiteBitMap(u8 mMode, u8 horDotL, u8 horDotH, char *pBitMapStr, u8 cLen) { u8 i8, j8; char *pData; //参数保护 if((pBitMapStr == 0) || (cLen == 0)) return; //复制打印内容 pData = (char*)malloc(cLen+5); // j8 = 0; pData[j8++] = 0x1B; //ESC pData[j8++] = '*'; pData[j8++] = mMode; //位图的模式 pData[j8++] = horDotL; //图象宽度 pData[j8++] = horDotH; i8 = 0; while (i8 < cLen) { pData[j8++] = *pBitMapStr++; i8++; } //发送数据 UartSendNBytes(UartPrint, (u8*)pData, j8); //释放内存 free(pData); } // [名称] 定义下传位图 // [格式] ASCII码 GS * x y d1…dk // 十六进制码 1D 2A x y d1…dk // 十进制码 29 42 x y d1…dk // [范围] 1 ≤ x ≤ 255 // 1 ≤ y ≤ 8 // 0 ≤ d ≤ 255 // k=x*y*8 // [描述] 用x 和y 指定的点数定义下传位图。 // x*8 为水平方向点数。 // y*8 为垂直方向点数。 // [注意] 如果x * y 超出了指定范围,则禁止该命令。 // d 表示位图数据。数据(d) 指定打印位为1,不打印位为0。 // 用该命令定义的下传位图,通过 GS / n命令打印 // 在下列情况下,清除下传位图定义: // 1. 执行ESC @ 。 // 2. 打印机复位或关闭电源。 void DefineDownloadBitMap(u8 x, u8 y, char *pBitMapStr, u8 cLen) { u8 i8, j8; char *pData; //参数保护 if((pBitMapStr == 0) || (cLen == 0)) return; //复制打印内容 pData = (char*)malloc(cLen+4); // j8 = 0; pData[j8++] = 0x1D; //GS pData[j8++] = '*'; pData[j8++] = x; //x*8 为水平方向点数 pData[j8++] = y; //y*8 为垂直方向点数 i8 = 0; while (i8 < cLen) { pData[j8++] = *pBitMapStr++; i8++; } //发送数据 UartSendNBytes(UartPrint, (u8*)pData, j8); //释放内存 free(pData); } // [名称] 打印下传位图 // [格式] ASCII码 GS / n // 十六进制码 1D 2F n // 十进制码 29 47 n // [范围] 0 ≤ n ≤ 3 // [描述] 用n 指定的模式打印由GS *命令定义的下传位图。 // n从下表选择模式: // n 放大模式 // 0 普通 // 1 倍宽 // 2 倍高 // 3 倍宽倍高 // #define BIP_MAP_MODE_NORMAL 0x00 //普通 // #define BIP_MAP_MODE_DOUBLE_WIDTH 0x01 //倍宽 // #define BIP_MAP_MODE_DOUBLE_HEIGHT 0x02 //倍高 // #define BIP_MAP_MODE_DOUBLE_WIDTH_HEIGHT 0x03 //倍宽倍高 // [注意] 如果位图数据未定义,则忽略该命令。 // 该命令不受打印模式(粗体、重叠、下划线、字符大小、或反白打印)影响。 void PrintDownloadBitMap(u8 sMode) { TxBuf_PrintDownloadBitMap[2] = sMode; UartSendNBytes(UartPrint, TxBuf_PrintDownloadBitMap, sizeof(TxBuf_PrintDownloadBitMap)); } // [名称] 打印预存储位图 // [格式] ASCII码 FS p n m // 十六进制码 1C 70 n m // [范围] 0 ≤ n ≤ 4 // [描述] 本命令打印预先存储在打印机非易失存储器中的2值位图。打印机非易失存储器中的 // 位图可通过PC机上的专用工具软件生成并写入,位图宽度最大为128,最大高度为64。 // n为指定的位图编号 。 // [注意] 指定编号的位图还未定义时,该命令无效。 // 位图必须是2值位图。 // 该命令不受打印模式(粗体、重叠、下划线、字符大小、或反白打印)影响。 void PrintPrestoreBitMap(u8 bitMapNum) { TxBuf_PrintPrestoreBitMap[2] = bitMapNum; UartSendNBytes(UartPrint, TxBuf_PrintPrestoreBitMap, sizeof(TxBuf_PrintPrestoreBitMap)); } // [名称] 设置条形码高度 // [格式] ASCII码 GS h n ; 十六进制码 1D 68 n // [范围] 1 ≤ n ≤ 40 // [描述] 选择条形码高度。 // n 设定垂直方向的点数。 // [注意] 如果n>40,条码高度将被设为40。 // [缺省值] n = 36 void SetBarcodeHeight(u8 value) { TxBuf_SetBarcodeHeight[2] = value; UartSendNBytes(UartPrint, TxBuf_SetBarcodeHeight, sizeof(TxBuf_SetBarcodeHeight)); } // [名称] 设置条形码宽度 // [格式] ASCII码 GS w n; 十六进制码 1D 77 n // [范围] 1 ≤ n ≤ 4 // [描述] 设置条形码水平尺寸。 // n 取值定义如下: // ----------------------------------------------------------- // | N 多级条形码单位宽度(mm)| 二进制条码宽度 | // | | 窄条线宽度 宽条线宽度 | // ----------------------------------------------------------- // | 1 0.125 | 0.125 0.25 | // | 2 0.25 | 0.25 0.50 | // | 3 0.375 | 0.375 0.75 | // | 4 0.50 | 0.50 1.0 | // ----------------------------------------------------------- // 以下是多级条形码: // UPC-A, UPC-E, EAN13, EAN8, CODE93 // 以下是二进制条形码: // CODE39, CODABAR // [缺省值] n = 2 void SetBarcodeWidth(u8 value) { TxBuf_SetBarcodeWidth[2] = value; UartSendNBytes(UartPrint, TxBuf_SetBarcodeWidth, sizeof(TxBuf_SetBarcodeWidth)); } // [名称] 选择条码可识读字符的打印位置 // [格式] ASCII码 GS H n ; 十六进制码 1D 48 n // [范围] 0 ≤ n ≤ 2 // [描述] 打印条形码时,选择可识读字符的打印位置。 // n=0 不打印 // n=1 条形码上方 // n=2 条形码下方 // [注意] 用GS f 所指定的字体打印可识读字符。 // 条码可识读字符不受打印模式(粗体、重叠、下划线、字符大小、或反白打印)影响。 // [缺省值] n = 0 void SelBarcodeIdentifyCharPos(u8 value) { TxBuf_SelBarcodeIdentifyCharPos[2] = value; UartSendNBytes(UartPrint, TxBuf_SelBarcodeIdentifyCharPos, sizeof(TxBuf_SelBarcodeIdentifyCharPos)); } // [名称] 选择条码识读字符字体 // [格式] ASCII码 GS f n ; 十六进制码 1D 66 n // [范围] n = 0, 1 // [描述] 打印条形码时,为识读字符选择一种字体。 // n=0 字体A (12 * 24) // n=1 字体B (8 * 16) // [注意] 在由GS H 指定的位置打印条码识读字符。 // 条码识读字符不受打印模式(粗体、重叠、下划线、字符大小、或反白打印)影响。 // [缺省值] n = 0 void SelBarcodeIdentifyCharForm(u8 value) { TxBuf_SelBarcodeIdentifyCharForm[2] = value; UartSendNBytes(UartPrint, TxBuf_SelBarcodeIdentifyCharForm, sizeof(TxBuf_SelBarcodeIdentifyCharForm)); } //*********************************************** //设置条码字符位置和字体 //nPosition=0, 不打印 //nPosition=1, 在条形码上方 //nPosition=2, 在条形码下方 //nPosition=3, 在条形码上方及下方 //nFont=0,字体 A (12 * 24) //nFont=1, 字体 B (9 * 17) void SetBarCodeHRI(u8 cPosition, u8 cFont) { u8 TxData[] = {GS,'H',0x00}; //设置条形码字符位置 TxData[2] = cPosition; UartSendNBytes(UartPrint, TxData, sizeof(TxData)); //设置字体大小 TxData[1] = 'f'; TxData[2] = cFont; UartSendNBytes(UartPrint, TxData, sizeof(TxData)); } //设置条码大小 // cWidth = 2~6 [4] // cHeight [96] void SetBarCodeSize(u8 cWidth, u8 cHeight) { u8 TxData[] = {GS,'w',0x00}; //条形码宽度 TxData[2] = cWidth; UartSendNBytes(UartPrint, TxData, sizeof(TxData)); //条形码高度 TxData[1] = 'h'; TxData[2] = cHeight; UartSendNBytes(UartPrint, TxData, sizeof(TxData)); } // [名称] 打印条码 // [格式] 该命令有两种格式: // 格式1(0 ≤ m ≤ 8) // ASCII码 GS k m d1…dk NUL // 十六进制码 1D 6B m d1…dk 00 // 十进制码 29 107 m d1…dk 0 // 格式2(65 ≤ m ≤ 73) // ASCII码 GS k m n d1…dn // 十六进制码 1D 6B m n d1…dn // 十进制码 29 107 m n d1…dn // [范围] 0 ≤ m ≤ 8 (k 和d 取决于使用的条码系统) // 65 ≤ m ≤ 73 (n 和d取决于使用的条码系统) // n为打印条码的数据长度 // // 使用格式2 // GS k m n d1 ... dn N指定数据个数 void PrintBarCode128(char *pStr, u8 cLen) { u8 i8, j8; char *pData; //参数保护 if((pStr == 0) || (cLen == 0)) return; //复制打印内容 pData = (char*)malloc(cLen+6); // //命令 j8 = 0; pData[j8++] = GS; pData[j8++] = 'k'; //k pData[j8++] = 73; //使用格式2: m = 73 ——> code128 pData[j8++] = cLen+2; //长度+2 (2个字节描述字符集,即下面的'{'和'B') pData[j8++] = '{'; pData[j8++] = 'B'; //CODE-B = 0x20~0x7f i8 = 0; while (i8 < cLen) { pData[j8++] = *pStr++; i8++; } //发送数据 UartSendNBytes(UartPrint, (u8*)pData, j8); //释放内存 free(pData); } //打印条码 // 使用格式1 // GS k m d1 ... dk NULL void PrintBarCode39(char *pStr, u8 cLen) { u8 i8, j8; char *pData; //char buf[40]={0}; //参数保护 if((pStr == 0) || (cLen == 0)) return; //复制打印内容 pData = (char*)malloc(cLen+4); //命令 j8 = 0; pData[j8++] = GS; //buf[j8++] = GS; pData[j8++] = 'k'; //k //buf[j8++] = 'k'; pData[j8++] = 4; //使用格式1: m = 4 ——> code39 //buf[j8++] = 4; i8 = 0; while (i8 < cLen) { pData[j8++] = *pStr++; //buf[j8++] = *pStr++; i8++; } pData[j8++] = NULL; // //buf[j8++] = NULL; //发送数据 UartSendNBytes(UartPrint, (u8*)pData, j8); //UartSendNBytes(UartPrint, (u8*)buf, j8); //释放内存 free(pData); } // [名称] 选择切纸模式并切纸 // [格式] ①ASCII码GS V m // 十六进制码1D 56 m // 十进制码29 86 m // ②ASCII码GS V m n // 十六进制码1D 56 m n // 十进制码29 86 m n // [范围] ① m = 1, 49 // ② m = 66, 0 <=n <=255 // [对②的详细说明] // ·n = 0时, 打印机进纸到切纸位置,并切纸。 // ·n >0时, 打印机进纸到(切纸位置 + [n * 0.125 毫米 {0.0049英寸}])并切纸。 // ·用DIP拨动开关1-1将BM 传感器设置为有效时,进纸到(黑标偏移所设置的值)。 void GoAndCutPaper(u8 cMM) { TxBuf_GoAndCut[3] = cMM; UartSendNBytes(UartPrint, TxBuf_GoAndCut, sizeof(TxBuf_GoAndCut)); } // [名称] 全切 // [格式] ASCII码 ESC i ; 十六进制码 1B 69 // [描述] 全切纸 void FullCutPage(void) { UartSendNBytes(UartPrint, TxBuf_FullCut, sizeof(TxBuf_FullCut)); } // [名称] 半切 // [格式] ASCII码 ESC m ; 十六进制码 1B 6D // [描述] 半切纸 void HalfCutPage(void) { UartSendNBytes(UartPrint, TxBuf_HalfCut, sizeof(TxBuf_HalfCut)); } //打印字符串(自动回车) //sMode = 0, 不自动换行.如果pStr所指的字符串本身包含有换行符"\r\n", 则也自动换行。 //sMode = 1, 自动换行 void PrintString(char *pStr, u8 cLen, u8 sMode) { u8 i8; char *pData; //参数保护 if((pStr == 0) || (cLen == 0)) { PrintAndNewLine(); //打印空行 return; } //复制打印内容 if(sMode == 0) { pData = (char*)malloc(cLen); } else if(sMode == 1) { pData = (char*)malloc(cLen+2); } for (i8=0; i8<cLen; i8++) { pData[i8] = pStr[i8]; } if(sMode == 1) { //回车换行 pData[cLen] = 0x0D; pData[cLen+1] = 0x0A; } if(sMode == 0) { UartSendNBytes(UartPrint, (u8*)pData, cLen); } else if(sMode == 1) { UartSendNBytes(UartPrint, (u8*)pData, (cLen+2)); } //释放内存 free(pData); } //*********************************************** //0x10 0x04 DLE EOT n //实时状态传送 //n = 1: 传送打印机状态 //n = 2: 传送脱机状态 //n = 3: 传送错误状态 //n = 4: 传送卷纸传感器状态 u8 GetPrinterStatus(u8 cType) { u8 ret; //参数保护 if((cType < 1) || (cType > 4)) return 0xff; //设置要查询的类型 TxBuf_GetPrinterStatus[2] = cType; UartSendNBytes(UartPrint, TxBuf_GetPrinterStatus, sizeof(TxBuf_GetPrinterStatus)); //等待串口返回数据 ret = 0xfe; ret = UART1_RevData(UartPrint); return ret; } // [名称] 传输状态 // [格式] ASCII码 GS r n // 十六进制码 1D 72 n // [范围] n = 1,49 // [描述] 传送打印纸传感器状态 u8 GetSenserStatus(u8 cType) { u8 ret; //参数保护 if((cType != 1) && (cType != 49)) return 0xff; //设置要查询的类型 TxBuf_GetSenserStatus[2] = cType; UartSendNBytes(UartPrint, TxBuf_GetSenserStatus, sizeof(TxBuf_GetSenserStatus)); //等待串口返回数据 ret = 0xfe; ret = UART1_RevData(UartPrint); return ret; } /*****************************************************************************************************/ void App_PrinterTest(void) { //SetHerTabPos(1, 2, 11, 13, 27, 29, -1); // PrintTest(); /* char *str; u8 len; str = "文化体育业专用发票"; len = strlen(str); PrintString(str, len, 0); PrintAndNewLine(); // 打印并换行 SetAbsolutePosition(80, 0);//从一行的开始到打印位置的距离为 [(nL + nH*256)*0.125 毫米] 。 str = "发 票 联"; len = strlen(str); PrintString(str, len, 0); // SetCharSpace(10); PrintAndNewLine(); // 打印并换行 SetHerTabPos(11, 13, 27, 29, -1); PrintString("数学", 4, 0); */ ///////////////////////////////////////////////////////////////////// /////////////////// 智能停车场小票打印测试:start ////////////////// ///////////////////////////////////////////////////////////////////// char *str; u8 len; str = " "; len = strlen(str); PrintString(str, len, 0); PrintAndForward(8); //打印空白,并走纸8*0.125=1mm。 //打印预存储位图 PrintPrestoreBitMap(1); //打印编号1的位图 //PrintPrestoreBitMap(2); //打印编号2的位图 //PrintAndNewLine(); // 打印并换行 PrintAndForward(8);//打印空白,并走纸8*0.125=1mm str = "深圳市高斯捷科技有限公司"; len = strlen(str); PrintString(str, len, 0); PrintAndNewLine(); // 打印并换行 str = "智能停车场管理系统"; len = strlen(str); PrintString(str, len, 0); //PrintAndNewLine(); // 打印并换行 PrintAndForwardNLine(2); //打印并走纸两行 str = "入场时间:2014-10-23 15:47:30"; len = strlen(str); PrintString(str, len, 0); PrintAndNewLine(); // 打印并换行 str = "出场时间:2014-10-23 18:47:30"; len = strlen(str); PrintString(str, len, 0); PrintAndNewLine(); // 打印并换行 str = "收费金额:30元10角5分"; len = strlen(str); PrintString(str, len, 0); //PrintAndNewLine(); // 打印并换行 PrintAndForwardNLine(1); //打印并走纸一行 //str = "123456789"; //str = "WWW.BAIDU.COM"; str = "www.gos-system.com"; len = strlen(str); SetBarcodeHeight(40); SetBarcodeWidth(2); SelBarcodeIdentifyCharPos(2); //选择条码可识读字符的打印位置 条形码下方 SelBarcodeIdentifyCharForm(0); //选择条码识读字符字体 12*24 //PrintBarCode39(str, len); //CODE39码不能打印小写字母 PrintBarCode128(str, len); //CODE128-B码能打印小写字母 PrintAndForward(160);//打印空白,并走纸160*0.125=20mm 不加这句的话,就导致先切纸,再打印条码的现象. FullCutPage(); //切纸 ///////////////////////////////////////////////////////////////////// ///////////////////// 智能停车场小票打印测试:end //////////////////// ///////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////// /////////////////// 获取状态:start ////////////////// ///////////////////////////////////////////////////////////////////// /* u8 printerSta=0; printerSta = GetPrinterStatus(4); printerSta = printerSta; */ ///////////////////////////////////////////////////////////////////// /////////////////// 获取状态:end ////////////////// ///////////////////////////////////////////////////////////////////// }