📄 txbin.c
字号:
/*
================================================================================
* @file TxBin.c
* @brief Process UART binary transmision
* @author 2006/03/29 Michiru Kagaya
* Copyright (C)SEIKO EPSON Corp. All Rights Reserved.
================================================================================
*/
//=================================
// Include files
//=================================
#include <string.h>
#include "UART_FUNC.h"
#include "UART_FuncCom.h"
#include "UART_UserConfig.h"
#include "UART_IF.h"
//=================================
// Function prototype
//=================================
static short SendCallback( unsigned short wMsg, unsigned short wStatus, void* pTxSize );
/*
--------------------------------------------------------------------------------
* UART_FuncSendDataA
* @brief Transmit data (Asynchronous)
* @param unsigned char bChannel : Channel number of suspension
* unsigned short wSize : Size of tranmission
* unsigned char *pData : The address of the transmission data
* UART_FUNC_CALLBACK pfnCallbackProc : Transmision complete notification callback function
* @retval unsigned short
* STATUS_SUCCESS : Complete normally
* STATUS_INVALID_PARAMETER: Parameter error
--------------------------------------------------------------------------------
*/
short UART_FuncSendDataA ( unsigned char bChannel, unsigned short wSize,
unsigned char *pData, UART_FUNC_CALLBACK pfnCallbackProc )
{
PTX_INFO psTxInfo;
short txStatus;
unsigned char index = bChannel - 1;
//===============================
// Check parameter
//===============================
if( wSize == 0 || pData == NULL
|| bChannel == 0 || bChannel > MAX_UART_CHANNEL ){
return STATUS_INVALID_PARAMETER;
}
psTxInfo = &sModuleInfo.sChInfo[index].txInfo;
// Does not the number of transmission exceed the size of sheltering buffer?
if( wSize > psTxInfo->wTempSize ){
return STATUS_UNSUCCESSFUL;
}
//===============================
// Check the state
//===============================
if( sModuleInfo.sChInfo[index].state != STATE_READY
|| sModuleInfo.sChInfo[index].txInfo.state != TRAN_STATE_READY){
return STATUS_UNSUCCESSFUL;
}
//===============================
// Save the data
//===============================
psTxInfo->wActSize = 0;
psTxInfo->wReqSize = wSize;
psTxInfo->pReqAddr = pData;
memcpy( psTxInfo->pTempBuf, pData, wSize ); // Copy data
psTxInfo->pPutAddr = psTxInfo->pTempBuf; // Set the transmission address
psTxInfo->pfnCallback = pfnCallbackProc;
//===============================
// Data transmission request
//===============================
psTxInfo->state = TRAN_STATE_EXEC_BINASYNC; // Set to Executing transmission.
txStatus = UART_IFWriteData( bChannel, psTxInfo->wReqSize, psTxInfo->pPutAddr, SendCallback );
if( txStatus != STATUS_SUCCESS ){
return STATUS_UNSUCCESSFUL;
}
return STATUS_SUCCESS;
}
/*
--------------------------------------------------------------------------------
* UART_FuncSendDataA
* @brief Data transmission (Asynchronous)
* @param unsigned char bChannel : Channel number of suspension
* unsigned short wSize : Transfer size
* unsigned char *pData : The address of the transfer data
* UART_FUNC_CALLBACK pfnCallbackProc : Completion notification callback function
* @retval unsigned short
* STATUS_SUCCESS : Complete normally
* STATUS_INVALID_PARAMETER: Parameter error
--------------------------------------------------------------------------------
*/
short UART_FuncSendData ( unsigned char bChannel, unsigned short wSize, unsigned char *pData )
{
unsigned short txStatus;
volatile unsigned char* pTranState;
PTX_INFO psTxInfo;
unsigned char index = bChannel - 1;
//===============================
// Check parameter
//===============================
if( wSize == 0 || pData == NULL
|| bChannel == 0 || bChannel > MAX_UART_CHANNEL ){
return STATUS_INVALID_PARAMETER;
}
//===============================
// Check the state
//===============================
if( sModuleInfo.sChInfo[index].state < STATE_READY
|| sModuleInfo.sChInfo[index].txInfo.state != TRAN_STATE_READY ){
return STATUS_UNSUCCESSFUL;
}
//===============================
// Save the data
//===============================
psTxInfo = &sModuleInfo.sChInfo[index].txInfo;
psTxInfo->wActSize = 0;
psTxInfo->wReqSize = wSize;
psTxInfo->pReqAddr = psTxInfo->pPutAddr = pData;
psTxInfo->pfnCallback = NULL;
//===============================
// Data transmission processing
//===============================
psTxInfo->state = TRAN_STATE_EXEC_BINSYNC; // Is transmiting
txStatus = UART_IFWriteData( bChannel, psTxInfo->wReqSize, psTxInfo->pPutAddr, SendCallback ); // 1Byte transmit request
if( txStatus != STATUS_SUCCESS ){
return STATUS_UNSUCCESSFUL;
}
pTranState = &psTxInfo->state; // Update the data pointer
// Waiting for the completion of the transmission.
//-------------------------------
do {
UART_DELAY( UART_DELAY_TIME ); // Waiting for the completion of the transmission.
}while( *pTranState != TRAN_STATE_CMP );
psTxInfo->state = TRAN_STATE_READY; // Waiting for the transmision to be ready
return STATUS_SUCCESS;
}
/*
--------------------------------------------------------------------------------
* SendCallback
* @brief The data transmit complettion callback
* @param unsigned short wMsg : transmission size
*
*
* @retval unsigned short
* STATUS_SUCCESS : Complete normally
--------------------------------------------------------------------------------
*/
static short SendCallback( unsigned short wMsg, unsigned short wStatus, void* pTxResult )
{
PTX_INFO psTxInfo;
unsigned char index;
unsigned short txStatus;
PUART_IF_TX_STS psTxStatus = (PUART_IF_TX_STS)pTxResult;
// Error check(make sure)
//===============================
if( wMsg != UART_IF_SND_DATA_CMP || pTxResult == NULL
|| psTxStatus->bChannel == 0 || psTxStatus->bChannel < MAX_UART_CHANNEL ){
return STATUS_INVALID_PARAMETER;
}
index = psTxStatus->bChannel - 1;
psTxInfo = &sModuleInfo.sChInfo[index].txInfo;
//===============================
//===============================
// Check status
//===============================
if( wStatus != STATUS_SUCCESS ){
// --- Transmission error completion callback notification ---
// Processing that corresponds synchronization or asynchronous
if( psTxInfo->state == TRAN_STATE_EXEC_BINASYNC ){
// Asynchronous
if( psTxInfo->pfnCallback != NULL ){ // pCallbackProc is NULL, so do not do the callback notification
UART_FUNC_XFER_RESULT sXferResult;
sXferResult.bChannel = psTxStatus->bChannel;
sXferResult.wReqSize = psTxInfo->wReqSize;
sXferResult.wActSize = psTxInfo->wActSize;
sXferResult.pBufAddr = psTxInfo->pReqAddr;
psTxInfo->state = TRAN_STATE_READY; // Waiting for the transmision ready
psTxInfo->pfnCallback( UART_FUNCM_SND_DATA_CMP, wStatus, &sXferResult );
}
}else{
// Synchronous
psTxInfo->state = TRAN_STATE_CMP; // The state is changed without call the callback when at synchronization.
}
return STATUS_SUCCESS;;
}
//===============================
// Update the data number
//===============================
psTxInfo->wActSize += psTxStatus->wActSize;
psTxInfo->pPutAddr += psTxStatus->wActSize;
//===============================
// Check if the transmission is completed
//===============================
if( psTxInfo->wReqSize <= psTxInfo->wActSize ){
//
if( psTxInfo->state == TRAN_STATE_EXEC_BINASYNC ){
// --- Asynchronous ---
if( psTxInfo->pfnCallback != NULL ){ // pCallbackProc is NULL, so do not do the callback notification
UART_FUNC_XFER_RESULT sXferResult;
sXferResult.bChannel = psTxStatus->bChannel;
sXferResult.wReqSize = psTxInfo->wReqSize;
sXferResult.wActSize = psTxInfo->wActSize;
sXferResult.pBufAddr = psTxInfo->pReqAddr; // Address specified by API call
psTxInfo->pfnCallback( UART_FUNCM_SND_DATA_CMP, STATUS_SUCCESS, &sXferResult );
}
psTxInfo->state = TRAN_STATE_READY; // Set to Waiting for Transmission
}else{
// --- Synchronous ---
psTxInfo->state = TRAN_STATE_CMP; // The state is changed without call the callback when at synchronization.
}
return STATUS_SUCCESS;;
}
//===============================
// Transmit Next transmisssion data
//===============================
txStatus = UART_IFWriteData( psTxStatus->bChannel, (unsigned short)(psTxInfo->wReqSize - psTxInfo->wActSize), psTxInfo->pPutAddr, SendCallback ); // 1Byte transmission requeset
if( txStatus != STATUS_SUCCESS ){
// Error occured
;
}
return STATUS_SUCCESS;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -