热敏打印机应用笔记

热敏电打印机在PS机上应用比较广泛。造型需要考滤的参数有:

1、打印方式:热敏,针式等等;

2、打印纸度:影响一行能打的字数;

3、打印密度:影响线的粗细,单位 点/mm 或是 点/行

4、打印头的寿命:

5、有效打印宽度:实际可打印的字符宽度;

6、走纸速度:即打速度;

7、支持的字符集: 中文 / 英文

8、接口形式:并/串 TLL/232

9、功耗:

10、外形及安装方式:

11、资质认证:如防爆场合

 

*炜-煌 *E9* (多来点星星以免打广告) 打印机适用防爆场合,硬件连接很简单,主要是代码调试,格式对齐上比较费纸,呵呵:

1、调试时最就是单片机与打印机独立供电,在电打印过程序中打印机电流很厉害(热敏打印的缺点),1.5A左右,搞不好会把单片机搞死掉或是会导致打印终止。最好用线性电源供电可以观察电流;

2、程序中发送打印数据前先选择字库码的类型;

3、打印应该注意打印机最长能打印多少个字符,以免加上行间距;

 

#include "stm32f10x.h"
#include "misc.h"
#include "system_stm32f10x.h"
#include "stm32f10x_gpio.h"
#include "stm32f10x_rcc.h"
#include "stm32f10x_usart.h"
#include "fifo.h"
#include "string.h"

#define  MAX_LINE             13   

#define  EnableData()         USART_ITConfig(TicketPrintUart, USART_IT_TXE, ENABLE)   
#define  IsPrinterBusy()      GPIO_ReadInputDataBit(TicketPrintBusyGPIO, TicketPrintBusyPin)          
void  TicketPrinterInit(void);
u8       TicketPrinterWrite(u8 **dp);
void  TicketPrinterTest(void);

#define  TicketPrintIRQ       USART2_IRQHandler     

#define  TicketPrintUartIOClk RCC_APB2Periph_GPIOA 

#define  TicketPrintUartClk   RCC_APB1Periph_USART2

#define  TicketPrintTxGPIO    GPIOA                 

#define  TicketPrintBusyGPIO  GPIOA
#define  TicketPrintTxPin     GPIO_Pin_2
#define  TicketPrintBusyPin   GPIO_Pin_3
#define  TicketPrintUart      USART2                 
#define  TicketPrintIRQn      USART2_IRQn

                                 
static void TicketPrinterIOInit(void)
{
    USART_InitTypeDef USART_InitStructure;
    NVIC_InitTypeDef NVIC_InitStructure;
    GPIO_InitTypeDef GPIO_InitStructure;

    RCC_APB2PeriphClockCmd(TicketPrintUartIOClk | RCC_APB2Periph_AFIO, ENABLE);
    RCC_APB1PeriphClockCmd(TicketPrintUartClk, ENABLE);

    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);
    NVIC_InitStructure.NVIC_IRQChannel = TicketPrintIRQn;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&NVIC_InitStructure);

    GPIO_InitStructure.GPIO_Pin = TicketPrintBusyPin; //Printor Busy
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
    GPIO_Init(TicketPrintBusyGPIO, &GPIO_InitStructure);
    GPIO_InitStructure.GPIO_Pin = TicketPrintTxPin;   //TX2   
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
    GPIO_Init(TicketPrintTxGPIO, &GPIO_InitStructure);

    USART_InitStructure.USART_BaudRate = 9600;
    USART_InitStructure.USART_WordLength = USART_WordLength_8b;
    USART_InitStructure.USART_StopBits = USART_StopBits_1;
    USART_InitStructure.USART_Parity = USART_Parity_No;
    USART_InitStructure.USART_HardwareFlowControl =
            USART_HardwareFlowControl_None;
    USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;

    USART_Init(TicketPrintUart, &USART_InitStructure);
    FifoInit(&PrintFifo, sizeof(PrintFifo.data));
    USART_Cmd(TicketPrintUart, ENABLE);
}

void TicketPrintIRQ(void)
{
    u8 ch;
    if (USART_GetITStatus(TicketPrintUart, USART_IT_TXE) != RESET)
    {
        if(!IsPrinterBusy())
        {
         if(!FifoRead(&PrintFifo, &ch))
             TicketPrintUart->DR = (uint16_t)0x01FF & ch;
         else
             USART_ITConfig(TicketPrintUart, USART_IT_TXE, DISABLE);
     }
    }       
}

 

 

//测试代码

 

test[] = {“stm32 单片机”};

for(y = 0; y < sizeof(test); y++)

FifoWrite(&PrintFifo,  test[y]);

FifoWrite(&PrintFifo, '\n');
EnableData();

转载于:https://www.cnblogs.com/worldsing/archive/2013/05/22/3093083.html

