打印

串口数据存到那里了呀我乍么找不到呀大家帮我看看

[复制链接]
1810|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
wuqi163|  楼主 | 2009-3-4 16:35 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#ifndef MODBUS_ASCII_H
#define MODBUS_ASCII_H

#define BAUD            (57600)
#define FRAME_START        ('(')
#define FRAME_END        (')')


/****************************************************************/
//
//                            接收模块
//
/****************************************************************/

//#define RxdBufLen        (1024*4)
//#define FrameBufLen        (256)
#define RxdBufLen        (64)
#define FrameBufLen        (32)

typedef struct
{
    char * volatile Start;
    char * volatile End;
    volatile int FrameLen;
}
FRAMEPT;

typedef struct
{
    volatile char Buf[RxdBufLen];            //字节数组
    char *volatile pWr;
    volatile int ByteCnt;                            //接收Byte计数器
    volatile FRAMEPT FramePt[FrameBufLen];    //帧指针数组
    volatile int FrameCnt;
    FRAMEPT *volatile pFrameWr;                //指向帧指针数组的写指针
    FRAMEPT *volatile pFrameRd;                //指向帧指针数组的读指针
}
RXDBUF;

int Modbus_GetFrame(char *pBuf);
void Modbus_Uart1_Init(int mclk,int baud);


/****************************************************************/
//
//                            发送模块
//
/****************************************************************/
#define TxdBufLen    (256)

typedef struct
{
    volatile char Buf[TxdBufLen];
    char *volatile pWr;
    char *volatile pRd;
    volatile int ByteCnt;
}
TXDBUF;

int Modbus_WrFrame(const volatile char *pBuf);

以上为Modbus_ASCII.h文件

#include "Modbus_ASCII.h"
#include <string.h>


/****************************************************************/
//
//                            接收模块
//
/****************************************************************/


static volatile RXDBUF RxdBuf;

//********************************************************************** 
//功 能: 帧读指针加1
//**********************************************************************
static void pFrameRd_Inc(void)
{
    if(RxdBuf.FrameCnt>0)
    {
        if(RxdBuf.pFrameRd == (FRAMEPT *volatile)&RxdBuf.FramePt[FrameBufLen-1])
        {
            RxdBuf.pFrameRd = (FRAMEPT *volatile)&RxdBuf.FramePt[0];
        }
        else
        {
            RxdBuf.pFrameRd++;
        }
    }
}

//********************************************************************** 
//功 能:    以帧的Start指针为指针向接收缓冲区读一字节
//读1字节->清0->Start指针加1
//**********************************************************************
static volatile char FrameState_RdByte(void)
{
    volatile char ch;
    if(RxdBuf.ByteCnt>0)
    {
        ch = (volatile char)*RxdBuf.pFrameRd->Start;
        *RxdBuf.pFrameRd->Start = (volatile char)0;
        if(RxdBuf.pFrameRd->Start == (char *volatile)&RxdBuf.Buf[(RxdBufLen-1)])
        {
            RxdBuf.pFrameRd->Start = (char *volatile)&RxdBuf.Buf[0];
        }
        else
        {
            RxdBuf.pFrameRd->Start++;
        }
        return (ch);
    }
    else
    {
        return (0);
    }
}

//********************************************************************** 
//功 能:     读一帧数据
//**********************************************************************
int Modbus_GetFrame(char *pBuf)
{
    int i;
    int Len;
    if(RxdBuf.FrameCnt>0)
    {
        Len = RxdBuf.pFrameRd->FrameLen;
        if(*RxdBuf.pFrameRd->Start==FRAME_START && *RxdBuf.pFrameRd->End==FRAME_END)
        {
            for(i=0;i<Len;i++)
            {
                *pBuf++ = FrameState_RdByte();
            }
            RxdBuf.pFrameRd->Start = (char *volatile)0;
            RxdBuf.pFrameRd->End = (char *volatile)0;
            RxdBuf.pFrameRd->FrameLen = (volatile int)0;
            pFrameRd_Inc();
            rINTMSK |= BIT_URXD1;
            RxdBuf.ByteCnt -= Len;
            RxdBuf.FrameCnt--;
            rINTMSK &= ~BIT_URXD1;
            return (1);
        }
        else
        {
            for(i=0;i<Len;i++)
            {
                FrameState_RdByte();
            }
            RxdBuf.pFrameRd->Start = (char *volatile)0;
            RxdBuf.pFrameRd->End = (char *volatile)0;
            RxdBuf.pFrameRd->FrameLen = (volatile int)0;
            pFrameRd_Inc();
            rINTMSK |= BIT_URXD1;
            RxdBuf.ByteCnt -= Len;
            RxdBuf.FrameCnt--;
            rINTMSK &= ~BIT_URXD1;
            return (0);
        }
    }
    else
    {
        return (0);
    }
}

//********************************************************************** 
//功 能: 删除接收缓冲区一字节数据
//删除数据->地址&计数器减1
//**********************************************************************
static void RxdBuf_DelByte(void)
{
    if(RxdBuf.ByteCnt>0)
    {
        *RxdBuf.pWr = (volatile char)0;
        if(RxdBuf.pWr == (char *volatile)&RxdBuf.Buf[0])
        {
            RxdBuf.pWr = (char *volatile)&RxdBuf.Buf[(RxdBufLen-1)];
        }
        else
        {
            RxdBuf.pWr--;
        }
        RxdBuf.ByteCnt--;
    }
}

