STM32使用外设热敏打印机进行打印

基础设备

  1. 基于芯片STM32103FC8T6,使用库函数编程
  2. 使用模拟串口发送数据至热敏打印机
  3. 选择TTL接口的串口打印机

注意事项

  1. 之前用串口发送后,打印机一直不工作,连续一天半没找到原因。用TTL-USB接到电脑串口发现有数据。后来发现,因为打印机是单独供电的,没有和芯片共地。那为什么TTL-USB接口只用一根线接收数据就可以呢,因为单片机和TTL-USB接口都是电脑供的电,它们在内部是共地的。
  2. 在使用打印前应该先自检,要确认是可以串口直接打印的嵌入式热敏打印机。
  3. STM32103FC8T6的串口一共有3个,串口1:PA10(RX)、PA9(TX),串口2:PA3(RX)、PA2(TX),串口3:PB11(RX)、PB10(TX)。因为单片机接着很多外设,串口比较紧张,所以选择使用一个闲置的口模拟串口,这里使用A1。

实现步骤

  1. 打印机管脚的初始化
/*	打印机管脚初始化		*/
void Print_GPIO_Configuration(void)
{
	GPIO_InitTypeDef GPIO_InitStructure;
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
	
	GPIO_InitStructure.GPIO_Pin =GPIO_Pin_1;	 		   	//打印机输出管脚设置为A1
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;   		//输出模式:推挽输出	
	GPIO_Init(GPIOA, &GPIO_InitStructure);
}
  1. 可以先通过宏定义设置接口状态,方便我们控制引脚电平。
//设置打印机的管脚状态
#define Print_TX(a)	if (a)	\
					GPIO_SetBits(GPIOA,GPIO_Pin_1);\
					else		\
					GPIO_ResetBits(GPIOA,GPIO_Pin_1)
  1. 模拟串口发送数据,模拟IO的实现需要的就是延时的精准度,以9600bps波特率为例,一秒能发送9600bit,那么发送1bit的时间间隔就是大概1/9600≈104us,
/*	
	模拟串口发送数据
*/
void VirtualCOM_SendByte(uint8_t c)
{
    int i = 0;
    Print_TX(0);                     // 拉低IO引脚启动发送
    Delay_us(104);
    for(i = 0; i < 8; i++)             // 开始发送8bit数据
    {
        if(c & 0X01)	//利用电平发送数据,低位在前
        {
            Print_TX(1);
        }
        else
        {
            Print_TX(0);
        }
        c >>= 1;
        Delay_us(104);
    }
    Print_TX(1);                    // 拉高IO引脚停止发送
    Delay_us(104);
}
  1. 字节发送函数
/*	发送单个字节		*/
void PrintChar3(unsigned char temp)
{
	VirtualCOM_SendByte(temp);          
}

/*	发送字符串		*/
void PrintString3(unsigned char *String) 	
{
	while(*String)
	{
		  PrintChar3(*String++);
	}
}
  1. 主函数中写一个打印函数并调用
    0x20表示空格,0x0d 0x0a相当于\r\n表示换行并定位到下一行行首,还要注意打印是反着来的。
void Print_Gushi(void)
{
	PrintChar3(0x20);PrintChar3(0x20);PrintChar3(0x20);PrintChar3(0x20); 
	PrintString3((uint8_t *)"不敢高声语,恐惊天上人。"); PrintChar3(0x0d);PrintChar3(0x0a);
	PrintChar3(0x20);PrintChar3(0x20);PrintChar3(0x20);PrintChar3(0x20); 
	PrintString3((uint8_t *)"危楼高百尺,手可摘星辰。"); PrintChar3(0x0d);PrintChar3(0x0a);
	
	PrintChar3(0x20);PrintChar3(0x20);PrintChar3(0x20);PrintChar3(0x20);
	PrintChar3(0x20);PrintChar3(0x20);PrintChar3(0x20);PrintChar3(0x20);
	PrintChar3(0x20);PrintChar3(0x20);PrintChar3(0x20);PrintChar3(0x20);
	PrintString3((uint8_t *)"唐-李白"); PrintChar3(0x0d);PrintChar3(0x0a);
	
	PrintChar3(0x20);PrintChar3(0x20);PrintChar3(0x20);PrintChar3(0x20);
	PrintChar3(0x20);PrintChar3(0x20);PrintChar3(0x20);PrintChar3(0x20);
	PrintChar3(0x20);PrintChar3(0x20);
	PrintString3((uint8_t *)"《夜宿山寺》"); PrintChar3(0x0d);PrintChar3(0x0a);
	
	PrintChar3(0x0d);PrintChar3(0x0a);PrintChar3(0x0d);PrintChar3(0x0a);
	PrintChar3(0x0d);PrintChar3(0x0a);PrintChar3(0x0d);PrintChar3(0x0a);
	PrintChar3(0x0d);PrintChar3(0x0a);	

}

int main(void)
{	
	Print_GPIO_Configuration();	//打印机管脚初始化
	Print_Gushi();
	Print_Gushi();
}

实现效果

在这里插入图片描述

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值