可能感兴趣的项目设计:应用于 POS 机、收银机等80mm 高速微型打印机(原理图、上位机、程序源码) 附件内容截图: 字库改组: 为了便于处理,我们对字模进行如下改组: 把 16 X 16 汉字,分成左边从上到下16个字节,和右边16个字节,目的是可以把一个汉字当成两个 16X8 字母或数字处理。 改组后,字模数据从 RAM 读出送往打印机时,无论是汉字还是字母或数字,第n行点的 "字节数据" 就是: n, n+16, n+16*2, n+16*3......一行取48个字节, 8*48=384 个点。 把 24 X 24 汉字,分成左边从上到下 24行 X 12列, 和右边 24 X 12 数据,一行 12bit 数据存放在半字 16bit 中的低12bit, 左右半边都有 24个"半字",或 48 个字节,一个24X24汉字变成96个字节了。如此处理字模时,把一个汉字当成两个 24 X 12 字母或数字来处理。 不管汉字字母或数字,第n行点的 ”半字数据“ 就是 n,n+24,n+24*2,n+24*3......取32个"半字",刚好够 12bit*32=384 个点,即一行可打 32个字母,或16个汉字。 字模写入 SPI FLASH 时,完成以上变换。打印时,NUC123 从 SPI FLASH 读出的字模,认为是上述变换后的格式。 高速 SPI 接口传输数据 打印时,字模数据要从 W25Q16 中通过 SPI 接口读取,再通过 SPI 接口移入打印。 一行 16个 24 X 24 汉字有 16*96 = 1536 个字节。字符行与行之间一般有一到三个空行,走纸最快时 90mm/秒,694us 走一行,在这个时间内要读取所有 1536个字节,放入 RAM 打印缓冲区。代码中,把 SPI 配置成 28.8Mbps 从FLASH 中读取字模,为便于用示波器查看波形,每次收发 16bit 中间,插入一个空闲 CLK,收发完 1536 Byte 要经过 1536/2 = 768 次 17bit 时钟,时间为 768*17/28.8 = 453us。关键是 SPI 收发 16bit 中间不能再有额外间隙,否则 28.8Mbps 失去意义,所以代码中,使能 SPI 的 FiFo,同时配置 PDMA 来完成 SPI 收发。 点数据移入打印,SPI 速率配置为 4.8Mbps,384个点。数据传输时间约为 384/4.8 = 80us,走纸最快 90毫米/秒 时 694us走一行,数据早传完了。走纸速度再快一倍也来得及。 USB 打印机模式 USB 打印模式,上位机传输过来的,是图形点阵数据与命令混在一起,无需从 SPI FLASH 中读字模,只要把点数据从USB数据流里分离出来,移入打印即可。代码中定义了一个 4096 字节的环形缓冲区。 USB 数据中断: 分析数据流,见函数 PTR_Data_Receive(), 遇图形点阵数据流,写入环形缓冲区。遇命令立即执行,或为执行做好准备。若有打印命令或走纸命令,就把 “走纸行数” 通过全局变量 StepIncrease 传给主循环代码。 主循环里,1>若传过来的走纸行数 StepIncrease 不为0,就启动走纸。2>若已在走纸,就检查环形缓冲区是否有待打印数据——比较写入指针与读出指针的值可得知,若有待打印数据,就会在纸每走过一行时,把数据送入打印并加热打印。 走纸,加热和数据传输,三者同时处理的时序 需要走纸时,只要设定速度值全局变量 pStepM_TimLimit,然后调用走纸启动函数 PaperRollStart() 就开始走纸了,何时走下一行,何时停止,都在 Timer1 中断代码里处理。中断外面无需再处理走纸的事。 需要说明的是:有一个走纸剩余行数全局变量 RemainderStep, 在此变量非0时,可以随时加大这个值,加长走纸行数。 再来看何时把数据串入打印,何时加热,下图用鼠标点击可放大。 打印开始时,先启动走纸,前面空一两行没事,一行只有 0.0625mm。 把第一行点数据,串入打印后,就等待走纸到第三行——由剩余步数全局变量 RemainderStep 的值可得知。只要一走到第三行,立即输出点数据到加热,并启动加热定时。然后就去处理下一行点数据。 每次在走到新的一行时(实际是两行), 都立即启动已准备好的、这一行数据的加热,接着代码去准备下一行点数据。 何时加热停止呢? 不用担心,由 Timer2 中断代码处理了。 打印开始时,必须知道要走几行, 两行一个点,一行 16 X 16 字符,要走 32行,一般还要加上开和结尾的空行。 连续打印时,只要剩余行数 RemainderStep 不为0——走纸未停,可以随时增加这个值,加长走纸行数,继续打
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值