TM-300A/B(epson) 调用软字库实现汉字的打印有现成的例子最好了,用的是16*16的点阵字库. [email protected]
 [email protected]

解决方案 »

  1.   

    一般来说都能通过 ESC 命令选择是否使用打印机的硬字库。
    找本说明书看看。
      

  2.   

    to pazee(耙子):  对呀,是使用ESC * 的,但是在TM300A/B 的这种打印机中是没有汉字库的,要是有的话那就好了, 而它打出来的汉字也是以图象的方式业处理的.你能给我一个例子那是最好的了.
      

  3.   

    这类打印机通常有2种方式,文本方式(自带字库)和图形模式(所有内容都是windows发来的点阵)
    windows下可以使用windows的字体呀!
    不过这种方式是以图像方式的,速度会稍慢。
    至于字体的大小应该不是问题,24针打印机用的基本都是24*24点阵的。9针的一般用16点阵
      

  4.   

    你怎么自己往串口送数据?
    没有打印机驱动吗?你应该是在Delphi下面操作吧?
      

  5.   

    另外,我曾经看过一个ESC的指令集,非常详细,但是现在无从找到了。
    串口的打印机想自己发送汉字点阵信息的速度是非常慢的,这主要是串口的速度不行。当然,撇开难度,自己控制打印机是最好的了。
    好好定义一个类,让他能以最小的代价实现这个自己的打印驱动。
      

  6.   

    这个东西我做过,不过我现在手上没有 EPSON 的 LQ 控制手册
    我只有 HP 的 PCL 控制手册,很简单的
    不过我使用的是 BC++
      

  7.   

    嘿我手上确实 LQ 的控制手册
    不过是 BC++ 的代码来的
      

  8.   

    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");
    }
      

  9.   

    http://www.boshiland.com
    上面有控制码,你试试先