/*
*********************************************************************************************************
* Filename : COMM_FW.C
* Programmer :
* 描述: 串行口通信程序
* DATE: 2007.11.18
****************************************************************************************
*/
#define COMM_GLOBALS
#include "..\includes\includes.H"
DEFINE_THIS_MODULE(COMM_FK)
typedef struct {
INT16U RingBufRxCtr;
INT8U *RingBufRxInPtr;
INT8U *RingBufRxOutPtr;
INT8U RingBufRx[COMM_RX_BUF_SIZE];
INT16U RingBufTxCtr;
INT8U *RingBufTxInPtr;
INT8U *RingBufTxOutPtr;
INT8U RingBufTx[COMM_TX_BUF_SIZE];
} COMM_RING_BUF;
/*
*********************************************************************************************************
* GLOBAL VARIABLES
*********************************************************************************************************
*/
COMM_RING_BUF Comm1Buf;
COMM_RING_BUF Comm2Buf;
COMM_RING_BUF Comm3Buf;
COMM_RING_BUF Comm4Buf;
void CommInit (void)
{
COMM_RING_BUF *pbuf;
pbuf = &Comm1Buf;
pbuf->RingBufRxCtr = 0;
pbuf->RingBufRxInPtr = &pbuf->RingBufRx[0];
pbuf->RingBufRxOutPtr = &pbuf->RingBufRx[0];
pbuf->RingBufTxCtr = 0;
pbuf->RingBufTxInPtr = &pbuf->RingBufTx[0];
pbuf->RingBufTxOutPtr = &pbuf->RingBufTx[0];
pbuf = &Comm2Buf;
pbuf->RingBufRxCtr = 0;
pbuf->RingBufRxInPtr = &pbuf->RingBufRx[0];
pbuf->RingBufRxOutPtr = &pbuf->RingBufRx[0];
pbuf->RingBufTxCtr = 0;
pbuf->RingBufTxInPtr = &pbuf->RingBufTx[0];
pbuf->RingBufTxOutPtr = &pbuf->RingBufTx[0];
pbuf = &Comm3Buf;
pbuf->RingBufRxCtr = 0;
pbuf->RingBufRxInPtr = &pbuf->RingBufRx[0];
pbuf->RingBufRxOutPtr = &pbuf->RingBufRx[0];
pbuf->RingBufTxCtr = 0;
pbuf->RingBufTxInPtr = &pbuf->RingBufTx[0];
pbuf->RingBufTxOutPtr = &pbuf->RingBufTx[0];
pbuf = &Comm4Buf;
pbuf->RingBufRxCtr = 0;
pbuf->RingBufRxInPtr = &pbuf->RingBufRx[0];
pbuf->RingBufRxOutPtr = &pbuf->RingBufRx[0];
pbuf->RingBufTxCtr = 0;
pbuf->RingBufTxInPtr = &pbuf->RingBufTx[0];
pbuf->RingBufTxOutPtr = &pbuf->RingBufTx[0];
}
/*
*********************************************************************************************************
清接收缓冲区
********************************************************************************************************
*/
void CommClrRxBuf(INT8U ch)
{
INT8U err;
if(!CommIsRxEmpty(ch)){ //如果接收缓冲区不空
while(!CommIsRxEmpty(ch)){
CommGetRxChar(ch,&err);
}
}
}
/*
*********************************************************************************************************
*中断中发送数据调用,从TX缓冲区取数
********************************************************************************************************
*/
INT8U CommGetTxChar (INT8U ch, INT8U *err)
{
INT8U c;
COMM_RING_BUF *pbuf;
switch (ch) {
case COMM1:
pbuf = &Comm1Buf;
break;
case COMM2:
pbuf = &Comm2Buf;
break;
case COMM3:
pbuf = &Comm3Buf;
break;
case COMM4:
pbuf = &Comm4Buf;
break;
default:
*err = COMM_BAD_CH;
return (NUL);
}
if (pbuf->RingBufTxCtr > 0) {
pbuf->RingBufTxCtr--;
c = *pbuf->RingBufTxOutPtr++;
if (pbuf->RingBufTxOutPtr == &pbuf->RingBufTx[COMM_TX_BUF_SIZE]) {
pbuf->RingBufTxOutPtr = &pbuf->RingBufTx[0];
}
*err = COMM_NO_ERR;
return (c);
} else {
*err = COMM_TX_EMPTY;
return (NUL);
}
}
|