INT16U mems_uart_send(INT8U *buf, INT16U len) { P_MSG_INFO pMsg = NULL; if((NULL == buf) || (0 == len)) { return (FALSE); } if(!(pMsg = (P_MSG_INFO)alloc_send_buffer(MSG_SHORT))) { return (FALSE); } memcpy(pMsg->msg_buffer, buf, len); pMsg->msg_header.msg_len = len; pMsg->msg_header.end_id = MEMS_COM_PORT; pMsg->msg_header.need_buffer_free = TRUE; return (End_send(pMsg)); }
/*********************************************************** Tick任务调用,检查每个END接口是否有新的frame收完 ************************************************************/ unsigned short End_tick_check(void) { OS_CPU_SR cpu_sr; unsigned char i; U16 cp_len, msg_len; P_END_OBJ pEndObj = NULL; P_MSG_INFO pnewmsg = NULL; P_UART_CCB p_uc; for(i = START_COM_PORT; i < MAX_COM_PORT; i++ ) { ///////////////////////////// pEndObj = g_EndObjectPool + i; p_uc = &g_uart_ccb[i]; if(pEndObj->end_send_status == END_STATUS_SENDING) { /* 检查当前对象是否发送完毕. 完毕的话, 转接收, 或者转空闲*/ if( End_check_send(pEndObj->end_id) == TRUE ) { //Send 已经结束, 转到receive status 初始状态 pEndObj->end_send_status = END_STATUS_IDLE; pnewmsg = (P_MSG_INFO)pEndObj->pMsgInfo; pnewmsg->msg_header.block_state = SENDED; // alan dynamic sending buffer. // 当前end sending 正常结束,可以直接释放sending buffer if( pnewmsg->msg_header.need_buffer_free == TRUE) /* 不需要保留到上层application 进行释放*/ { free_send_buffer(pnewmsg); } } } else { if( NULL != (pnewmsg = dequeue( g_EndTxQueue[pEndObj->end_id])) ) { End_send(pnewmsg); } } if( End_check_recv(pEndObj) == TRUE ) /* 没有新数据到来, 开始处理*/ { #if 0 // 将内存数据copy 出来, 压入queue 进行后续处理 if(pEndObj->receive_len >= MSA_MESSAGAE_MAX_SIZE) pnewmsg = alloc_send_buffer(MSG_LARGE); else if(pEndObj->receive_len >= PLC_BUFFER_UART_SIZE) pnewmsg = alloc_send_buffer(MSG_LONG); else pnewmsg = alloc_send_buffer(MSG_SHORT); #else pnewmsg = alloc_send_buffer(MSG_SHORT); #endif if(pnewmsg == NULL) { continue; } msg_len = pEndObj->receive_len; pnewmsg->msg_header.msg_len = msg_len; pnewmsg->msg_header.end_id = i; OS_ENTER_CRITICAL(); cp_len = (U16)(p_uc->gpUartRxEndAddress - p_uc->gpUartRxReadAddress); if(cp_len >= msg_len) { //OS_ENTER_CRITICAL(); memcpy(pnewmsg->msg_buffer, p_uc->gpUartRxReadAddress, msg_len ); p_uc->gpUartRxReadAddress += msg_len; if(p_uc->gpUartRxReadAddress == p_uc->gpUartRxEndAddress) p_uc->gpUartRxReadAddress = p_uc->gpUartRxStartAddress; //OS_EXIT_CRITICAL(); } else { //OS_ENTER_CRITICAL(); memcpy(pnewmsg->msg_buffer, p_uc->gpUartRxReadAddress, cp_len); memcpy((pnewmsg->msg_buffer + cp_len), p_uc->gpUartRxStartAddress, (msg_len-cp_len)); p_uc->gpUartRxReadAddress = p_uc->gpUartRxStartAddress + (msg_len-cp_len); //OS_EXIT_CRITICAL(); } OS_EXIT_CRITICAL(); pEndObj->last_receive_len = 0; pEndObj->receive_len = 0; pEndObj->endStatistics.rxPacketCount++; /* 将数据挂在queue 里*/ if(enqueue(g_EndRxQueue[pEndObj->end_id], (P_MSG_INFO)(pnewmsg))) { // 发送UART Rx 处理事件量 OSSemPost(g_sem_end); } else { free_send_buffer(pnewmsg); } } } return TRUE; }