一、串口
串口数据具有以下格式:
0xFE, DataLength, CM0, CM1, Data payload, FCS
解释:0xFE:数据帧头
DataLength:Datapayload的数据长度,以字节计,低字节在前;
CM0:命令低字节;
CM1:命令高字节;(ZTOOL软件就是通过发送一系列命令给MT实现和协议栈交互);
Data payload:数据帧具体的数据,这个长度是可变的,但是要和 DataLength一致;
FCS:校验和,从 DataLength 字节开始到 Data payload 最后一个字节所有字节的异或按字节操作。
例如: FE 06 00 02 41 42 43 44 45 46 03
0xFE | DataLength | CM0 | CM1 | Datapayload | FCS |
FE | 06 | 00 | 02 | 41 42 43 44 45 46 | 03 |
串口发给系统应用层的结构体:
typedef stuct
{
osal_event_hdr_t hdr;
uint8 *msg;
} mtOSALSerialData_t;
其中 *msg为去掉帧头和校验符的串口数据,即:06 00 02 41 42 43 44 45 46。
如何处理串口数据:
首先打开Project->Options,在如图1所示的Options设置对话框的Defined symbols中添加ZTOOL_P1(选择使用ZTOOL,使用MT_UartProcessZtoolData函数处理串口数据);其次在SampleApp.c的SampleApp_Init()中添加:
MT_UartInit(); //添加串口初始化函数
MT_UartRegisterTaskID(SampleApp_TaskID); //注册串口任务事件
执行过程:
在系统初始化过程中调用void MT_UartInit ()(该函数位于MT_Uart.c文件中),该函数中有如下两句函数:
#if defined (ZTOOL_P1) || defined (ZTOOL_P2)
uartConfig.callBackFunc = MT_UartProcessZToolData;
函数中使用调用MT_UartProcessZToolData()(该函数位于MT_Uart.c文件中)回调函数处理串口发来的数据。该函数对串口数据进行解包,并且设置事件消息:
pMsg->hdr.event = CMD_SERIAL_MSG;
如果校验正确则将串口消息发送给应用处理层:
osal_msg_send( App_TaskID, (byte *)pMsg );
因此在应用层SampleApp_ProcessEvent()(该函数位于SampleApp.c文件中)函数中添加如下语句即可进行串口数据处理:
case CMD_SERIAL_MSG:
Uart_IncomingDataProcessing(((mtOSALSerialData_t *)MSGpkt)->msg) //串口处理函数,根据不同的命令将串口发来的消息发送出去
break;
注意:发来的串口数据包括:数据长度(DataLength),命令低字节(CM0),命令高字节(CM1),数据有效载荷(Data payload)。处理时应按照该顺序进行处理。