pb控制打印机

在使用连续纸打印数据窗口的情况下,需要定制打印的页长,以保证打印机走纸正确,不用人工干预,实现连续打印。在PB中须调用外部函数来自定义纸张长度,比较繁琐。本文介绍一种直接对打印机的控制方法,简单实现对页长的设定。

 

---- 一、 预备知识

 

---- 计算机与打印机的通讯使用ASCII码进行,其中标准ASCII码包括可打印字符及非打印字符(控制码),打印机使用控制码来定制打印机。大多数打印机指令使用控制码escape作为其指令序列的第一个序列码。下面介绍本文用到的几个指令码序列:

 

设置换行量(行距)1/8 英寸

ASCII码 ESC 0

十进制码 27 48

 

设置以行为单位的页长

ASCII码 ESC C n

十进制码 27 67 n

其中n 为每页行数范围(1-127)

 

---- 二、 PB中控制码的传送及定制页长的实现

 

---- 在PB中通过函数Printsend(printjobnumber,string,{zerochar})来实现向打印机发送控制码。各参数定义如下:

 

printjobnumber: 由printjob()函数返回的打印作业号;

string:        控制字符串,使用ASCII码;

zerochar:      用来替代string中的数字0;

 

---- 由于字符串中,0终止字符串,如果string 中包含0,则需利用其他字符来表示0,参数zerochar即为此用途而设,当PB发送控制字符串给打印机时,把替代的字符zerochar转化为0。

 

---- 下面是具体的完成定制页长打印数据窗口的程序(定制页长为2.75英寸):

 

long ll_job

dw_print.reset()

ll_job = printopen()

if ll_job = -1 then

messagebox(gs_title,"打印机未准备好")

return

end if

//定制行距1/8英寸

PrintSend(ll_job, CHAR(27)+CHAR(48))

//设定页长22行

PrintSend(ll_job, CHAR(27)+CHAR(67)+CHAR(22))

printdatawindow(ll_job,dw_print)

printclose(ll_job)

 

通过ESC指令集来控制。

具体方法: ESC_D_M(M为数值)

 

long ll_job

dw_print.reset()

ll_job = printopen()

if ll_job = -1 then

messagebox(gs_title,"打印机未准备好")

return

end if

//定制行距1/8英寸

PrintSend(ll_job, CHAR(27)+CHAR(48))

//设定页长22行

PrintSend(ll_job,CHAR(27)+CHAR(67)+CHAR(dw_print.rowcount()))

printdatawindow(ll_job,dw_print)

printclose(ll_job)

可控制打印走纸的长度,如你打印时用dw_print.print()你windows中默认打印机的纸张是A4

这样打印时如果dw中有一行也是把A4这张纸走完,如果你用上面的这可以控制如dw中有10行这样走到第10行时,打印作业就停止了!,你可以把上面的程序写到你的程序中就应该可以解决,不过此程序只适用于针式打印机

如有问题可以发邮件pjj-33@163.com

 

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
控制舵机需要使用定时器产生PWM信号,以及使用GPIO模块来输出PWM信号。下面给出一个使用PB7引脚控制舵机的示例代码: ```c #include "stm32f10x.h" // 定义舵机控制引脚 #define SERVO_PIN GPIO_Pin_7 #define SERVO_GPIO GPIOB #define SERVO_GPIO_CLK RCC_APB2Periph_GPIOB // 定义定时器和通道 #define SERVO_TIM TIM4 #define SERVO_TIM_CLK RCC_APB1Periph_TIM4 #define SERVO_TIM_CH TIM_OC3Init #define SERVO_TIM_OC TIM_OC3PreloadConfig void Servo_Init(void) { TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_OCInitTypeDef TIM_OCInitStructure; GPIO_InitTypeDef GPIO_InitStructure; // 使能定时器和GPIO时钟 RCC_APB1PeriphClockCmd(SERVO_TIM_CLK, ENABLE); RCC_APB2PeriphClockCmd(SERVO_GPIO_CLK, ENABLE); // 配置GPIO为复用输出模式 GPIO_InitStructure.GPIO_Pin = SERVO_PIN; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(SERVO_GPIO, &GPIO_InitStructure); // 定时器工作在PWM模式1 TIM_TimeBaseStructure.TIM_Period = 20000 - 1; // 计数器周期为20ms TIM_TimeBaseStructure.TIM_Prescaler = 72 - 1; // 定时器预分频系数为72 TIM_TimeBaseStructure.TIM_ClockDivision = 0; TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseInit(SERVO_TIM, &TIM_TimeBaseStructure); // 配置定时器通道为PWM模式 TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; TIM_OCInitStructure.TIM_Pulse = 1500; // 初始占空比为1.5ms TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; SERVO_TIM_CH(SERVO_TIM, &TIM_OCInitStructure); // 使能定时器并开始计数 TIM_Cmd(SERVO_TIM, ENABLE); } void Servo_SetAngle(uint16_t angle) { uint16_t pulse = 500 + angle * 10 / 9; // 将角度转换为占空比 SERVO_TIM_OC(SERVO_TIM, TIM_OCMode_PWM1, pulse, TIM_OCPolarity_High); } int main(void) { Servo_Init(); while (1) { // 控制舵机转动到0度 Servo_SetAngle(0); delay_ms(1000); // 控制舵机转动到90度 Servo_SetAngle(90); delay_ms(1000); // 控制舵机转动到180度 Servo_SetAngle(180); delay_ms(1000); } } ``` 需要注意的是,上述代码使用了一个名为`delay_ms`的延时函数,需要自行实现。另外,在调用`Servo_SetAngle`函数时,参数为舵机需要转动到的角度,取值范围为0~180度。函数内部会将角度转换为对应的占空比来控制舵机转动。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值