TM-300A/B(epson) 调用软字库实现汉字的打印 TM-300A/B(epson) 调用软字库实现汉字的打印有现成的例子最好了,用的是16*16的点阵字库. [email protected] [email protected] 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 一般来说都能通过 ESC 命令选择是否使用打印机的硬字库。找本说明书看看。 to pazee(耙子): 对呀,是使用ESC * 的,但是在TM300A/B 的这种打印机中是没有汉字库的,要是有的话那就好了, 而它打出来的汉字也是以图象的方式业处理的.你能给我一个例子那是最好的了. 这类打印机通常有2种方式,文本方式(自带字库)和图形模式(所有内容都是windows发来的点阵)windows下可以使用windows的字体呀!不过这种方式是以图像方式的,速度会稍慢。至于字体的大小应该不是问题,24针打印机用的基本都是24*24点阵的。9针的一般用16点阵 你怎么自己往串口送数据?没有打印机驱动吗?你应该是在Delphi下面操作吧? 另外,我曾经看过一个ESC的指令集,非常详细,但是现在无从找到了。串口的打印机想自己发送汉字点阵信息的速度是非常慢的,这主要是串口的速度不行。当然,撇开难度,自己控制打印机是最好的了。好好定义一个类,让他能以最小的代价实现这个自己的打印驱动。 这个东西我做过,不过我现在手上没有 EPSON 的 LQ 控制手册我只有 HP 的 PCL 控制手册,很简单的不过我使用的是 BC++ 嘿我手上确实 LQ 的控制手册不过是 BC++ 的代码来的 int print_ready(void){ int status; status = biosprint(2,0,0); /*status &= 0x80;*/ return (status==144);}void inialize_prn(void) //打印开始命令{ if(printertype==PCL) { biosprint(0,ESC,0); biosprint(0,'*',0); biosprint(0,'t',0); biosprint(0,'1',0); biosprint(0,'5',0); biosprint(0,'0',0); biosprint(0,'R',0); }else{ // LQ 打印 biosprint(0,27,0); biosprint(0,'3',0); biosprint(0,24,0); }}int p_blank_dot(int dot) // PCL 打印结束函数{ int cols; int jj,j; for(jj=0;jj<dot;jj++) { biosprint(0,ESC,0); biosprint(0,'*',0); biosprint(0,'b',0); biosprint(0,'0',0); biosprint(0,'W',0); }}void wprintf(va_list arg_list, ...) // DOS 下通过 LPT1 口打印一行汉字{ va_list arg_ptr; int i,j; char *format; unsigned char output[120]; unsigned char output_save,starti; int counter, len,s_count,hz_count,total; unsigned char temp,next_line; va_start(arg_ptr, arg_list); format = (char far *) arg_list; vsprintf((char *)output, format, arg_ptr); output[100]=0; counter=0; do { temp=output[counter]; if ( temp > (unsigned char) 0xa0) // 汉字 { starti=counter; // counter++; while (temp && temp>(unsigned char)0xa0) temp=output[++counter]; output_save=output[counter]; output[counter]=0; if (print_hz_mode == 24) // 读取和放置汉字字库点阵 24X24 wprinthz24(output+starti); else wprinthz(output+starti); // 16X16 output[counter]=output_save; } else if (temp>=' ' && temp<='~') { starti=counter; while( temp>=' ' && temp<='~' ) temp=output[++counter]; output_save=output[counter]; output[counter]=0; wprints((char *)(output+starti)); // 读取和放置 ASCII 字库点阵 8X16 output[counter]=output_save; } // 回车或者已经超出一行宽度 B5 纸 180*18.2/2.54 = 1289 else if (temp=='\n' || line_buff_count>=1260 ) { if (printertype==LQ) // LQ 打印 { total=line_buff_count; if (total>100) { // ESC * DPI 点数低字节 点数高字节 实际数据 biosprint(0,0x1b,0); // ESC * m nl,nh, d1 ... dk biosprint(0,0x2a,0); biosprint(0,39,0); // m=39, 180*180 dpi biosprint(0,((total+LEFT_MARGIN) % 256),0); biosprint(0,((total+LEFT_MARGIN) / 256),0); for ( i=0;i<LEFT_MARGIN;i++) // 左边距点数 { // 三次代表的是打印时每次打印 24 个点(竖方向) biosprint(0,0x0,0); biosprint(0,0x0,0); biosprint(0,0x0,0); } for(i=0;i<total;i++) for(j=0;j<3;j++) biosprint(0,line_buff[i][j],0); } biosprint(0,0x0d,0); biosprint(0,0x0a,0); } else // HP PCL 打印 { print_buffer_pcl(); } line_buff_count=0; if ( temp=='\n') counter++; } else counter++; } while(output[counter]); if(printertype==PCL)p_blank_dot(4); // PCL 打印结束函数}void TestPrn(){ if ( ! print_ready() ) { printf("Not printer!\n"); return; } inialize_prn(); wprintf(" 档 案 号:%s\n",strname); wprintf(" 姓 名: \n");} http://www.boshiland.com上面有控制码,你试试先 求助,关于ComboBox1被选后取同一记录的另一个值问题 类似MIDI窗体的程序开发 还是多线程问题 请问怎么使用polypolygon函数!它的函数体是怎么样的? 用Adoquery运行存储过程出现的问题(也许你也遇过哦) delphi+sqlserver,如何备份和恢复? 有没好的SQL语句实现如下功能 求delphi做的机房设备管理系统(服务端),自己在试着弄,但太痛苦 employee.gdb的密码是什么 用ole操作如何使EXCEL不显示状态栏和编辑栏 求职 知道就不难哈!
找本说明书看看。
windows下可以使用windows的字体呀!
不过这种方式是以图像方式的,速度会稍慢。
至于字体的大小应该不是问题,24针打印机用的基本都是24*24点阵的。9针的一般用16点阵
没有打印机驱动吗?你应该是在Delphi下面操作吧?
串口的打印机想自己发送汉字点阵信息的速度是非常慢的,这主要是串口的速度不行。当然,撇开难度,自己控制打印机是最好的了。
好好定义一个类,让他能以最小的代价实现这个自己的打印驱动。
我只有 HP 的 PCL 控制手册,很简单的
不过我使用的是 BC++
不过是 BC++ 的代码来的
{
int status;
status = biosprint(2,0,0);
/*status &= 0x80;*/
return (status==144);
}void inialize_prn(void) //打印开始命令
{
if(printertype==PCL)
{
biosprint(0,ESC,0);
biosprint(0,'*',0);
biosprint(0,'t',0);
biosprint(0,'1',0);
biosprint(0,'5',0);
biosprint(0,'0',0);
biosprint(0,'R',0);
}else{ // LQ 打印
biosprint(0,27,0);
biosprint(0,'3',0);
biosprint(0,24,0);
}
}int p_blank_dot(int dot) // PCL 打印结束函数
{
int cols;
int jj,j;
for(jj=0;jj<dot;jj++)
{
biosprint(0,ESC,0);
biosprint(0,'*',0);
biosprint(0,'b',0);
biosprint(0,'0',0);
biosprint(0,'W',0);
}
}void wprintf(va_list arg_list, ...) // DOS 下通过 LPT1 口打印一行汉字
{
va_list arg_ptr;
int i,j;
char *format;
unsigned char output[120];
unsigned char output_save,starti;
int counter, len,s_count,hz_count,total;
unsigned char temp,next_line;
va_start(arg_ptr, arg_list);
format = (char far *) arg_list;
vsprintf((char *)output, format, arg_ptr);
output[100]=0; counter=0;
do
{
temp=output[counter];
if ( temp > (unsigned char) 0xa0) // 汉字
{
starti=counter;
// counter++;
while (temp && temp>(unsigned char)0xa0) temp=output[++counter];
output_save=output[counter];
output[counter]=0;
if (print_hz_mode == 24) // 读取和放置汉字字库点阵 24X24
wprinthz24(output+starti);
else
wprinthz(output+starti); // 16X16
output[counter]=output_save;
}
else if (temp>=' ' && temp<='~')
{
starti=counter;
while( temp>=' ' && temp<='~' ) temp=output[++counter];
output_save=output[counter];
output[counter]=0;
wprints((char *)(output+starti)); // 读取和放置 ASCII 字库点阵 8X16
output[counter]=output_save;
}
// 回车或者已经超出一行宽度 B5 纸 180*18.2/2.54 = 1289
else if (temp=='\n' || line_buff_count>=1260 )
{
if (printertype==LQ) // LQ 打印
{
total=line_buff_count;
if (total>100)
{
// ESC * DPI 点数低字节 点数高字节 实际数据
biosprint(0,0x1b,0); // ESC * m nl,nh, d1 ... dk
biosprint(0,0x2a,0);
biosprint(0,39,0); // m=39, 180*180 dpi
biosprint(0,((total+LEFT_MARGIN) % 256),0);
biosprint(0,((total+LEFT_MARGIN) / 256),0);
for ( i=0;i<LEFT_MARGIN;i++) // 左边距点数
{
// 三次代表的是打印时每次打印 24 个点(竖方向)
biosprint(0,0x0,0);
biosprint(0,0x0,0);
biosprint(0,0x0,0);
}
for(i=0;i<total;i++)
for(j=0;j<3;j++)
biosprint(0,line_buff[i][j],0);
}
biosprint(0,0x0d,0);
biosprint(0,0x0a,0);
}
else // HP PCL 打印
{
print_buffer_pcl();
}
line_buff_count=0;
if ( temp=='\n') counter++;
}
else counter++;
} while(output[counter]);
if(printertype==PCL)p_blank_dot(4); // PCL 打印结束函数
}void TestPrn()
{
if ( ! print_ready() ) { printf("Not printer!\n"); return; }
inialize_prn(); wprintf(" 档 案 号:%s\n",strname);
wprintf(" 姓 名: \n");
}
上面有控制码,你试试先