UINT8 RxLen:
UINT8 TxLen;
}PROTOCOL;
RxBuff是用来存放从串口接收的数据,TxBuff为要发送的数据,如果接收到一帧合法数据将ReceiveSuccessFlag置0xFF,该标志的作用是为操作系统提供一个处理RxBuff中数据的标志,防止已经接收的帧被后续帧覆盖。RxLen为RxBuff接收字节的长度,TxLen为TxBuff要发送数据的长度。
3.1 接收回调函数程序设计
当串口接收到一个字节后调用接收回调函数,接收数据回调函数数据处理流程图如图2所示。首先判断返回的channel是否为物理通道1、物理通道2或物理通道3。如果不是则将此数据抛弃,如果是则判断ProtocolList[channel].ReceiveSuccesFlag是否为0xFF。如果是,说明该串口已经接收到一帧数据但还没有被处理,不能接收数据。如果不是,则判断接收字节是否符合通信协议的帧格式,如果不符合则将接收字节抛弃,如果符合将接收字节Data存入接收缓冲区ProtocolList[channel].RxBuff中,并且将接收长度ProtocolList[channel].RxLen加1,最后判断是否一帧数据接收完毕,如果接收完成则将ProtocolList[channel].ReeeiveSuiccesFlag置为0xFF。
在应用层和通信协议层中都有一个消息列表,分别来收集协议栈发送给它的消息和应用层发送给通信协议层的消息。
Message MessageList[MAX_MESSAGE_NUM];
其中Message的结构如下所示:
typedef struct{
Un8 Channel;
Un8 STaskID;
Un8 DTaskID;
Un8 MessageType;
Un8*Data;
}Message;
通道号为协议栈接收数据的串口号,STaskID为源任务号(协议栈的任务号或应用层的任务号),DTaskID为目的任务ID(协议栈的任务号或应用层的任务号),MessageType代表什么类型的消息(读数据请求、写数据请求),Data为所要写入数据的指针。
3.3 基于任务调度的操作系统对接收帧的处理
当基于任务调度的操作系统执行通信协议层任务时会搜索ProtocolList数组中哪个元素的ProtocolList[channel].ReceiveSuccesFlag为0xFF,然后对其ProtocolList[channel].RxBuff中的数据进行处理,处理过程是: