/***************************************************************************************************
* @fn MT_UartProcessZAppData
*
* @brief | SOP | CMD | Data Length | FSC |
* | 1 | 2 | 1 | 1 |
*
* Parses the data and determine either is SPI or just simply serial data
* then send the data to correct place (MT or APP)
*
* @param port - UART port
* event - Event that causes the callback
*
*
* @return None
***************************************************************************************************/
void MT_UartProcessZAppData ( uint8 port, uint8 event )
{
osal_event_hdr_t *msg_ptr;
uint16 length = 0;
uint16 rxBufLen = Hal_UART_RxBufLen(port /*MT_UART_DEFAULT_PORT*/);//获得缓冲区数据长度
/*
If maxZAppBufferLength is 0 or larger than current length
the entire length of the current buffer is returned.//如果串口缓冲区中的长度为0并且小于最大长度,则返回实际长度
*/
if ((MT_UartMaxZAppBufLen != 0) && (MT_UartMaxZAppBufLen <= rxBufLen))//如果最大长度不为0,并且实际长度大于最大长度
{
length = MT_UartMaxZAppBufLen;//返回最大长度
}
else
{
length = rxBufLen;//其它情况下为实际获得的长度
}
/* Verify events */
if (event == HAL_UART_TX_FULL) //串口 1 发送缓冲区溢出
{
// Do something when TX if full
return;
}
if (event & ( HAL_UART_RX_FULL | HAL_UART_RX_ABOUT_FULL | HAL_UART_RX_TIMEOUT))
{
if ( 0x08 /*App_TaskID*/ )// 这里我直接写上某个任务的TASK_ID,因为我程序同时使用了两个串口,定义了ZTOOL_P1和ZAPP 和MT_TASK
{
/*
If Application is ready to receive and there is something
in the Rx buffer then send it up
*/
if ((MT_UartZAppRxStatus == MT_UART_ZAPP_RX_READY ) && (length != 0))//串口允许接收并且实际长度不为0
{
/* Disable App flow control until it processes the current data 关闭串口直到处理数据完成 */
MT_UartAppFlowControl (MT_UART_ZAPP_RX_NOT_READY);
msg_ptr = (osal_event_hdr_t *)osal_msg_allocate( length + sizeof(osal_event_hdr_t) );
if ( msg_ptr )
{
msg_ptr->event = SPI_INCOMING_ZAPP_DATA;
msg_ptr->status = length; /* 2 more bytes are added, 1 for CMD type, other for length */
/* Read the data of Rx buffer */
HalUARTRead( port /*MT_UART_DEFAULT_PORT*/, (uint8 *)(msg_ptr + 1), length );//将缓冲区数据装入消息体中
/* Send the raw data to application...or where ever */
osal_msg_send( 0x08 /*App_TaskID*/, (uint8 *)msg_ptr );
P1_0 = ~P1_0;//便于调试
}
}
}
}
}
有个现象跟大家分享一下:我同时使用了两个串口,协议栈版本为ZStack-2007-2..4.0。因为由串口0与我自己写的上位机程序通信,其它格式可以完全按照TI规定的来。所以串口0可以用回调函数void MT_UartProcessZToolData ( uint8 port, uint8 event ),而且采用DMA方式。但串口1是来是另外一个CC2530(两个处理器都在同一板子上,这里我将含有我自己程序叫主处理器,另外一个叫从处理器),其内部的程序不是我的。所以格式自己没有办法规定。因此,串口1的回调函数我只能用这里列出的void MT_UartProcessZToolData ( uint8 port, uint8 event ),而且采用中断方式。后来在用串口助手调试的过程中,(因为现在另外一个CC2530没有焊,用串口调试助手代替向主处理器发送任意十六进制数据)。问题由此产生了 ,我对串口1进来的数据直接到任务号为8任务处理。其处理方式为将数据立即通过串口0发送至上位机(这里的上位机不是调试助手,是LINUX下自己写的,串口0发送数据至上位的机的格式为固定长度32字节)。现象是:当我通过调试发送任意长度的十六进制数据时,回调函数调用的次数为发送数据的个数。而且通过串口0发送出来的数据是经过几次发送的。并且发出来的数据不会超过永远小或者等于4个十六进制数(也就是我通过调试助手发过的前4个,而且数据也没错,只是个数永远小4个)。
这里有两个现象值得注意:
1)串口1每接收一个字节就会调用一次回调函数,这样就不能打包成一条完整的消息。我认为是系统轮循1ms太快了。
2)数据接收不会超过4个。也不知道是什么原因
3)在LINUX发送的数据都能顺利到达串口调试助手。
不知道大家有没有遇到过这样的问题,也请高手能帮我我看看,可能是什么原因。