一组数据就代表了一个独立的 超时机制
现在我们明确了一个思想
一组上面这样的数据就足以代表一个独立的超时机制。
因为不是单一数据,因此我们采用 结构体 来封装这个数据结构;
- typedef struct
- {
- U32 Timer;
- U8 RecvLen;
- U8 CurrentLen;
- U8 RecvBuff[250];
- }TimeoutStr;
然后因为上面的操作都是一样的。
因此,我们可以想见,我们只需要实现一次这样的函数操作,就可以通用。
当然,在封装的时候我们考虑到另一个重要特征。
在数据上的操作是一致的,但是,使用的却是不同数据;
因此,我们需要传递参数。
而这些参数大多数都需要被操作它们的函数改变数值,因此,方便起见,我们以 地址传递参数。
这样一来。
上面的三个实现部分,我们就可以合成以下一个完整的模块。
(但是为了方便阅读代码,我仍然分成三个 代码块 展示。)
- //超时定时器操作部分
- void runTimer(U32 *Timer)
- {
- if(*Timer < 0x00ffffff)
- (*Timer)++;
- else
- *Timer = 0;
- }
- void resetTimer(U32 *Timer)
- {
- *Timer = 0;
- }
- // 这组函数用于把接收到的数据放入接收缓冲
- // 这个用于一串数据
- int recvBuffer(TimeoutStr *Str,U8 *buffer,U8 len)
- {
- if(Str->RecvLen + len >= 250)
- len = 250 - Str->RecvLen;
-
- if(String_Joint(Str->RecvBuff,buffer,Str->RecvLen,len) != -1)
- {
- Str->RecvLen += len;
- return 0;
- }
- else
- return -1;
- }
- // 这个用于一个数据
- int recvByte(TimeoutStr *Str,U8 Data)
- {
- if(Str->RecvLen + 1 >= 250)
- return -1;
-
- Str->RecvBuff[Str->RecvLen] = Data;
- (Str->RecvLen)++;
-
- return 0;
- }
- int IsTimeout(TimeoutStr *Str,U32 nTimeoutMs)
- {
- if(Str->CurrentLen != Str->RecvLen)
- {
- Str->CurrentLen = Str->RecvLen;
- resetTimer(&(Str->Timer));
- }
-
- if(Str->Timer >= nTimeoutMs)
- {
- Str->CurrentLen = 0;
- return 1;
- }
- return 0;
- }
- // 这是带上了判断超时的接收函数;也是最终应用层调用的函数。
- int recvTimeoutData(TimeoutStr *Str,U8 *Buf,U32 Timeout)
- {
- int i = 0;
- int DataAcount = 0;
-
- if(Buf == NULL)
- return 0;
-
- if(Str->RecvLen == 0)
- return 0;
-
- if(IsTimeout(Str,Timeout) == 0)
- return 0;
-
- DataAcount = Str->RecvLen;
-
- for(i=0;i
- Buf[i] = Str->RecvBuff[i];
-
- Str->RecvLen = 0;
-
- return DataAcount;
- }