自己在学习这个协议中总结的一点知识,有不对的地方大家多多指正
invoke_id的值是0-255,在程序中0作为释放后的状态。但是在包含invoke_id的结构体中
这个结构体定义了一个存放此种类型数据的结构体
static BACNET_TSM_DATATSM_List[MAX_TSM_TRANSACTIONS];
这里关键是定义的这个空间的大小
#define MAX_TSM_TRANSACTIONS 20
这个值什么意思呢,也就是在上面的定义的这个RequestTimer还没有超时的情况下,只能支持20个还未收到应答的事件。如果这个空间已经用完,在没有释放(超时或者收到应答释放)的情况下,设备再发送一个需要应答的请求就会失败,因为没有空闲的invoke_id,虽然invoke_id的可用范围是1-255,但是用于存储这个被使用的invoke_id的空间只有20个。
所以这个RequestTimer还是很重要的,也就是APDU_TimeOut,如果没有处理这个值的相关函数,存储空间满了之后,就不能在发送需要应答的报文了。