基础设备
- 基于芯片STM32103FC8T6,使用库函数编程
- 使用模拟串口发送数据至热敏打印机
- 选择TTL接口的串口打印机
注意事项
- 之前用串口发送后,打印机一直不工作,连续一天半没找到原因。用TTL-USB接到电脑串口发现有数据。后来发现,因为打印机是单独供电的,没有和芯片共地。那为什么TTL-USB接口只用一根线接收数据就可以呢,因为单片机和TTL-USB接口都是电脑供的电,它们在内部是共地的。
- 在使用打印前应该先自检,要确认是可以串口直接打印的嵌入式热敏打印机。
- STM32103FC8T6的串口一共有3个,串口1:PA10(RX)、PA9(TX),串口2:PA3(RX)、PA2(TX),串口3:PB11(RX)、PB10(TX)。因为单片机接着很多外设,串口比较紧张,所以选择使用一个闲置的口模拟串口,这里使用A1。
实现步骤
- 打印机管脚的初始化
void Print_GPIO_Configuration(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
GPIO_InitStructure.GPIO_Pin =GPIO_Pin_1;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOA, &GPIO_InitStructure);
}
- 可以先通过宏定义设置接口状态,方便我们控制引脚电平。
#define Print_TX(a) if (a) \
GPIO_SetBits(GPIOA,GPIO_Pin_1);\
else \
GPIO_ResetBits(GPIOA,GPIO_Pin_1)
- 模拟串口发送数据,模拟IO的实现需要的就是延时的精准度,以9600bps波特率为例,一秒能发送9600bit,那么发送1bit的时间间隔就是大概1/9600≈104us,
void VirtualCOM_SendByte(uint8_t c)
{
int i = 0;
Print_TX(0);
Delay_us(104);
for(i = 0; i < 8; i++)
{
if(c & 0X01)
{
Print_TX(1);
}
else
{
Print_TX(0);
}
c >>= 1;
Delay_us(104);
}
Print_TX(1);
Delay_us(104);
}
- 字节发送函数
void PrintChar3(unsigned char temp)
{
VirtualCOM_SendByte(temp);
}
void PrintString3(unsigned char *String)
{
while(*String)
{
PrintChar3(*String++);
}
}
- 主函数中写一个打印函数并调用
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();
}
实现效果
