尽管自由口通信的指令非常简单,但是如果在执行“接收”指令时通信端口中存在通信,接收功能可能会在该字符中间开始接收字符,并可能导致校验错误和接收信息终止。如果没有启用校验,接收的信息可能包含不正确的字符。为避免以上情况的发生,一般都需要进行接收信息控制。
SMB86~SMB94以及SMB186~SMB194被用于控制和读取有关“接收信息”指令的状态,接收信息状态字节和接收信息控制字节见表10-3和表10-4。
表10-3 接收信息状态字节
表10-4 接收信息控制字节
(1)“接收”指令支持的几种开始条件
“接收”指令支持的几种开始条件如下:
1)空闲行检测:空闲行条件被定义为传输行中的静态或空闲行时间。当通信行处于静态或空闲达到SMW90或SMW190中指定的毫秒数时,开始接收。执行程序中的“接收”指令时,接收信息功能开始搜索空闲行条件。如果在空闲行时间失效之前收到任何字符,接收信息功能会忽略这些字符,用来自SMW90或SMW190的时间重新启动空闲行定时器。空闲行检测如图10-26所示。空闲行时间失效后,接收信息功能存储在信息缓冲区中随后接收的所有字符。
图10-26 空闲行检测
按照指定的波特率,空闲行时间应当始终大于传输一个字符(起始位、数据位、校验和停止位)的时间。按照指定的波特率,空闲行时间的典型数值是3个字符时间。
用户将空闲行检测用作没有特定起始字符或指定信息间最小时间的二进制协议的开始条件。
设置:il=1,sc=0,bk=0,SMW90/SMW190=空闲行超时(以毫秒为单位)。
(注:il、sc、bk等均为SMB87和SMB187中的数据位,可以参看表10-4。)
2)起始字符检测:起始字符是任何被用作信息第一个字符的字符。当收到在SMB88或SMB188中指定的起始字符时,信息开始。接收信息功能在接收缓冲区中将起始字符存储为信息的第一个字符。接收信息功能忽略在起始字符之前接收的任何字符。起始字符和在起始字符之后接收的所有字符存储在信息缓冲区中。
通常,在ASCII协议中使用起始字符检测,在ASCII协议中,所有的信息以相同的字符开始。
设置:il=0,sc=1,bk=0,SMW90/SMW190=无关紧要,SMB88/SMB188=起始字符。
3)空闲行和起始字符:“接收”指令可以由空闲行和起始字符组合开始一则信息。执行“接收”指令时,接收信息功能搜索空闲行条件。找到空闲行条件后,接收信息功能寻找指定的起始字符。如果收到起始字符之外的任何字符,接收功能重新开始搜索空闲行条件。空闲行条件之前接收的所有字符均符合条件,起始字符之前接收的所有字符均被忽略。起始字符与所有其后的字符均被放置在信息缓冲区中。
按照指定的波特率,空闲行时间应当始终大于传输一个字符(起始位、数据位、校验和停止位)的时间。按照指定的波特率,空闲行时间的典型数值是3个字符时间。
通常,当存在指定信息间最小时间的协议且信息的第一个字符是地址或指定某一特定设备的符号时,则使用此类起始条件。这在实施通信链接上有多台设备的协议时十分有用。在此种情况下,只有在接收具体地址或由起始字符指定的设备时“接收”指令才触发中断。
设置:il=1,sc=1,bk=0,SMW90/SMW190>0,SMB88/SMB188=起始字符。
4)断开检测:当接收的数据保持在零的时间大于一个整字符传输时间时,会指示断开。一个整字符传输时间被定义为起始、数据、校验和停止位的总时间。如果“接收”指令被配置为在接收断开条件时起始信息,在断开条件之后接收的任何字符均放置在信息缓冲区中。在断开条件之前接收的任何字符均被忽略。
通常,仅在协议要求时才将“断开”检测用作起始条件。
设置:il=0,sc=0,bk=1,SMW90/SMW190=无关紧要,SMB88/SMB188=无关紧要。
5)断开和起始字符:“接收”指令可以被配置为在接收断开条件,且随之接收一个具体起始字符后开始接收字符。在断开条件后,接收信息功能寻找指定的起始字符。如果收到起始字符之外的任何字符,接收功能重新开始搜索断开条件。断开条件之前接收的所有字符均符合条件,起始字符之前接收的所有字符均被忽略。起始字符与所有其后的字符均被放置在信息缓冲区中。
设置:il=0,sc=1,bk=1,SMW90/SMW190=无关紧要,(www.xing528.com)
SMB88/SMB188=起始字符。
6)任何字符:“接收”指令可以被配置为立即开始接收任何和所有的字符,并将字符放置在信息缓冲区中。此为空闲行检测的特殊情况。在此种情况下,空闲行时间(SMW90或SMW190)被设为零。这样会强制“接收”指令在执行时立即开始接收字符。
设置:il=1,sc=0,bk=0,SMW90/SMW190=0,SMB88/SMB188=无关紧要。
在接收任何字符时开始信息允许信息定时器被用于使信息接收超时。这在使用自由端口实施协议的主设备或主机部分时十分有用,此时如果在指定的时间内未从从属设备收到应答,则有必要超时。当“接收”指令执行时,信息定时器会启动,因为空闲行时间被设为零。如果未满足其他结束条件,信息定时器会超时,并终止接收。
设置:il=1,sc=0,bk=0,SMW90/SMW190=0,SMB88/SMB188=无关紧要,c/m=1,tmr=1,SMW92=信息超时(以毫秒为单位)。
(2)“接收”指令支持终止信息的几种方法
“接收”指令支持终止信息的几种方法可在以下一种或几种条件组合的情况下终止信息:
1)结束字符检测:结束字符是被用于指示信息结束的任何字符。找到起始条件后,“接收”指令会检查接收的每个字符,查看是否与结束字符相符。收到结束字符时,结束字符被置入信息缓冲区中,接收终止。
通常,在ASCⅡ协议中使用结束字符检测。可以将结束字符检测与字符间定时器、信息定时器或最大字符计数组合在一起使用,终止信息。
设置:ec=1,SMB89/SMB189=结束字符。
2)字符间定时器:字符间时间是从一个字符的结束(停止位)到另一个字符的结束(停止位)之间的时间。如果字符间的时间(包括第二个字符)超过SMW92或SMW192中指定的毫秒数,接收信息被终止。在收到每个字符时,字符间定时器重新启动(见图10-27)。
图10-27 字符间计时器
可以使用字符间定时器终止用于无具体信息字符结束的协议的信息。该定时器必须按照所选的波特率设为大于一个字符时间的数值,因为该定时器总是包括接收一个整字符(起始位、数据位、校验和停止位)的时间。
可以将字符间定时器与结束字符检测和最大字符计数组合在一起使用,终止信息。
设置:c/m=0,tmr=1,SMW92/SMW192=超时(以毫秒为单位)。
3)信息定时器:信息定时器在信息开始后按照指定的时间终止信息。一旦符合接收信息的起始条件,信息定时器即启动。超过SMW92或SMW192中指定的毫秒数时,信息定时器失效(见图10-28)。
图10-28 信息定时器
通常,当通信设备无法保证字符间不会有时间间隔或通过调制解调器操作时,可以使用信息定时器。对于调制解调器,可以使用信息定时器指定信息开始后允许接收信息的最长时间。信息定时器的典型数值约为按照选择的波特率接收最长信息所要求时间的1.5倍。
可以将信息定时器与结束字符检测和最大字符计数组合在一起使用,终止信息。
设置:c/m=1,tmr=1,SMW92/SMW192=超时(以毫秒为单位)。
4)最大字符计数:必须将需要接收的最大字符数(SMB94或SMB194)通知“接收”信息。当达到或超过该数值时,接收信息被终止。“接收”指令要求用户指定一个最大字符计数,即使该计数并未专门用作终止条件亦如此。这是因为“接收”指令需要了解接收信息的最大尺寸,以防在信息缓冲区之后放置的数据被覆盖。
最大字符计数可用于为具有已知信息长度且信息长度始终相同的协议终止信息。最大字符计数始终与结束字符检测、字符间定时器或信息定时器组合在一起使用。
5)校验错误:当硬件指示接收字符的校验错误时,“接收”指令会自动终止。只有当校验在SMB30或SMB130中被启用时,才会出现校验错误。
6)用户终止:用户程序可以执行另一条“接收”指令,并将SMB87或SMB187中的启用位(en)设为零,从而终止接收信息。这样会立即终止接收信息。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。