初始化子程序(CSH SBR)——接收消息的起始和结束条件定义
1.2 SMB87和SMB187
通讯就会涉及到接收消息和发送消息,怎么接收消息?什么情况下执行接收消息呢?这样就必须给予预置条件。也就是当执行 RCV (receive接收)指令时,必须预先使用接收信息控制字节 SMB87 (端口 0 ) 或 SMB187 (端口 1 )来定义接收消息的起始和结束条件。
接收消息的起始条件可以同时包含多个条件,只有所有条件都满足才开始接收消息;接收消息的结束条件也可以同时包含多个条件,只要有一个条件满足就会结束消息的接收。接收信息控制字节 SMB87/SMB187 的说明见下图 4所示。
前文中第二行程序
MOVB 16#F0, P1_Config:SMB187
给地址SMB187赋值十六进制数F0,将F0H用计算器换算成二进制数为11110000,对照图3即:
MSB(most significant bit)最高位en:
1=允许接收消息功能(即SMB187.7,程序中有另外单独给予置位和复位)。
sc:1=使用SMB88(端口 0)或SMB188(端口 1)的值检测起始消息。
ec:1=使用SMB89(端口 0)或SMB189(端口 1)的值检测结束消息。
il: 1=使用SMW90(端口 0)或SMW190(端口1)的值检测空闲状态。
c/m:0=定时器是字符间定时器。
tmr:0=忽略SMW92或SMW192。
bk:0=忽略BREAK状态。
LSB(least significant bit)最低位:0
1.3 SMB88和SMB188-SMB94和SMB194
MOVB 16#02, SMB188
表示起始字符02H=ASCII码STX(start of headling)。在该起始条件下,执行 RCV 指令是当收到 SMB88/SMB188 中指定的起始字符STX时,便会开始消息接收。接收消息功能会将起始字符作为消息的第一个字符存入接收缓冲区,接收消息功能忽略在起始字符之前收到的任何字符,起始字符以及在起始字符之后收到的字符被存储到接收缓冲区。
MOVB 16#0D, SMB189
表示结束字符0DH=ASCII码CR (carriage return)。执行 RCV 指令并找到起始字符STX之后,接收消息功能将检查接收到的每一个字符,并判断其是否与结束字符匹配。
接收到结束字符CR时,会将其存入接收缓冲区并终止信息接收,使用结束字符检测终止信息接收所示。
MOVW +5, SMW190
表示空闲线时间5ms。在该起始条件下,执行 RCV接收指令时将开始检测空闲线条件,当通信总线上空闲线时间达到 SMW90/SMW190 中指定的5毫秒数时,便会开始消息接收。
空闲线时间之前接收到的任何字符都被忽略,并按照SMW90/SMW190 指定的时间重新启动空闲线定时器;空闲线时间到达后,接收消息功能会将接收到的所有后续字符存入接收缓冲区。
由于我们给SMB187赋值是11110000(F0H),也就是说起始字符STX,结束字符CR,以及通信总线空闲时间达到5毫秒3个条件都满足,才会将接收到的字符存入缓冲区。
SMW92SMW192字符间/消息定时器,以毫秒为单位,程序中是忽略的。
MOVB 50, SMB194
表示允许接收最大50个字符。执行 RCV 指令时当接收字符个数达到或超过最大50字符个数(SMB94/SMB194)时接收消息功能将终止。
由于接收指令需要知道接收信息的最大长度,以保证信息缓冲区之后的数据不被覆盖,所以即使最大字符计数不被专门用作接收结束条件,也必须指定最大字符个数。
另外我们采用的偶校验,当执行 RCV 指令时,当通信端口检测出偶校验错误,消息接收功能自动被终止。