ZAPP回调函数出现BUG后的一点体会(同时使用两个串口方法)
[复制链接]
/*************************************************************************************************** * @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发送的数据都能顺利到达串口调试助手。
不知道大家有没有遇到过这样的问题,也请高手能帮我我看看,可能是什么原因。
|