您的位置 首页 > 问题分享

打印机驱动安装设备异常是什么鬼_打印机驱动安装校验位什么意思啊

1.打印机不打测试页

2.通讯rxtx硬件原理

3.VB 返回打印机状态

4.tsc打印机间距如何调整

5.联想LJ2000打印机驱动已经安装好了,可一到打印时就显示错误,打印机也时正常亮灯,

打印机驱动安装设备异常是什么鬼_打印机驱动安装校验位什么意思啊

2.6 运算符

C语言的内部运算符很丰富,运算符是告诉编译程序执行特定算术或逻辑操作的符号。C语言有三大运算符:算术、关系与逻辑、位操作。另外, C还有一些特殊的运算符,用于完成一些特殊的任务。

2.6.1 算术运算符

表2 - 5列出了C语言中允许的算术运算符。在C语言中,运算符“ +”、“-”、“*”和“ /”的用法与大多数计算机语言的相同,几乎可用于所有C语言内定义的数据类型。当“ /”被用于整数或字符时,结果取整。例如,在整数除法中, 1 0 / 3 = 3。

一元减法的实际效果等于用- 1乘单个操作数,即任何数值前放置减号将改变其符号。模运算符“%”在C语言中也同它在其它语言中的用法相同。切记,模运算取整数除法的余数,所以“%”不能用于float和double类型。

表2-5 算术运算符

运算符 作用 运算符 作用

- 减法,也是一元减法 % 模运算

+ 加法 -- 自减(减1)

* 乘法 ++ 自增(增1)

/ 除法

下面是说明%用法的程序段。

int x,y;

x = 10;

y = 3;

printf("%d",x/y); /* 显示3 */

printf("%d",x%y) ; /* 显示1 ,整数除法的余数* /

x = 1 ;

y = 2 ;

printf("%d,%d",x/y,x%y) ; /* 显示0,1 */

最后一行打印一个0和一个1,因为1 / 2整除时为0,余数为1,故1 % 2取余数1。

2.6.2 自增和自减

C语言中有两个很有用的运算符,通常在其它计算机语言中是找不到它们的—自增和自减运算符, + +和- -。运算符“ + +”是操作数加1,而“- -”是操作数减1,换句话说:x = x + 1 ; 同+ + x ; x = x - 1 ; 同- - x ;

自增和自减运算符可用在操作数之前,也可放在其后,例如: x = x + 1;可写成+ + x;或x + +;但在表达式中这两种用法是有区别的。自增或自减运算符在操作数之前, C语言在引用操作数之前就先执行加1或减1操作;运算符在操作数之后, C语言就先引用操作数的值,而后再进行加1或减1操作。请看下例:

x = 1 0;

y = ++x;

此时,y = 11。如果程序改为:

x = 10 ;

y = x++ ;

则y = 10。在这两种情况下, x都被置为11,但区别在于设置的时刻,这种对自增和自减发生时刻的控制是非常有用的。

在大多数C编译程序中,为自增和自减操作生成的程序代码比等价的赋值语句生成的代码要快得多,所以尽可能用加1或减1运算符是一种好的选择。

下面是算术运算符的优先级:

最高 ++、--

-(一元减)

*、/、%

最低 +、-

编译程序对同级运算符按从左到右的顺序进行计算。当然,括号可改变计算顺序。C语言处理括号的方法与几乎所有的计算机语言相同:强迫某个运算或某组运算的优先级升高。

2.6.3 关系和逻辑运算符

关系运算符中的“关系”二字指的是一个值与另一个值之间的关系,逻辑运算符中的“逻辑”二字指的是连接关系的方式。因为关系和逻辑运算符常在一起使用,所以将它们放在一起讨论。

关系和逻辑运算符概念中的关键是True(真)和Flase()。C语言中,非0为True,0为Flase。使用关系或逻辑运算符的表达式对Flase和Ture分别返回值0或1 (见表2 - 6 )。

表2-6 关系和逻辑运算符

关系运算符 含义 关系运算符 含义

> 大于 <= 小于或等于

>= 大于等于 == 等于

< 小于 != 不等于

逻辑运算符 含义

&& 与

|| 或

! 非

表2 - 6给出于关系和逻辑运算符,下面用1和0给出逻辑真值表。

关系和逻辑运算符的优先级比算术运算符低,即像表达式10>1+12的计算可以定是对表

达式10>( 1 + 12)的计算,当然,该表达式的结果为Flase。

在一个表达式中允许运算的组合。例如:

10>5&&!(10<9)||3<=4

p q p&&q p||q !p

0 0 0 0 1

0 1 0 1 1

1 0 0 1 0

1 1 1 1 0

这一表达式的结果为True。

下表给出了关系和逻辑运算符的相对优先级:

最高 !

>= <=

== !=

&&

最低 ||

同算术表达式一样,在关系或逻辑表达式中也使用括号来修改原计算顺序。

切记,所有关系和逻辑表达式产生的结果不是0就是1,所以下面的程序段不仅正确而且将在屏幕上打印数值1。

int x;

x = 100;

printf("%d",x>10);

2.6.4 位操作符

与其它语言不同,C语言支持全部的位操作符( Bitwise Operators)。因为C语言的设计目的是取代汇编语言,所以它必须支持汇编语言所具有的运算能力。位操作是对字节或字中的位(bit)进行测试、置位或移位处理,这里字节或字是针对C标准中的char和int数据类型而言的。位操作不能用于float、double、long double、void或其它复杂类型。表

2 - 7给出了位操作

的操作符。位操作中的AND、OR和NOT(1的补码)的真值表与逻辑运算等价,唯一不同的是位操作是逐位进行运算的。

表2-7 位操作符

操作符 含义 操作符 含义

& 与(AND) ~ 1的补(NOT)

| 或(OR) >> 右移

^ 异或(XOR) << 左移

下面是异或的真值表。

表2-8 异或的真值表

p q p^q

0 0 0

1 0 1

1 1 0

0 1 1

如表2 - 8所示,当且仅当一个操作数为True时,异或的输出为True,否则为Flase。

位操作通常用于设备驱动程序,例如调制解调器程序、磁盘文件管理程序和打印机驱动程序。这是因为位操作可屏蔽掉某些位,如奇偶校验位(奇偶校验位用于确保字节中的其它位不会发生错误通常奇偶校验位是字节的最高位)。

通常我们可把位操作A N D作为关闭位的手段,这就是说两个操作数中任一为0的位,其结果中对应位置为0。例如,下面的函数通过调用函数read_modem( ),从调制解调器端口读入一个字符,并将奇偶校验位置成0。

[例2 - 4 ]

Char get_char_from_modem()

{

char ch;

ch=read_modem(); /*从调制解调器端口中得到一个字符* /

return(ch&127);

}

字节的位8是奇偶位,将该字节与一个位1到位7为1、位8为0的字节进行与操作,可将该字节的奇偶校验位置成0。表达式ch&127正是将ch中每一位同127数字的对应位进行与操作,结果ch的位8被置成了0。在下面的例子中,定c h接收到字符"A"并且奇偶位已经被置位。

奇偶位

110000001 内容为‘A’的c h,其中奇偶校验位为1

011111111 二进制的127执行与操作

& 与操作

-----------

=010000001 去掉奇偶校验的‘A’

位操作OR与AND操作相反,可用来置位。任一操作数中为1的位将结果的对应位置1。如下所示,128|3的情况是:

1000000 128的二进制

0000011 3的二进制

| 或操作

----------

=1000011 结果

异或操作通常缩写为XOR,当且仅当做比较的两位不同时,才将结果的对应位置位。如下所示,异或操作127 ^ 12 0的情况是:

01111111 127 的二进制

01111000 120 的二进制

^ 异或操作

---------

=00000111 结果

一般来说,位的AND、OR和XOR操作通过对操作数运算,直接对结果变量的每一位分别处理。正是因为这一原因(还有其它一些原因),位操作通常不像关系和逻辑运算符那样用在条件语句中,我们可以用例子说明这一点:定X = 7,那么x && 8为Ture( 1 ) ,而x & 8却为Flase( 0 )。

记住,关系和逻辑操作符结果不是0就是1。而相似的位操作通过相应处理,结果可为任意值。换言之,位操作可以有0或1以外的其它值,而逻辑运算符的计算结果总是0或1。

移位操作符>>和<<将变量的各位按要求向或向左移动。右移语句通常形式是:

variable >>右移位数

左移语句是:

variable << 左移位数

当某位从一端移出时,另一端移入0(某些计算机是送1,详细内容请查阅相应C编译程序用户手册)。切记:移位不同于循环,从一端移出的位并不送回到另一端去,移去的位永远丢失了,同时在另一端补0。

移位操作可对外部设备(如D/A转换器)的输入和状态信息进行译码,移位操作还可用于整数的快速乘除运算。如表2 - 9所示(定移位时补0),左移一位等效于乘2,而右移一位等效于除以2。

表2-9 用移位操作进行乘和除

字符x 每个语句执行后的x x的值

x=7 00000111 7

x<<1 00001110 14

x<<3 01110000 112

x<<2 11000000 192

x>>1 01100000 96

x>>2 00011000 24

每左移一位乘2,注意x < < 2后,原x的信息已经丢失了,因为一位已经从一端出,每右移一位相当于被2除,注意,乘后再除时,除操作并不带回乘法时已经丢掉的高位。

反码操作符为~。~的作用是将特定变量的各位状态取反,即将所有的1位置成0,所有的0位置成1。

位操作符经常用在加密程序中,例如,若想生成一个不可读磁盘文件时,可以在文件上做一些位操作。最简单的方法是用下述方法,通过1的反码运算,将每个字节的每一位取反。

原字节 00101100

第一次取反码 11010011

第二次取反码 00101100

注意,对同一行进行连续的两次求反,总是得到原来的数字,所以第一次求反表示了字节的编码,第二次求反进行译码又得到了原来的值。

可以用下面的函数encode( )对字符进行编码。

[例2 - 5 ]

char encode(ch)

char ch;

{

return (~ch);

}

2.6.5 ?操作符

C语言提供了一个可以代替某些if - then - else语句的简便易用的操作符?。该操作符是三元的,其一般形式为:

EXP1? EXE2: EXP3

EXP1,EXP2和EXP3是表达式,注意冒号的用法和位置。

操作符“?”作用是这样的,在计算EXP1之后,如果数值为True,则计算EXP2,并将结果作为整个表达式的数值;如果E XP1的值为Flase,则计算EXP3,并以它的结果作为整个表达式的值,请看下例:

x = 10;

y = x> 9? 100: 200;

例中,赋给y的数值是100,如果x被赋给比9小的值,y的值将为200,若用if - else语句改写,有下面的等价程序:

x = 10;

if(x>9) y=100;

else y=200;

有关C语言中的其它条件语句将在第3章进行讨论。

2.6.6 逗号操作符

作为一个操作符,逗号把几个表达式串在一起。逗号操作符的左侧总是作为void(无值),这意味着其右边表达式的值变为以逗号分开的整个表达式的值。例如:

x = ( y = 3 , y + 1 ) ;

这行将3赋给y,然后将4赋给x,因为逗号操作符的优先级比赋值操作符优先级低,所以必须使用括号。

实际上,逗号表示操作顺序。当它在赋值语句右边使用时,所赋的值是逗号分隔开的表中最后那个表达式的值。例如,

y = 10;

x = (y = y - 5 , 2 5 / y ) ;

执行后,x的值是5,因为y的起始值是1 0,减去5之后结果再除以2 5,得到最终结果。

在某种意义上可以认为,逗号操作符和标准英语的and是同义词。

2.6.7 关于优先级的小结

表2 - 1 0列出了C语言所有操作符的优先级,其中包括将在本书后面讨论的某些操作符。注意,所有操作符(除一元操作符和?之外)都是左结合的。一元操作符( *,&和-)及操作符“?”则为右结合。

表2-10 C语言操作符的优先级

最高级 ()[] →

!~ ++ -- -(type) * & sizeof

* / %

+ -

<< >>

<= >=

== !=

& ^ |

&&

||

?

= += -= *= /=

最低级,

2.7 表达式

表达式由运算符、常量及变量构成。C语言的表达式基本遵循一般代数规则,有几点却是与C语言紧密相关的,以下将分别加以讨论。

2.7.1 表达式中的类型转换

混合于同一表达式中的不同类型常量及变量,应均变换为同一类型的量。C语言的编译程序将所有操作数变换为与最大类型操作数同类型。变换以一次一操作的方式进行。具体规则如下:

1 ) 所有char及short int 型量转为int型,所有float转换为double。

2) 如操作数对中一个为long double ,另一个转换为long double。① 要不然,一个为double,另一个转为doub le。② 要不然,一个为long,另一个转为long。③ 要不然,一个为unsigned,另一个转为unsigned。

一旦运用以上规则。每一对操作数均变为同类型。注意,规则2 )有几种必须依次应用的条件。

图2 - 1示出了类型转换。首先, char ch转换成int,且floatf 转换成double;然后ch /i的结果转换成doubl e,因为f * d是double;最后由于这次两个操作数都是double,所以结果也是double。.

2.7.2 构成符cast

可以通过称为cast的构成符强迫一表达式变为特定类型。其一般形式为:

(type)expression

( type)是标准C语言中的一个数据类型。例如,为确保表达式x / 2的结果具有类型float,可写为:

(float)x / 2

通常认为cast是操作符。作为操作符, cast是一元的,并且同其它一元操作符优先级相同。

虽然cast在程序中用得不多,但有时它的使用的确很有价值。例如,设希望用一整数控制循环,但在执行计算时又要有小数部分。

[例2 - 6 ]

main()

{

int i;

for(i+1;i<=100;++i)

printf("%d/2 is :%f",i,(float)i/2);

}

若没有cast( float),就仅执行一次整数除;有了cast就可保证在屏幕上显示答案的小数部分。

2.7.3 空格与括号

为了增加可读性,可以随意在表达式中插入tab和空格符。例如,下面两个表达式是相同的。

x = 10 / y *( 127 / x );

x = 10 / y *( 127 / x );

冗余的括号并不导致错误或减慢表达式的执行速度。我们鼓励使用括号,它可使执行顺序更清楚一些。例如,下面两个表达式中哪个更易读一些呢?

x = y / 2 - 34 * temp & 127;

x = ( y / 2 ) - ( ( 34 * temp) & 127);

2.7.4 C语言中的简写形式

C语言提供了某些赋值语句的简写形式。例如语句:

x = x + 10;

在C语言中简写形式是:

x + = 10;

这组操作符对+ =通知编译程序将X + 1 0的值赋予X。这一简写形式适于C语言的所有二元操作符(需两个操作数的操作符)。在C语言中,variable=variable1 operator expression;与variable1 operator=expression相同。

请看另一个例子:

x = x - 1 0 0 ;

其等价语句是

x - = 100;

简写形式广泛应用于专业C语言程序中,希望读者能熟悉它。

打印机不打测试页

概念性的东西就是以下内容:简单的来说,就是一种传输协议发出的一段数据源传输控制协议(Transmission Control Protocol, TCP)

TCP协议主为了在主机间实现高可靠性的包交换传输协议。本文将描述协议标准和实现的一些方法。因为计算机网络在现代社会中已经是不可缺少的了,TCP协议主要在网络不可靠的时候完成通信,对军方可能特别有用,但是对于和商用部门也适用。TCP是面向连接的端到端的可靠协议。它支持多种网络应用程序。TCP对下层服务没有多少要求,它定下层只能提供不可靠的数据报服务,它可以在多种硬件构成的网络上运行。下面的图是TCP在层次式结构中的位置,它的下层是IP协议,TCP可以根据IP协议提供的服务传送大小不定的数据,IP协议负责对数据进行分段,重组,在多种网络中传送。

TCP的上面就是应用程序,下面是IP协议,上层接口包括一系列类似于操作系统中断的调用。对于上层应用程序来说,TCP应该能够异步传送数据。下层接口我们定为IP协议接口。为了在并不可靠的网络上实现面向连接的可靠的传送数据,TCP必须解决可靠性,流量控制的问题,必须能够为上层应用程序提供多个接口,同时为多个应用程序提供数据,同时TCP必须解决连接问题,这样TCP才能称得上是面向连接的,最后,TCP也必须能够解决通信安全性的问题。

网络环境包括由网关(或其它设备)连接的网络,网络可以是局域网也可以是一些城域网或广域网,但无论它们是什么,它们必须是基于包交换的。主机上不同的协议有不同的端口号,一对进程通过这个端口号进行通信。这个通信不包括计算机内的I/O操作,只包括在网络上进行的操作。网络上的计算机被看作包传送的源和目的结点。特别应该注意的是:计算机中的不同进程可能同时进行通信,这时它们会用端口号进行区别,不会把发向A进程的数据由B进程接收的。

进程为了传送数据会调用TCP,将数据和相应的参数传送给TCP,于是TCP会将数据传送到目的TCP那里,当然这是通过将TCP包打包在IP包内在网络上传送达到的。接收方TCP在接收到数据后会通信上层应用程序,TCP会保证接收数据顺序的正确性。虽然下层协议可能不会保证顺序是正确的。这里需要说明的是网关在接收到这个包后,会将包解开,看看是不是已经到目的地了,如果没有到,应该走什么路由达到目的地,在决定后,网关会根据下一个网络内的协议情况再次将TCP包打包传送,如果需要,还要把这个包再次分成几段再传送。这个落地检查的过程是一个耗时的过程。从上面,我们可以看出TCP传送的基本过程,当然具体过程可能要复杂得多。

在实现TCP的主机上,TCP可以被看成是一个模块,和文件系统区别不大,TCP也可以调用一些操作系统的功能,TCP不直接和网络打交道,控制网络的任务由专门的设备驱动模块完成。TCP只是调用IP接口,IP向TCP提供所有TCP需要的服务。通过下图我们可以更清楚地看到TCP协议的结构。

上面已经说过了,TCP连接是可靠的,而且保证了传送数据包的顺序,保证顺序是用一个序号来保证的。响应包内也包括一个序列号,表示接收方准备好这个序号的包。在TCP传送一个数据包时,它同时把这个数据包放入重发队列中,同时启动记数器,如果收到了关于这个包的确认信息,将此包从队列中删除,如果计时超时则需要重新发送此包。请注意,从TCP返回的确认信息并不保证最终接收者接收到数据,这个责任由接收方负责。

每个用于传送TCP的通道都有一个端口标记,因为这个标记是由每个TCP终端确定的,因此TCP可能不唯一,为了保证这个数值的唯一,要使用网络地址和端口号的组合达到唯一标识的目的,我们称这个为了套接字(Socket),一个连接由连接两端的套接字标识,本地的套接字可能和不同的外部套接字通信,这种通信是全双工的。

通过向本地端口发送OPEN命令及外部套接字参数建立连接,TCP返回一个标记这个连接的名称,以后如果用户需要使用这个名称标记这个连接。为了保存这个连接的信息,我们设有一个称为传输控制块(Transmission Control Block,TCB)的东西来保存。OPEN命令还指定这个连接的建立是主动请求还是被动等待请求。下面我们要涉及具体的功能了,TCP段以internet数据报的形式传送。IP包头传送不同的信息域,包括源地址和目的地址。TCP头跟在internet包头后面,提供了一些专用于TCP协议的信息。下图是TCP包头格式图:

源端口:16位;

目的端口:16位

序列码:32位,当SYN出现,序列码实际上是初始序列码(ISN),而第一个数据字节是ISN+1;

确认码:32位,如果设置了ACK控制位,这个值表示一个准备接收的包的序列码;

数据偏移量:4位,指示何处数据开始;

保留:6位,这些位必须是0;

控制位:6位;

窗口:16位;

校验位:16位;

优先指针:16位,指向后面是优先数据的字节;

选项:长度不定;但长度必须以字节记;选项的具体内容我们结合具体命令来看;

填充:不定长,填充的内容必须为0,它是为了保证包头的结合和数据的开始处偏移量能够被32整除;

 

我们前面已经说过有一个TCB的东西了,TCB里有存储了包括发送方,接收方的套接字,用户的发送和接收的缓冲区指针等变量。除了这些还有一些变量和发送接收序列号有关:

发送序列变量

SND.UNA - 发送未确认

SND.NXT - 发送下一个

SND.WND - 发送窗口

SND.UP - 发送优先指针

SND.WL1 - 用于最后窗口更新的段序列号

SND.WL2 - 用于最后窗口更新的段确认号

ISS - 初始发送序列号

 

接收序列号

RCV.NXT - 接收下一个

RCV.WND - 接收下一个

RCV.UP - 接收优先指针

IRS - 初始接收序列号

下图会帮助您了解发送序列变量间的关系:

当前段变量

SEG.SEQ - 段序列号

SEG.ACK - 段确认标记

SEG.LEN - 段长

SEG.WND - 段窗口

SEG.UP - 段紧急指针

SEG.PRC - 段优先级

连接进程是通过一系列状态表示的,这些状态有:LISTEN,SYN-SENT,SYN-RECEIVED,ESTABLISHED,FIN-WAIT-1,FIN-WAIT-2,CLOSE-WAIT,CLOSING,LAST-ACK,TIME-WAIT和 CLOSED。CLOSED表示没有连接,各个状态的意义如下:

LISTEN - 侦听来自远方TCP端口的连接请求;

SYN-SENT - 在发送连接请求后等待匹配的连接请求;

SYN-RECEIVED - 在收到和发送一个连接请求后等待对连接请求的确认;

ESTABLISHED - 代表一个打开的连接,数据可以传送给用户;

FIN-WAIT-1 - 等待远程TCP的连接中断请求,或先前的连接中断请求的确认;

FIN-WAIT-2 - 从远程TCP等待连接中断请求;

CLOSE-WAIT - 等待从本地用户发来的连接中断请求;

CLOSING - 等待远程TCP对连接中断的确认;

LAST-ACK - 等待原来发向远程TCP的连接中断请求的确认;

TIME-WAIT - 等待足够的时间以确保远程TCP接收到连接中断请求的确认;

CLOSED - 没有任何连接状态;

TCP连接过程是状态的转换,促使发生状态转换的是用户调用:OPEN,SEND,RECEIVE,CLOSE,ABORT和STATUS;传送过来的数据段,特别那些包括以下标记的数据段SYN,ACK,RST和FIN;还有超时,上面所说的都会时TCP状态发生变化。

 

下面的图表示了TCP状态的转换,但这图中没有包括错误的情况和错误处理,不要把这幅图看成是总说明了。

 

3.3. 序列号

请注意,我们在TCP连接中发送的字节都有一个序列号。因为编了号,所以可以确认它们的收到。对序列号的确认是累积性的,也就是说,如果用户收到对X的确认信息,这表示在X以前的数据(不包括X)都收到了。在每个段中字节是这样安排的:第一个字节在包头后面,按这个顺序排列。我们需要认记实际的序列空间是有限的,虽然很大,但是还是有限的,它的范围是0到2的32次方减1。我想熟悉编程的一定知道为什么要在计算两个段是不是相继的时候要使用2的32次方为模了。TCP必须进行的序列号比较操作种类包括以下几种:

(a) 决定一些发送了的但未确认的序列号;

(b) 决定所有的序列号都已经收到了;

(c) 决定下一个段中应该包括的序列号。

对于发送的数据TCP要接收确认,处理确认时必须进行下面的比较操作:

SND.UNA = 最老的确认了的序列号;

SND.NXT = 下一个要发送的序列号;

SEG.ACK = 接收TCP的确认,接收TCP期待的下一个序列号;

SEG.SEQ = 一个数据段的第一个序列号;

SEG.LEN = 数据段中包括的字节数;

SEG.SEQ+SEG.LEN-1 = 数据段的最后一个序列号。

请注意下面的关系:

SND.UNA < SEG.ACK =< SND.NXT

如果一个数据段的序列号小于等于确认号的值,那么整个数据段就被确认了。而在接收数据时下面的比较操作是必须的:

RCV.NXT = 期待的序列号和接收窗口的最低沿;

RCV.NXT+RCV.WND-1 = 最后一个序列号和接收窗口的最高沿;

SEG.SEQ = 接收到的第一个序列号;

SEG.SEQ+SEG.LEN-1 = 接收到的最后一个序列号;

 

上面几个量有如下关系:

RCV.NXT =< SEG.SEQ < RCV.NXT+RCV.WND 或 RCV.NXT =< SEG.SEQ+SEG.LEN-1 < RCV.NXT+RCV.WND

测试的第一部分是检查数据段的开始部分是否在接收窗口中,第二部分是检查数据段的结束部分是否也在接收窗口内;上面两个检查通过任何一个就说明它包括窗口要求的数据。实际中的情况会更复杂一些,因为有零窗口和零数据段长,因此我们有下面四种情况:

段长度

接收窗口

测试

0

0

SEG.SEQ = RCV.NXT

0

>0

RCV.NXT =< SEG.SEQ < RCV.NXT+RCV.WND

>0

0

不可接受

>0

>0

RCV.NXT =< SEG.SEQ < RCV.NXT+RCV.WND或RCV.NXT =< SEG.SEQ+SEG.LEN-1 < RCV.NXT+RCV.WND

请注意接收窗口的大小可以为零,在窗口为零时它只用来接收ACK信息,因此对于一个TCP来说,它可以使用零大小窗口在发送数据的同时接收数据。即使接收窗口的大小为零,TCP必须处理所有接收到信息的RST和URG域。

我们也应用计数的方式保护了一些特定的控制信息,这是通过隐式地使用一些控制标记使数据段能够可靠地重新发送(或确认)为达到的。控制信息并不在段数据空间中传送,因此,我们必须用隐式指定序列号进行控制。SYN和FIN是需要保护的控制量,这两个控制量也只在连接打开和关闭时使用。SYN被认为是在第一个实际数据之间的数据,而FIN是最后一个实际数据之后的数据。段长度(SEG.LEN)包括数据和序列号空间,如果出现了SYN,那么SEG.SEQ是SYN的序列号。

初始序列号选择

协议对于特定连接被重复使用没有什么限制。连接是由一对套接字定义的。新的连接实例被定义为连接的另一次恢复,这就带来了问题:TCP如果确定多个数据段是从以前连接的另一次恢复中取得的呢?这个问题在连接迅速打开和关闭,或因为内存原因被关闭然后又迅速建立后显示特别突出。

为了避免混乱,用户必须避免因此恢复使用某一连接,而使序列号发生混乱。我们必须保证序列号的正确性,即使TCP失败,根本不知道以前的序列号是什么的情况下也要保证序列号的正确性。当新的连接被创建时,产生一个新的初始序列号(ISN)产生子,它用来选择一个新的32位ISN。产生子和32位时钟的低度位字节相关,低位字节的刷新频率大概是4微秒,因此ISN的循环时间大概是4.55小时。因此我们把网络包的最长生存时间(MSL)小于4.55小时,因此我们可以认为ISN是唯一的。对于每个连接都有发送序列号和接收序列号,初始发送序列号(ISS)由发送TCP选择,而初始接收序列号是在连接建立过程中产生的。

对于将要连接或初始化的连接,两个TCP必须和对方的初始序列号同步。这通过交换一个控制位SYN和初始序列号完成。我们把带有SYN的数据段称为"SYNs"。同步的获得过程这里就不重复了,每方必须发送自己的序列号并返回对对方序列号的确认。

1) A --> B SYN 本方序列号是X

2) A <-- B ACK 本方序列号被确认

3) A <-- B SYN 对方序列号是Y

4) A --> B ACK 确认对方序列号

上面的第2步和第3步可以合并,这时可以成为3阶段,所以我们可以称它为三消息握手。这个过程是必须的,因为序列号不和全局时钟关联,TCP也可以有不同的机制选择ISN。接收到第一个SYN的接收方不可能知道这个数据段是不是被延时,除非它记住了在连接上使用的最近的序列号(这通常是不可能的),因此它必须要求发送者确认。

为了保证TCP获得的确认是刚才发送的段产生的,而不是仍然在网络中的老数据段产生的,因此TCP必须在MSL时间之内保持沉默。在本文中,我们设MSL=2小时,这是出于工程的需要,如果用户觉得可以,他可以改变MSL。请注意如果TCP重新初始化,而内存中的序列号正在使用,不需要等待,但必须确认使用的序列号比当前使用的要大。

如果一台主机在未保留任何序列号的情况下失败,那么它应该在MSL时间之内不发出任何数据段。下面将会这一情况进行说明。TCP的实现可以不遵守这个规定,但是这会造成老数据被当成新数据接收,而新数据被当成老数据拒绝的情况。

每当数据段形成并进入输出队列,TCP会为它指定序列空间中的一个值。TCP中多复本检测和序列算法都依赖于这个地址空间,在对方发送或接收之前不会超过2的32次方个包存在于输出队列中。所有多余的数据段都会被删除。如果没有这个规定,会出现多个数据段被指定同一个序列号的情况,会造成混乱。数据段中序列号的多少和数据段中的字节数一样多。

在通常情况下,TCP保留下一个要发送的序列号和还未确认的最老的序列号,不要在没有确认的时候就再次使用,这样会有些风险,也正是因为这样的目的,所以序列空间很大。对于2M的网络,要4.5小时来耗尽序列空间,因为一个数据段可能的最大生存时间也不过十几分之一秒,这就留下了足够的空间;而在100M的网络上需要5.4分钟,虽然少了点,但也可以了。

如果在实现TCP时没有为保存序列号留下空间,那清除多余的包可能就不能实现了,因此推荐这种类型的TCP实现最好在失败后等待MSL时间,这样保证多余的包被删除。这种情况有时候也可能会出现在保留序列号的TCP实现中。如果TCP在选择一个另一个TCP连接正在使用的序列号时,这台主机突然失败了,这就产生了问题。这个问题的实质在于主机不知道它失败了多久,也不知道多余的复本是不是还在网络中。

处理这种问题的方法是等待MSL时间,如果不这样就要冒着对方错误接收数据的危险,要等待的时间也就称为“沉默时间”。实现者可以让用户选择是不是等待,但是无论用户如何也不见得非要等待MSL时间。

3.4. 建立一个连接

建立连接应用的是三消息握手。如果双方同时都发送SYN也没有关系,双方会发现这个SYN中没有确认,于是就知道了这种情况,通常来说,应该发送一个"reset"段来解决这种情况。三消息握手减少了连接失败的可能性。下面就是一个例子,在尖括号是的就是数据段中的内容和标记。其它的就不多说了。

在第2行,TCP A发送SYN初始化序列号,表示它要使用序列号100;第3行中,TCP B给出确认,并且期待着A的带有序列号101的数据段;第4行,TCP A给出确认,而在第5行,它也给出确认,并发送了一些数据,注意第4行的序列号与第5号的一样,因为ACK信息不占用序列号空间内的序列号。同时产生请求的情况如下图所示,只复杂一点。

使用三消息握手的主要原因是为了防止使用过期的数据段。为了这个目的,必须引入新的控制消息,RESET。如果接收TCP处理非同步状态,在接收到RESET后返回到LISTEN状态。如果TCP处理下面几种状态ESTABLISHED,FIN-WAIT-1,FIN-WAIT-2,CLOSE-WAIT,CLOSING,LAST-ACK,TIME-WAIT时,放弃连接并通过用户。我们下面就详细说明后一种情况。

通过上面的例子,我们可以看出TCP连接是如何从过期数据段的干扰下恢复的。请注意第4行和第5行中的RST(RESET信号)。

半开连接和其它非正常状态

如果一方在未通过另一方的情况下关闭连接,或双方虽然失败而不同步的情况我们称为半开连接状态。在一方试图发送数据时连接会自动RESET。然而这种情况毕竟属于不正常情况。应该做出相应的处理。如果A处的连接已经关闭,B处并不知道。当B希望发送数据到A时,就会收到RESET信号,表示这个TCP连接有误,要中止当前连接。

设A和B两个进程相互通信的时候A的TCP发生了失败,A依靠操作系统支持TCP的存在,通常这种情况下会有恢复机制起作用,当TCP重新恢复的时候,A可能希望从恢复点开始工作。这样A可能会试图OPEN连接,然后在这个它认为还是打开的连接上传送数据,这时A会从本地(也就是A的)TCP上获得错误消息“未打开连接”。A的TCP将发送包括SYN的数据段。下面的例子将显示这一过程:

上面这个例子中,A方收到的信息并没有确认任何东西,这时候A发现出了问题,于是发送了RST控制信息。另一种情况是发生在A失败,而B方仍然试图发送数据时,下面的例子可以表示这种情况,请注意第2行中A对B发送来的信息不知所云。

在下面的例子中,A方和B方进行的被动连接,它们都在等待SYN信息。过期的包传送到B方使B回应了,而收到回应的A却发现不对头,传送RST控制信息,B方返回被动LISTEN状态。

现实中的情况太多了,我们列举一些产生RST控制信息的规则如下:通常情况下,RST在收到的信息不是期待的信息时产生。如果在不能确定时不要轻易发送RST控制信息。下面有三类情况:

如果连接已经不存在,而发送来的消息又不是RST,那么要返回RST。如果想拒绝对不存在的连接进行SYN,可以使用这种办法。如果到达的信息有一个ACK域,返回的RST信息可以从ACK域中取得序列号,如果没有这个域,就把RST的序列号设置为0,ACK域被设备为序列号和到达段长度之和。连接仍然处于CLOSE状态。

如果连接处于非同步状态(LISTEN,SYN-SENT,SYN-RECEIVED),而且收到的确认是对未发出包的确认或是接收到数据段的安全级别与不能连接要求的相一一致时,就发送RST。如果SYN未被确认时,而且收到的数据段的优先级比要求的优先级要高,那么要么提高本地优先级(得事先征得用户和系统的许可)要么发送RST;如果接收数据段的优先级比要求的优先级低,就算是匹配了,当然如果对方发现优先级不对提高了优先级,在下一个包中提高了优先级,这就不算是匹配了。如果连接已经进入SYN,那么接收到数据段的优先级必须和本地优先级一样,否则发送RST。如果到达的信息有一个ACK域,返回的RST信息可以从ACK域中取得序列号,如果没有这个域,就把RST的序列号设置为0,ACK域被设备为序列号和到达段长度之和。连接仍然处于与原来相同的状态。

如果连接处于同步状态(ESTABLISHED,FIN-WAIT-1,FIN-WAIT-2,CLOSE-WAIT,CLOSING,LAST-ACK,TIME-WAIT),任何超出接收窗口的序列号的数据段都产生如下结果:发出一个空确认数据段,此段中包括当前发送序列号,另外还包括一个确认指出希望接收的下一个数据段的序列号,连接仍然保存在原来的状态。如果因为安全级,优先级之类的问题,那就发送RST信号然后进入CLOSED状态。

通讯rxtx硬件原理

安装程序时,在安装完之后可以选择打印测试页,一般都会要求校验打印纸位置,检查是不是位置对应好,还有就是看看墨盒有没有装好。当然,你要确定你是安装程序是肯定对应型号的,最好就是原带安装盘,其次是去下对应型号的驱动,其他的驱动一般都不可以的..

VB 返回打印机状态

通讯rxtx硬件原理是通过串口通信实现计算机与外设之间的数据交互。具体来说,计算机通过串口向外设发送数据,外设通过串口返回数据给计算机。RXTX硬件原理中,串口是一个标准的通信接口,通常使用DB9或DB25连接器,它们包含了多条数据信号线和控制信号线,用于传输和控制数据的传输。而RXTX则是一种Ja通讯库,可以实现串口的读写操作。

在RXTX硬件原理中,通信过程可以分为三个阶段:发送、接收和处理。首先,计算机通过串口向外设发送数据,数据经过串口线路传输到外设,外设接收到数据后进行处理。然后,外设通过串口将处理后的数据返回给计算机,计算机接收到数据后进行处理。最后,计算机根据接收到的数据进行进一步的处理,比如显示、存储等操作。

需要注意的是,不同的外设对串口的支持程度不同,有些外设需要编写相应的驱动程序才能正常工作,而有些外设则可以直接使用操作系统提供的通用串口驱动程序。同时,在使用RXTX进行串口通信时,需要注意串口的设置,比如波特率、数据位、校验位等,以确保通信的正确性。

总之,RXTX硬件原理是通过串口通信实现计算机与外设之间的数据交互,它的使用需要注意串口设置和外设支持情况。

tsc打印机间距如何调整

VB 通过MSComm控件取得打印机的状态:正常、缺纸、卡纸等:

此方法使用VB中的串口通信控件MSComm给打印机发送指令,然后打印机自动返回其状态值,根据不同的返回值就可以判断打印机是正常、缺纸、卡纸等状态。其中的指令适用于Star SP500系列。注意在使用此方法时不要安装打印机的驱动,或者在驱动中设置的串口端口与此程序中的要不能相同,否则程序会提示参数设置错误,其实就是端口已经被占用的原因。以下是程序代码:

Option Explicit

Dim Status As String

Dim StatusString As String

Dim TimeUp As Boolean

Private Sub Command1_Click()Sub Command1_Click()Sub Command1_Click()Sub Command1_Click()

On Error Resume Next

Dim i As Long

Status = "" '状态返回值

StatusString = ""

MSComm1.CommPort = 1 'COM端口号:如果是COM1则为1,以此类推;

MSComm1.Settings = "38400,N,8,1" '参数设置:波特率,奇偶校验,数据位,停止位;

MSComm1.InputLen = 0

MSComm1.PortOpen = True '打开端口

'给Star打印机发送“ENQ”指令或“ESC ACK SOH”指令,打印机自动返回状态值

MSComm1.Output = Chr$(5) + Chr$(&HA) + Chr$(0)

'MSComm1.Output = Chr$(&H1B) + Chr$(&H6) + Chr$(&H1)

' Poll for 8 byte status

Do While Len(Status) < 8

DoEvents

Status = MSComm1.Input

Loop

For i = 1 To 9

StatusString = StatusString & Right("00" & " " & Hex(Asc(Mid$(Status, i, 1))), 2)

'StatusString = StatusString & Hex(Asc(Mid$(Status, i, 1))) & " "

Next i

Text1.Text = StatusString

MSComm1.PortOpen = False

End Sub

Private Sub Form_Unload()Sub Form_Unload()Sub Form_Unload()Sub Form_Unload(Cancel As Integer)

Close

End Sub

Private Sub Wait()Sub Wait()Sub Wait()Sub Wait(Interval As Long)

Timer1.Interval = Interval

Timer1.Enabled = True

TimeUp = False

Do

DoEvents

Loop While Not TimeUp

End Sub

Private Sub Timer1_Timer()Sub Timer1_Timer()Sub Timer1_Timer()Sub Timer1_Timer()

Timer1.Interval = 0

Timer1.Enabled = False

TimeUp = True

End Sub

----------------------------------------------------------------------

2号代码:

Option Explicit

Declare Function MapPhysToLin Lib "WinIo.dll" (ByVal PhysAddr As Long, ByVal PhysSize As Long, ByRef PhysMemHandle) As Long

Declare Function UnmapPhysicalMemory Lib "WinIo.dll" (ByVal PhysMemHandle, ByVal LinAddr) As Boolean

Declare Function GetPhysLong Lib "WinIo.dll" (ByVal PhysAddr As Long, ByRef PhysVal As Long) As Boolean

Declare Function SetPhysLong Lib "WinIo.dll" (ByVal PhysAddr As Long, ByVal PhysVal As Long) As Boolean

Declare Function GetPortVal Lib "WinIo.dll" (ByVal PortAddr As Integer, ByRef PortVal As Long, ByVal bSize As Byte) As Boolean

Declare Function SetPortVal Lib "WinIo.dll" (ByVal PortAddr As Integer, ByVal PortVal As Long, ByVal bSize As Byte) As Boolean

Declare Function InitializeWinIo Lib "WinIo.dll" () As Boolean

Declare Function ShutdownWinIo Lib "WinIo.dll" () As Boolean

Declare Function InstallWinIoDriver Lib "WinIo.dll" (ByVal DriverPath As String, ByVal Mode As Integer) As Boolean

Declare Function RemoveWinIoDriver Lib "WinIo.dll" () As Boolean

Public IOStat As Boolean

'************************************************************

'* 函数名称:GetPrnStat *

'* 功能:根据打印机的内存地址,检测打印机的目前工作状态 *

'* 参数:lptport: 要检测的打印机的端口号,如LPT1: *

'* 返回值:打印机的工作状态值。 *

'* 0:正常 1:缺纸 2:无联系 3:异常(其他错误) *

'* 调用:本模块中的API函数InitializeWinIo和GetPortVal *

'* 备注:检测的内存地址,是在打印端口所在的基地址上加1; *

'* 作者:谷霖 *

'* LPT1口的基地址为&H378;LPT2口的基地址为&H278 *

'************************************************************

Public Function GetPrnStat(ByVal LptPort As String) As Long

Dim PrnAddr As Long

On Error Resume Next

If IOStat = False Then IOStat = InitializeWinIo()

If IOStat Then

If UCase(LptPort) = "LPT1:" Then

PrnAddr = &H379

ElseIf UCase(LptPort) = "LPT2:" Then

PrnAddr = &H279

End If

GetPortVal PrnAddr, GetPrnStat, 1

Else

GetPrnStat = &HFF

End If

GetPrnStat = GetPrnStat And &HF8

Select Case GetPrnStat

Case &H68, &H58, &H70

GetPrnStat = 1 '缺纸

Case &H78

GetPrnStat = 2 '无联系

Case &HD8

GetPrnStat = 0 '正常

Case Else

GetPrnStat = 3 '异常

End Select

End Function

'*************************************************************************

'* 函数功能:检查打印机的状态主函数 *

'* 输入参数:PrintName 要检测的打印机名称 *

'* 输出参数:checkprinterr *

'* 检查结果(0:正常 1:打印机缺纸 2:打印机无联系 3:打印机异常 *

'* 4:没有安装打印机 5:打印机名称错误) *

'*************************************************************************

Public Function CheckPrintErr(ByVal PrintName As String) As Long

'CheckPrintErr参数说明

'0:没有错误

'1:打印机无联系

'2:打印机缺纸

'3:没有安装打印机

Dim printjieguo As Long

Dim i As Long, k As Long

On Error GoTo ErrCheckPrint

If Printers.Count = 0 Then

CheckPrintErr = 4 '没有安装打印机

Exit Function

End If

'检测打印机是否可以联系

For i = 0 To Printers.Count - 1

If (Printers(i).DeviceName = PrintName) Then

k = k + 1

Exit For

End If

Next

If k = 0 Then '打印机名称错误

CheckPrintErr = 5

Exit Function

End If

Set Printer = Printers(i)

CheckPrintErr = GetPrnStat(Printer.Port)

Exit Function

ErrCheckPrint:

CheckPrintErr = 3

Exit Function

End Function

----------------------------------------------------------------------

3号答案:

编写VB打印控制程序的几点心得

Visual Basic(VB)给用户提供了可视化编程环境,因其简单易学、功能强大而得到了广泛的应用。VB提供了两种实现打印的方法。一般在对打印质量要求不高的场合,或者是编程项目的早期开发过程中,可以直接使用VB窗体的Printform方法实现打印。用这种方法实现打印具有编程简单、易用并且功能强大的优点,它只需要通过一行代码,几乎能打印所有内容。实现的方法就是:首先将要打印的内容在屏幕上显示出来,然后开发人员只要为窗体对象激活 PrintForm ,窗体则自动将要打印的内容发送到Printer对象上,其语法格式如下:[窗体.]PrintForm 。如果窗体中包括图形,那么打印前应先置窗体的AutoRedraw属性为真。这种方法虽然简单,但是它却存在着内存消耗大、打印粗糙、速度慢等缺陷,尤其对于带有滚动条的图像,这种方法只能打印当前可视的区域 。在实际应用中经常会遇到对打印质量要求很高的场合,例如打印音乐五线谱,对打印的美观、清晰度以及音符符头的位置都有很严格的要求,这种应用场合若用VB提供的另一种基于Printer对象的打印方法则可以获得高分辨率的打印,得到很高的打印质量。在实际应用中,也可以根据实际应用情况将上述两种方法结合起来使用,即:前期工作使用PrintForm 简单的打印方法将窗体的布局定下来,后期再使用基于Printer对象的打印方法实现最终的打印工作。

2.高分辨率打印程序开发心得

⑴ Printer对象

VB的打印可以使用Printer对象。Printer对象是一个独立于打印机设备的封装,它可以代表不同的打印机,初始时,Printer对象为系统缺省的打印机,也可以使用下列语句:Set Printer=Printers(2) (其中2代表Printers集中的第二个打印机)对打印机进行指定。

Printer对象具备例如:ColorMode、Copies、Duplex、Printquality等控制打印机特征的属性, 提供了Newpage、EndDoc、KillDoc等控制打印过程的方法,以及大多数由窗体和框控件提供的图形属性和方法如:Currentx、Currenty、Textwidth、Textheight、Print、Pset、Line、PaintPicture和Circle等方法,它还拥有Font的所有属性。实现高分辨率的打印就是通过控制Printer对象的上述属性和方法完成的。

⑵ 直接利用Windows公用标准对话框CommonDialog控件打印VB为用户提供了Windows公用标准对话框CommonDialog控件:打开、文件另存为、颜色、字体、打印。CommonDialog控件在Visual Basic 和Microsoft Windows动态连接库Commdlg.dll例程之间提供了接口。利用公用标准对话框打印开发VB的打印程序,将大大缩短程序的开发周期。应用程序中要使用公用对话框,必须首先在工具箱中添加公用对话框控件。该动作通过激活部件对话框,选中Microsoft Common Dialog Control6.0, 单击确定即可。然后再将公用控件添加到窗体上并设置相应属性,该控件具有的属性有Color、Font、Print、Help等。

VB提供mnuFilePrint_Click()过程供用户添加开发的打印程序代码。

⑶ Printer对象控制打印的基本过程

利用Printer对象开发的打印程序主要靠其提供的——NewPage (打印新的一页,CurrentX、CurrentY置为新页的左上角,可完成多页功能。)、EndDoc (将打印任务加入打印机队列)、KillDoc (取消打印任务)控制打印过程的。一般情况下,打印程序完成多页打印时会多次执行NewPage,结束时执行一次EndDoc将打印任务加入打印机队列。如果你在NewPage后,立即使用EndDoc,VB则不会打印额外的空白页。如果希望显示空白页,则可在新的一页上只使用Printer.Print “ “打印空字符即可。

为了通过Printer对象实现文本和图形的打印,获得最好的打印质量,还需要对VB控制打印机的多种属性有更深入的理解,例如打印机的坐标体系向屏幕坐标体系的转换、打印机字体尺寸的确定等。下面给出了打印程序的主框架:

Private Sub mnuFilePrint_Click()

On Error Resume Next

If ActiveForm Is Nothing Then Exit Sub

With dlgCommonDialog ‘打印机公用对话框

.DialogTitle = "打印"

.CancelError = True

.Flags = 1

Printer.FontSize = dlgCommonDialog.FontSize

‘将打印机公用对话框设置的字体大小传递给打印机

.ShowPrinter ‘ 在屏幕上显示打印公用对话框

If Err <> MSComDlg.cdlCancel Then

Printer.FontTransparent = False ‘初始化打印的字体为不透明

SetPrinterScale Myform ‘匹配打印机的缩放属性与窗体的属性

PrintAnywhere Printer ‘可放置用户编写的打印对象参数化例程

‘实现字符和图形的显示

Printer.NewPage ‘打印机坐标初始化

PrintAnywhere Printer ‘打印另一页的内容

Printer.NewPage ‘打印机坐标初始化

Printer.EndDoc ‘将该任务加入打印机任务队列

‘ 不打印空白页

Printer.KillDoc ‘取消当前的打印任务

End If

End With

End Sub

⑷ 参数化绘图程序

用VB开发应用程序时,如果使用参数化绘图例程进行屏幕显示程序的开发,则在开发打印程序时,就不需再另行开发代码,从而避免了大量的重复劳动,有效地缩短了程序的开发周期。参数化绘图例程就是:在开发例程时,为每一个例行程序提供一个OBJECT类型的参数,调用程序通过向例程的OBJECT类型参数分别传递窗体、Printer对象,就可分别完成屏幕显示与打印机输出。 见如下示例:

Sub PrintAnywhere(Dest As Object)

Dest.Print “HELLO!”

Dest Is Printer Then

Printer.EndDoc

End If

End Sub

要完成屏幕上的输出,调用 PrintAnywhere Myform 即可,而调用 PrintAnywhere Printer则完成在打印机上输出。

⑸ 属性匹配与窗体缩放

因为控制打印机实际绘图区域大小的属性Height和Width,由目前正在使用的纸张决定,而且可打印的区域与纸张边缘有一定距离。因而为了获得正确的打印输出结果,不能简单地将Printer对象直接传递给绘图例行程序,还必须要解决打印机的缩放属性与显示窗体属性相匹配的问题。即:保证使窗体中的打印内容以正确的大小显示,并居于可打印区域的中间。实际上实现的是打印机的坐标体系向屏幕坐标体系的转换。具体过程是:使用打印机的ScaleX和ScaleY方法,获取以twip为单位的打印机尺寸,再利用窗体的ScaleX和ScaleY方法将这些尺寸转换为窗体中的坐标系统,从而实现以窗体的坐标系统提供打印机可打印区域大小的目的。然后,用这些尺寸作为打印机中新的ScaleWidth和ScaleHeight,即可实现属性匹配。

但是,我们在打印时,经常会遇到这样的场合——在不改变窗体形状的情况下,需要扩大或缩小窗体的大小。要完成这样的工作,不仅需要完成属性匹配,还要确定对象被缩放的系数。程序如下:

Private Sub SetPrinterScale(obj As Object)

Dim pwid As Single, phgt As Single, xmid As Single, ymid As Single

Dim owid As Single, ohgt As Single

owid = obj.ScaleX(obj.ScaleWidth, obj.ScaleMode, vbTwips)

ohgt = obj.ScaleY(obj.ScaleHeight, obj.ScaleMode, vbTwips)

‘获取窗体以Twips表示的尺寸

pwid = Printer.ScaleX(Printer.ScaleWidth, Printer.ScaleMode, vbTwips)

phgt = Printer.ScaleY(Printer.ScaleHeight, Printer.ScaleMode, vbTwips)

‘获取打印机以Twips表示的尺寸

If (ohgt / owid > phgt / pwid) Then

s = phgt / ohgt

Else

s = pwid / owid

End If ‘计算缩放因子

pwid = obj.ScaleX(pwid, vbTwips, obj.ScaleMode) / s

phgt = obj.ScaleY(phgt, vbTwips, obj.ScaleMode) / s

‘将打印机的尺寸转换成obj的坐标系统 / 缩放因子

x_mid = obj.ScaleLeft + obj.ScaleWidth / 2

y_mid = obj.ScaleTop + obj.ScaleHeight / 2‘设置打印区域的中心点坐标

Printer.Scale (x_mid - pwid / 2, y_mid - phgt / 2)-(x_mid + pwid / 2, y_mid + phgt / 2)

‘ 设置打印机中新的ScaleWidth和ScaleHeight

End Sub

⑹ 坐标定位

窗体、框控件以及Printer对象提供的TextWidth和 TextHeight方法在文本定位的应用方面很有用。TextWidth、 TextHeight分别以对象当前的刻度单位返回字符串的宽度和高度。但是必须注意很多字体中其字符宽度并不全部相同,所以不能简单地将单个字符的宽度乘以字符数来获得字符串的宽度。对那些没有TextWidth和TextHeight的控件可通过设置父窗体的Font属性,使其与该控件的属性相匹配,再利用父窗体的TextWidth和TextHeight获得它的字符串的宽度和高度。

但是,我们在完成屏幕显示程序调试后,在进行打印输出时却出现了屏幕显示与打印结果的不一致性的现象,表现在所打印的字体之间坐标关系与屏幕显示不一样,例如:屏幕显示上的两个字符不重叠,而打印出的字符却出现相互重叠的现象。经调试发现,问题出现在字体尺寸的确定上。 程序中,屏幕上显示的字符坐标是通过对象的TextWidth和TextHeight方法计算得来的,它直接受到字体尺寸大小的影响。VB向用户提供的字体是在用户需要的打印机点的范围内,如果你需要的字体大小为73点, 则打印出的实际字体大小为72.75。然而窗体、框控件的Fontsize只能是整数,例如它不能将字体的大小定为72.75,实际上这就造成了屏幕上显示字体与实际打印字体大小之间产生了误差。 我们用如下方法来解决该问题,就是在计算字体大小时,根据计算出来的字体尺寸,确定它存在的范围,然后再将它定位到VB提供的几种固定大小的字体上,而不是随意指定。当然,也可以有其它的解决办法。例如:字体大小选取偶数等。 由于篇幅所限,这里不再作介绍。

联想LJ2000打印机驱动已经安装好了,可一到打印时就显示错误,打印机也时正常亮灯,

TSCTPP-244Pro条码打印机无法自动调整间距怎么办?

你用的是什么软件?网上跑说明你软件里面的纸张尺寸及打印机里面的纸张设置不一致,软件及打印机里面需要根据标签纸的实际尺寸进行设置。这里以单排标签纸为例,演示下具体的操作方法:

根据以上尺寸标注,条码标签打印软件中默认单位为mm(毫米),那么在软件中可以做如下设置:

1、双击打开“中琅条码标签打印软件”,会首先出现“新建”字样,点击新建,第一个页面是设置打印机和纸张尺寸,可以点击“打印机”下方右侧小三角处选择合适的打印机。

其次,在下方“纸张”处点击右侧小三角,选择“自定义大小”,在下方宽度、高度框内手动输入相应的尺寸,纸张宽度是包含边距的整个宽度,也就是62mm,高度为标签纸的高度40mm。

2、点击“下一步”:进入行列设置页面,根据实际标签纸样式可得是一行一列,所以行列数均为1。

点击“下一步”:进入“页面边距”,从尺寸标注中可得,左右衬纸尺寸均为1mm。所以左右边距输入1即可。(由于纸张高度为40mm,是标签纸的准确高度,且是单排标签纸,所以没有上下边距,上下边距需默认为0)

3、点击“下一步”:进入标签尺寸和标签间距的设置。

标签尺寸:经过前面的设置,此处标签尺寸已经自动计算为正确的60*40的标签纸尺寸,且右侧预览效果和实际标签纸样式一致,此处“手工设置”可以不用勾选。

标签间距:由于是一行一列的单排标签纸,以一个标签为一张纸,此处标签间距也不需要设置,默认为0即可。

4、标签纸已经基本设置完毕,设置好纸张相关参数后,若不需要对其他的参数进行设置,也可以直接点击“完成”,提前结束纸张设置。(如果继续点击“下一步”会出现“打印顺序”“画布及边线”的界面,这两项在单排标签纸设置时一般不会用到,默认即可。)

标签纸尺寸设置好之后,就得到了一个60*40mm的和实际纸张相符的单排标签纸画布(如下图)。如果之前的设置需要修改,或者想要增加页码、顺序、或画布方面的设置,可以点击左上角的“文档设置”图标,修改相关的设置参数。

条码标签打印软件中设置好纸张尺寸后,就可以直接添加标签内容并连接打印机进行打印了。

如果在条码打印机或标签打印机的时候出现位置偏移或者是隔张打印的情况,一般是打印机纸张定位不准造成,可使用打印机自校验的方法解决,或者通过调整打印机首选项中纸张尺寸解决。打印机纸张尺寸调整方法如下:

在电脑上找到相应的打印机驱动,然后在打印机图标上右键选择“打印首选项”,在弹出窗口中可以点击“新建”,在弹出界面中输入实际标签纸尺寸及左右边距。

打印首选项“页面设置”的标签纸尺寸好之后,需点击“卷”,在类型处选择“有间距标签”,标签高度输入2毫米。然后点击“确定”即可。

tscttp-244pro标签打印机怎么调尺寸

1、打开电脑控制面板,找到对应的打印机。

2、鼠标右击打印机,选择打印首选项。

3、在上面菜单栏找到选项并点击。

4、在宽度和高度框里输入标签纸的尺寸后点击应用即可。

5、如果有2种以上的标签纸尺寸,点击标签库,再点击新建。

6、输入条码名称和尺寸点击确定,这样就已建好一个标签纸的尺寸。

7、在选项菜单栏里就可以随意切换已建好的条码纸尺寸。

tsc245条码打印机走纸错位怎么调

在使用中琅条码标签打印软件连接标签打印机打印的时候,有些用户常会遇到打印错位的问题。一般这种情况是在更换标签纸或者是碳带后出现的。更换纸张后没有进行测纸、或者是没有更改打印机属性中的纸张规格。不同的打印机测试或初始化的方法也不相同。对于TSCTTP-244Pro标签打印机,可以使用如下方法进行重置或测纸。以调整打印位置。

1、TSCTTP-244Pro测纸方法。

在更换过纸张或者碳带后,最好是先测纸,让打印机重新检测纸张,调整到对应这种规格标签的打印位置。

关闭条码标签打印机后,按住“暂停(或PAUSE)”键不放,然后再打开打印机电源开关,等机器出纸后,松开“PAUSE”键。打印机会自动走纸,直到走纸停下,且打印机上的绿灯正常亮起后,就完成了测纸。然后按“进制(FEED)”键,每按一下进纸键,就会出一张纸,注意看下所有出纸的距离或出纸结束的位置是否一致,位置是否正确(停在每个标签的间距上)。如没问题,就可以按照正常的方法,在条码打印软件中设置打印标签了。

如果测纸后,按进纸,发现出纸位置不对,就重新做一遍测纸,如果还是不对,就将条码标签打印机恢复出厂设置(或初始化)。在进行测试打印。

2、TSCTTP-244Pro标签打印机恢复出厂设置(初始化)的方法。

关闭打印机的状态下(打印机关机),同时按住打印机上的“暂停(PAUSE)+进纸(FEED)”键,开启打印机电源,等打印机上的3指示灯轮流闪烁一次或一次以上后,松开2个按键。当打印机上的2个绿色指示灯都亮后,机器就完成了初始化设置。

在进行打印机初始化或者测纸前,要保证打印机的纸张、碳带等耗材安装正确。并保证这些耗材是配套的,并可以在该打印机上使用。打印机上的设置完成后,如果还是会出现打印错位,就要考虑电脑上的条码标签打印软件中的纸张尺寸设置和打印机首选项中的设置了。在软件中针对标签打印机的设置,要注意纸张尺寸是一行标签的尺寸,并且在布局中页边距都设置成0。标签间距在打印机首选项中输入。具体的设置方法,在之前的《如何设置单排标签纸》中有介绍过可以参考,这里不再介绍。

如何调整打印机打印出文件的间距?

通过word打印时,对打印选项进行设置来达到需要的效果。具体操作步骤如下:

1、在电脑桌面找到需要打印的word文档,双击打开word文档,如下图所示。

2、在打开的word文档中,点度击左上方的下拉菜单按钮,如下图所示。

3、在出现的下拉菜单中选择打印选项,点击进入打印界面,如下图所示。

4、在打印界面选择好打印机名称后内,点击打印机名称右边的属性,进入属性设置界面,如下图所示。

5、在打印机属性界面,选择效果选项,进入效果设置界面,如下图所示。

6、在效果设置界面,在调整尺寸选项中选择“正常尺寸的%”这个选项,如下图所示。

7、在“正常尺寸的%”下方的输出框中输入打印比例,并点击下方的确定按钮,完成比例设置,如下图所示。

8、完成比例设置后,点击打印机界容面的确定按钮,对该文档进行打印。即可打印出需要的效果,如下图所示。

扩展资料:

打印机日常使用注意事项

1、耗材方面,一定要使用原装耗材

每个型号的机器由于各方面性能差异,导致其墨粉性质差距巨大。经常使用代用墨粉所带来的最终结果就是导致机器的使用寿命大大降低。就像设计使用号汽油的车,却经常使用92号的汽油,甚至经常去私人加油站的劣质油,发动机的寿命一定会受到影响。

2、纸张方面

尽量使用杂质较少、韧性较好、挺度较高、表面平滑的木浆纸。较好的纸不光能显著提升搓纸轮、供纸辊、鼓体的使用寿命,而且还可以大大减少因纸张杂质带来的污染。

3、能批量打印/复印的的尽量不要单张

连续复印能减少墨粉的消耗以及鼓体、显影、转印以及各个驱动部件的磨损,有利于降低使用成本和故障率。

4、断电

节日等长时间不用时候记得断电,减少能耗的同时,还能更安全、放心。

故障一、打印机无法打印

故障现象:联想LJ2000P型激光打印机开机后没有反应或无法打印。

故障分析:引起此故障的可能原因有以下几种:

1.打印机电源没有接通、打印机电源开关未打开、打印机数据电缆的连接不正确;

2.打印机进纸盒中没有纸,打印机内有卡纸,感光鼓组件有问题;

3.应用程序有问题或存在;

4.硬盘剩余空间过小导致打印机不能打印或未将当前打印机设置为默认打印机;

5.当前打印机已被设置为暂停打印;

6.打印机驱动程序不合适以及配置不正确;

7.BIOS中打印机端口未能打开;

8.打印机驱动程序未正确安装或损坏;

9.打印机硬件出现故障。

故障检修方法:首先对打印机电源及电缆的连接进行检查,没有发现问题,接下来对进出纸路及感光鼓和硬盘进行检查,都没有问题,然后用杀毒软件对进行杀毒处理也没有效果。选择“开始/设置/打印机”,检查当前使用的打印机图标有一黑色的小钩,说明该机已被设置了默认打印机。再作进一步检查,发现驱动程序的选择不正确。在应用软件中选择联想LJ2000P的正确驱动程序后,故障排除。

检修经验:在使用串口打印时,如果打印机上的串口开关位置及DIP开关设置的接口参数不正确的话也会出现这种故障。

故障二、频繁出现更换碳粉报警

故障现象:联想LJ6P激光打印机在碳粉还未完全用完时,即频繁进行更换碳粉报警。

故障分析:如果此时更换碳粉盒,就会有大量的碳粉被浪费。联想LJ6P激光打印机检测碳粉是否用完是用光电传感器来实现,它根据碳粉的位置进行检测。只要对光电传感器进行屏蔽,就可以消除报警情况。

故障检修方法:拆开机盖,取出硒鼓,在碳粉盒附近找到光电传感器,将其感光端用黑色胶带封住即可不出现报警,在打印图文过浅或不能打印时,再更换碳粉盒。

故障三、打印文件时出现“Print Over-run”字符

故障现象:联想LJ2000P型激光打印机,在Windows环境下打印文件时,常出现“Print Over-run”字符。

故障分析:引起该故障的可能原因主要有以下几种:

1.打印驱动程序有问题;

2.打印机有分辨率调得过高,使打印机过于紧张无法打印;

3.打印机的内存容量过少。

故障检修方法:首先先扩充打印机内存,具体方法如下:

1.关掉打印机的电源开关,拔掉电源电缆及打印电缆;将固定主板后板的螺钉拧掉,拔出主板;

2.从包装中取出内存条,放入主板上的扩充内存槽中,慢慢地将其推到位;

3.把主板沿着导轨推入打印机;拧紧固定螺钉;

4.重新连接好打印电缆及电源电缆,打开电源开关;

5.检查内存条是否安装正确,之后打印打印机的配置自检样张,查看内存总量是否正确。

在安装扩充内存条时应注意:在拆卸或安装内存条之前,要用手拿住内存条的上边,不要触摸内存条上的芯片或其印制电路板,防止静电损坏内存条。

然后将Windows驱动程序中的Device Option菜单里的 Page Protection和遥控面板程序设为“ON”试机,故障依旧。再在Windows驱动程序的Device Option菜单中,将Error Recover设为“ON"试机,故障排除。

故障四、未打印完时出现“Print Overrun”字符

故障现象:联想LJ2000P型激光打印机,打印页未打印完,即出现“Print Overrun”字符。

故障分析:这种故障的原因多是由于所设打印分辩率过高或画面过于复杂,使得打印机无法处理全部数据引起的。

故障检修方法:

1.若使用的是随机提供的Windows的驱动程序,应按Windows下的驱动程序进行正确操作。

2.适当降低打印分辨率或文件的复杂程序。

故障五、Alarm指示灯闪烁

故障现象:联想LJ2000P型激光打印机面板上的Alarm指示灯闪烁。

故障分析:引起此故障的可能原因有以下几种:

1.并行接口未连接好或有错误;

2.内存使用已满(只发生在DOS或Macintosh环境);

3.打印溢出;

4.串行接口帧错;

5.串行接口奇偶校验错;

6.串行接口输入缓冲溢出。

故障检修方法:

1.按面板按钮,重新恢复打印;使计算机与打印机之间连接正确与牢固;使接口电缆无问题。

2.按面板按钮,把留在打印机内的数据打印出来;降低打印分辨率或文件的复杂程序;可扩充打印机内存。

3.按面板按钮,把留在打印机内的数据打出;若使用提供的Windows驱动程序,把驱动程序中的Device Option菜单里的Error Recover设为“ON”试试;扩充打印机的内存,并将Windows驱动程序或遥控面板中的Device Option菜单里的Page Protection设为“ON’;或改变Windows驱动程序中的以下设置,其最佳组合随打印文件的情况而变化;降低打印分辨率或文件复杂程度。

4.按面板按钮,重新恢复打印;使计算机与打印机的波特率、停止位等通信参数设置正确。

5.按面板按钮,重新恢复打印;使计算机与打印机的位长度、奇偶校验等通信参数设置正确。

6.按面板按钮,重新恢复打印;使计算机与打印机的传送协议等通信参数设置正确;若问题依旧,应排除接口硬件可能损坏的问题。

故障六:出现卡纸故障

故障现象:联想LJ2000P型激光打印机打印时卡纸。

故障分析:此故障大多是因为打印纸有问题,如质量不好、厚薄不适及受潮等。在卡纸时应首先检查纸卡在什么位置,再作相应的排除。

故障检修方法:下面列举纸常卡的部位和排除方法:

1.纸卡在多功能送纸器中。打开送纸器的前盖,向上直着拉出被卡的纸。尔后关上送纸器的前盖,打开机子的顶盖,检查机子里面是否有撕碎的纸片。若纸不能直接拉出来,应打开顶盖,取出硒鼓组件,将卡的纸向前拉出。

2.纸卡在加出纸盒里。向下拉开出纸器,打开支撑铁丝向外拉出卡住的纸。注意不能从出纸盒直接向外拉卡住的纸,以防加热辊上粘上墨粉,使后面的打印纸粘上墨粉。

3.纸卡在硒鼓附近。打开机盖,取出硒鼓避光保存,将卡住的纸向前拉出,尔后装回硒鼓,关上打印机盖。

4.纸卡在加热辊里。打开机顶盖,取出硒鼓组件并避光保存好,然后将卡住的纸拉出。装回硒鼓组件,关上打印机的顶盖。

检修经验:对刚使用后的打印机,由于内部某些部件都很烫。此时,应打开机子的顶盖,绝不能触摸高温部件。

故障七、打印机不进纸

故障现象:联想LJ2000P型激光打印机打印时不进纸。

故障分析:

1.计算机屏幕上显示“Paper Empty'’提示,或Alarm及Paper指示灯在闪烁,即表示送纸器内缺纸;

2.送纸器内有纸,但纸张异常;

3.送纸器中装的纸张过满。

故障检修方法:经检查为送纸器中装的纸张过满。将送纸器中的纸量适当减少后,故障排除。

检修经验:如打印纸安装不正确也会发生上述故障,为了防止发生不进纸或卡纸现象,现列举联想LJ2000P激光打印机的打印纸正确安装方法如下:

首先安装多功能送纸器的纸张支撑铁丝;打开送纸器盖,然后把打印机纸送人送纸器。最多可容纳200张打印纸或10个信封,送纸器中的纸张不能超出▲标起的下面,否则将导致卡纸现象发生。接下来移动送纸器内的打印纸导轨,使导轴轻轻夹住打印纸。如导轨不能将打印纸夹住,则将造成打印纸跑偏及卡纸。最后关上送纸器盖后,打开出纸槽,打开扩展支撑铁丝。

故障八、不能正常送纸

故障现象:联想LJ2000P型激光打印机送纸器内有纸,但不能正常送纸。

故障分析:此故障大多是送纸器内的纸张异常引起的。如纸张卷曲、折皱或撕裂破损时导致不能正常送纸。

故障检修方法:应保证纸张平直,对于卷曲的纸在打印前要将其平整好,或将纸取出再重新放入。试机,故障排除。

故障九、打印机不出纸

故障现象:联想LJ2000P型激光打印时不出纸。

故障分析:引起不出纸的故障原因主要有感光鼓卡纸和出纸盒卡纸。检查发现打印纸卡在出纸盒内。

故障检修方法:向下拉开出纸盒,打开支撑铁丝,向外拉出卡住的纸后,故障排除。

故障十、打印页面杂乱无章

故障现象:联想LJ2000P型激光打印机,打印杂乱无章。

故障分析:引起该故障的原因主要有:

1.应用软件对打印机设置不正确;

2.打印机的仿真方式设置不正确;若使用RPC程序,则可用改变设置,以符合其要求;所以用RPC程序或打印机控制面板打印出当前的设置;

3.计算机或打印机的接口类型设置不正确,与计算机不匹配。检查发现打印机的接口类型设置不正确。PC机用RS-232C串行接口, Macintosh用RS-422A串行接口。

故障检修方法:首先将打印机关机一段时间,再开机故障打印以现故障并未排除;然后将计算机与打印机的接口类型重新设置正确后开机打印,故障排除。

热门文章