打印
[NXP ARM]

LPC2300串口驱动程序 是不是有点问题?

[复制链接]
2508|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
精益求精|  楼主 | 2009-10-14 13:41 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
沙发
华荣汇FAE3| | 2009-10-14 17:04 | 只看该作者
能有更详细的相关代码吗?这样看不出什么问题。

使用特权

评论回复
板凳
精益求精|  楼主 | 2009-10-15 10:31 | 只看该作者
/*
*********************************************************************************************************
* 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);                                    
    }
}

使用特权

评论回复
地板
精益求精|  楼主 | 2009-10-15 10:33 | 只看该作者
华荣汇MCU发表于 2009-8-5 14:38 | 只看该作者 回复 引用 订阅 报告 收藏 分享 评分楼主: [NXP ARM] LPC2300串口驱动程序LPC, 程序, 驱动LPC2300串口驱动程序
LPC2300串口驱动程序.pdf (102.75 KB)
下载次数:72

2009-8-5 14:38



本主题由 华荣汇MCU 于 2009-8-24 16:47 解除精华

使用特权

评论回复
5
开源共享| | 2009-10-15 14:42 | 只看该作者
实际应用没有问题

使用特权

评论回复
6
精益求精|  楼主 | 2009-10-15 15:25 | 只看该作者
if (pbuf->RingBufTxOutPtr == &pbuf->RingBufTx[COMM_TX_BUF_SIZE])

上面的操作不报错?
请解释一下原因?
谢谢。。

使用特权

评论回复
7
开源共享| | 2009-10-16 09:00 | 只看该作者
pbuf->RingBufTxOutPtr ++
if (pbuf->RingBufTxOutPtr == &pbuf->RingBufTx[COMM_TX_BUF_SIZE])
上面的if语句如果成立,说明pbuf->RingBufTxOutPtr ++出界了,则有
    pbuf->RingBufTxOutPtr = &pbuf->RingBufTx[0];
指针回到头指针,也就是指针移出界外,是为判断,但没有引用当前指针指向的内容,
所以没有问题。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

19

主题

364

帖子

0

粉丝