//********************************************************************** 
//功 能: 向接收缓冲区写一字节数据
//地址加1->写数据->计数器加1
//**********************************************************************
static int RxdBuf_WrByte(const volatile char ch)
{
    if(RxdBuf.ByteCnt<RxdBufLen-1)
    {
        if(RxdBuf.pWr == (char *volatile)&RxdBuf.Buf[(RxdBufLen-1)])
        {
            RxdBuf.pWr = (char *volatile)&RxdBuf.Buf[0];
        }
        else
        {
            RxdBuf.pWr++;
        }
        *RxdBuf.pWr = (volatile char)ch;
        RxdBuf.ByteCnt++;
        return (1);
    }
    else
    {
        return (0);
    }
}


//********************************************************************** 
//功 能: 帧写指针加1
//**********************************************************************
static void pFrameWr_Inc(void)
{
    if(RxdBuf.FrameCnt<FrameBufLen-1)
    {
        if(RxdBuf.pFrameWr == (FRAMEPT *volatile)&RxdBuf.FramePt[(FrameBufLen-1)])
        {
            RxdBuf.pFrameWr = (FRAMEPT *volatile)&RxdBuf.FramePt[0];
        }
        else
        {
            RxdBuf.pFrameWr++;
        }
    }
}

//********************************************************************** 
//功 能:     串口接收中断处理
//**********************************************************************
static void __irq UART1_ISR_Rxd(void)
{
    int i;
    char ch;
    do
    {
        ch = RdURXH1();
        switch(ch)
        {
            case FRAME_START:
                if( RxdBuf.pFrameWr->Start == (char *volatile)0 )
                {
                    RxdBuf.pFrameWr->End = (char *volatile)0;
                    RxdBuf.pFrameWr->FrameLen = (volatile int)0;
                    if(RxdBuf_WrByte((volatile char)ch))
                    {                        
                        RxdBuf.pFrameWr->FrameLen = (volatile int)1;
                        RxdBuf.pFrameWr->Start = (char *volatile)RxdBuf.pWr;
                    }
                }
                else
                {
                    for(i=0;i<RxdBuf.pFrameWr->FrameLen;i++)
                    {
                        RxdBuf_DelByte();
                    }
                    RxdBuf.pFrameWr->Start = (char *volatile)0;
                    RxdBuf.pFrameWr->End = (char *volatile)0;
                    RxdBuf.pFrameWr->FrameLen = (volatile int)0;
                    
                    if(RxdBuf_WrByte((volatile char)ch))
                    {                        
                        RxdBuf.pFrameWr->FrameLen = (volatile int)1;
                        RxdBuf.pFrameWr->Start = (char *volatile)RxdBuf.pWr;
                    }
                }
                break;
            case FRAME_END:
                if( RxdBuf.pFrameWr->Start != (char *volatile)0 )
                {
                    if(RxdBuf.FrameCnt<FrameBufLen-1 && RxdBuf.ByteCnt<RxdBufLen-1)
                    {
                        RxdBuf_WrByte((volatile char)ch);
                        RxdBuf.pFrameWr->FrameLen++;
                        RxdBuf.pFrameWr->End = (char *volatile)RxdBuf.pWr;
                        pFrameWr_Inc();
                        RxdBuf.FrameCnt++;
                    }
                    else
                    {
                        for(i=0;i<RxdBuf.pFrameWr->FrameLen;i++)
                        {
                            RxdBuf_DelByte();
                        }
                        RxdBuf.pFrameWr->Start = (char *volatile)0;
                        RxdBuf.pFrameWr->End = (char *volatile)0;
                        RxdBuf.pFrameWr->FrameLen = (volatile int)0;
                    }
                }
                else
                {
                        for(i=0;i<RxdBuf.pFrameWr->FrameLen;i++)
                        {
                            RxdBuf_DelByte();
                        }
                        RxdBuf.pFrameWr->Start = (char *volatile)0;
                        RxdBuf.pFrameWr->End = (char *volatile)0;
                        RxdBuf.pFrameWr->FrameLen = (volatile int)0;
                }
                break;
            default:
                if(RxdBuf.ByteCnt<RxdBufLen-1)
                {
                    if(RxdBuf.pFrameWr->Start != (char *volatile)0)
                    {
                        if(RxdBuf_WrByte((volatile char)ch))
                        {
                            RxdBuf.pFrameWr->FrameLen++;
                        }
                    }
                }
                else
                {
                    for(i=0;i<RxdBuf.pFrameWr->FrameLen;i++)
                    {
                        RxdBuf_DelByte();
                    }
                    RxdBuf.pFrameWr->Start = (char *volatile)0;
                    RxdBuf.pFrameWr->End = (char *volatile)0;
                    RxdBuf.pFrameWr->FrameLen = (volatile int)0;
                }
                break;
        }
            
    }while( (rUFSTAT1&0xf) >0 );    //若RxD_FIFO计数器为0退出
    rI_ISPC = BIT_URXD1;            //清除中断标志
}

//********************************************************************** 
//功 能:     Modbus数据接收缓冲区初始化
//**********************************************************************
static void Modbus_RxdBuf_Init(void)
{
    memset((char *)&RxdBuf,0,sizeof(RxdBuf));
    RxdBuf.pWr = (char *volatile)&RxdBuf.Buf[0];
    RxdBuf.pFrameWr = (FRAMEPT *volatile)&RxdBuf.FramePt[0];
    RxdBuf.pFrameRd = (FRAMEPT *volatile)&RxdBuf.FramePt[0];
    RxdBuf.ByteCnt = (volatile int)0;
    RxdBuf.FrameCnt = (volatile int)0;
    RxdBuf.pFrameWr->FrameLen = (volatile int)0;
}





大家帮我看一下串口数据存到那个数组了乍么在WATCH里面查找接收到的数据

相关帖子

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

本版积分规则

14

主题

21

帖子

0

粉丝