执行接收指令时,如果通信端口上有来自其它设备的通信,则接收消息功能可能会从该字符的中间开始接收字符,从而导致奇偶校验错误或组帧错误以及接收消息功能终止。如果未启用奇偶校验,收到的消息可能包含错误字符。将开始条件指定为特定起始字符或任何字符时,可能会发生这种情况,如下文中的第2项和第6项所述。接收指令支持多种消息开始条件。指定与断开或空闲线检测相关的开始条件,并在将字符放入消息缓冲区之前强制接收消息功能将消息开始与字符开始同步,这样可避免出现从字符的中间开始消息的问题。接收指令支持多种开始条件:1.空闲线检测:空闲线条件定义为传输线路上的安静或空闲时间。当通信线的安静或空闲时间达到在SMW90或SMW190中指定的毫秒数时,便会开始接收。执行程序中的接收指令时,接收消息功能将开始搜索空闲线条件。如果在空闲线时间过期之前接收到任何字符,接收消息功能会忽略这些字符,并会按照SMW90或SMW190中指定的时间重新启动空闲线定时器。请参见下图。空闲线时间过期后,接收消息功能会将接收到的所有后续字符存入消息缓冲区。空闲线时间应始终大于以指定波特率传送一个字符(包括起始位、数据位、奇偶校验位和停止位)所需的时间。空闲线时间的典型值为以指定波特率传送三个字符所需要的时间。对于二进制协议、没有特定起始字符的协议或指定了消息之间最小时间间隔的协议,可以将空闲线检测用作开始条件。设置:il=1,sc=0,bk=0,SMW90/SMW190=空闲线超时(毫秒)①执行接收指令:启动空闲时间②重新启动空闲时间③检测到空闲时间:启动接收消息功能④第一个字符放入消息缓冲区中2.起始字符检测:起始字符是用作消息第一个字符的任意字符。当收到SMB88或SMB188中指定的起始字符时,启动消息。接收消息功能会将起始字符作为消息的第一个字符存入接收缓冲区。接收消息功能忽略在起始字符之前收到的任何字符。起始字符以及在起始字符之后收到的所有字符都存储在消息缓冲区中。通常情况下,对于所有消息均以同一字符开始的ASCII协议,可以使用起始字符检测。设置:il=0,sc=1,bk=0,SMW90/SMW190=不相关,SMB88/SMB188=起始字符3.空闲线和起始字符:接收指令可启动组合了空闲线和起始字符的消息。执行接收指令时,接收消息功能会搜索空闲线条件。找到空闲线条件后,接收消息功能将查找指定的起始字符。如果接收到的字符不是起始字符,接收消息功能将开始重新搜索空闲线条件。所有在满足空闲线条件之前接收到以及在收到起始字符之前接收到的字符都将被忽略。起始字符与所有后续字符一起存入消息缓冲区。空闲线时间应始终大于以指定波特率传送一个字符(包括起始位、数据位、奇偶校验位和停止位)所需的时间。空闲线时间的典型值为以指定波特率传送三个字符所需要的时间。通常,对于指定消息之间最小时间间隔并且消息的首字符为指定特定设备的地址或其它信息的协议,可以使用这种类型的起始条件。这种方式尤其适用于通信链路上存在多台设备的情况。这种情况下,仅当接收到的消息的起始字符为特定地址或设备时,接收指令才会触发中断。设置:il=1,sc=1,bk=0,SMW90/SMW1900,SMB88/SMB188=起始字符4.断开检测:当接收到的数据保持为零的时间大于完整字符传输的时间时,会指示断开。完整字符传输时间定义为传输起始位、数据位、奇偶校验位和停止位的时间总和。如果接收指令组态为接收到断开条件后启动消息,断开条件之后接收到的任意字符都会存储在消息缓冲区中。断开条件之前接收到的任何字符都会被忽略。通常,仅当协议需要时才将断开检测用作开始条件。设置:il=0,sc=0,bk=1,SMW90/SMW190=不相关,SMB88/SMB188=不相关5.断开和起始字符:接收指令可组态为在接收到断开条件开始接收字符,然后按顺序接收特定起始字符。满足断开条件后,接收消息功能将查找指定的起始字符。如果接收到的字符不是起始字符,接收消息功能将重新搜索断开条件。所有在断开条件满足之前以及在接收到起始字符之前接收的字符都会被忽略。起始字符与所有后续字符一起存入消息缓冲区。设置:il=0,sc=1,bk=1,SMW90/SMW190=不相关,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=消息超时(毫秒)接收指令支持多种终止消息的方式。终止消息的方式可以是以下一种方式,也可以是几种方式的组合:1.结束字符检测:结束字符是用于指示消息结束的任意字符。找到开始条件之后,接收指令将检查接收到的每一个字符,并判断其是否与结束字符匹配。接收到结束字符时,会将其存入消息缓冲区,接收终止。通常情况下,对于所有消息均以特定字符结束的ASCII协议,可以使用结束字符检测。可以将结束字符检测与字符间定时器、消息定时器或最大字符计数相结合,以终止消息。设置:ec=1,SMB89/SMB189=结束字符2.字符间定时器:字符间时间是指从一个字符结束(停止位)到下一个字符结束(停止位)测得的时间。如果字符间的时间(包括第二个字符)超出SMW92或SMW192中指定的毫秒数,则接收消息功能将终止。接收到每个字符后,字符间定时器重新启动。请参见下图。如果协议没有特定的消息结束字符,可以使用字符间定时器终止消息。由于定时器总是包含接收一个完整字符(起始位、数据位、奇偶校验位和停止位)的时间,定时器的值必须设为大于以选定波特率传输一个字符所需的时间。可以将字符间定时器与结束字符检测和最大字符计数结合使用,以终止消息。设置:c/m=0,tmr=1,SMW92/SMW192=超时(毫秒)①重新启动字符间定时器②字符间定时器时间到:终止消息并生成接收消息中断3.消息定时器:消息定时器在消息开始后的指定时间终止消息。消息定时器将在接收消息功能的开始条件得到满足后立即启动。经过SMW92或SMW192中指定的毫秒数后,消息定时器时间到。请参见下图。通常,当通信设备不能保证字符之间无时间间隔或使用调制解调器进行通信时,可以使用消息定时器。对于调制解调器,可以使用消息定时器指定一个从消息开始算起的允许接收消息的最大时间。消息定时器的典型值约为在选定波特率下接收最长消息所需时间值的1.5倍。可以将消息定时器与结束字符检测和最大字符计数相结合,以终止消息。设置:c/m=1,tmr=1,SMW92/SMW192=超时(毫秒)①消息开始:启动消息定时器②消息定时器时间到:终止消息并生成接收消息中断4.最大字符计数:接收指令必须获知要接收的最大字符数(SMB94或SMB194)。达到或超出该值后,接收消息功能将终止。即使最大字符计数不被专门用作结束条件,接收指令仍要求用户指定最大字符计数。这是因为接收指令需要知道接收消息的最大长度,这样才能保证消息缓冲区之后的用户数据不被覆盖。对于消息长度已知并且恒定的协议,可以使用最大字符计数终止消息。最大字符计数总是与结束字符检测、字符间定时器或消息定时器结合在一起使用。5.奇偶校验错误:当硬件发出信号指示奇偶校验错误、组帧错误或超限错误时,或在消息开始后检测到断开条件时,接收指令自动终止。仅当在SMB30或SMB130中启用了奇偶校验后,才会出现奇偶校验错误。仅当停止位不正确时,才会出现组帧错误。仅当字符进入速度过快以致硬件无法处理时,才会出现超限错误。断开条件因与硬件的奇偶校验错误或组帧错误类似的错误而终止消息。无法禁用此功能。6.用户终止:用户程序可以通过执行另一个SMB87或SMB187中的使能位(EN)设置为零的接收指令终止接收消息功能。这样可以立即终止接收消息功能。使用字符中断控制接收数据为了完全适应对各种协议的支持,您还可以使用字符中断控制来接收数据。接收每个字符时都会产生中断。执行连接到接收字符事件的中断例程之前,接收到的字符存入SMB2,奇偶校验状态(若已启用)存入SM3.0。SMB2是自由端口接收字符缓冲区。自由端口模式下接收到的每一个字符都会存入这一位置,便于用户程序访问。SMB3用于自由端口模式,包含一个奇偶校验错误位,如果在接收到的字符中检测到奇偶校验错误、组帧错误、超限错误或断开错误,该位将置位。保留该字节的所有其它位。可使用奇偶校验位丢弃消息或向该消息发送否定确认。以较高波特率(38.4K到115.2K)使用字符中断时,中断之间的时间间隔会非常短。例如,波特率为38.4K时的字符中断为260微秒,57.6K时为173微秒,115.2K时为86微秒。确保中断例程足够短,以避免字符丢失,否则请使用接收指令。