白沙的香烟盒 https://bbs.21ic.com/?77381 [收藏] [复制] [RSS] MCU,ARM,程序,应用手记

日志

MSP430F413模拟的串口002/002

已有 724 次阅读2013-2-23 02:53 |个人分类:程序参考|系统分类:单片机

#include <GLOBAL.h>
#include <stdlib.h>
#include <stdbool.h>
#include <msp430x41x.h>

#define SysRxd                   BIT5
#define SysRxdSt                 P1IN   &   BIT5
#define SysRxdIns                P1DIR &=~  BIT5

#define RecLedOut                P5DIR |=  BIT6
#define RecLedHig                P5OUT |=  BIT6
#define RecLedLow                P5OUT &=~ BIT6

extern void SysDataSend(unsigned char SendNo,unsigned char Table);
extern void SysSendFull(unsigned char Table,unsigned char CmdData,unsigned char DI0,unsigned char DI1,unsigned char Length);
extern void SlvSendFull(unsigned char Table,unsigned char CmdData,unsigned char DI0,unsigned char DI1,unsigned char Length);
//------------------------------ *** - 判断指令数据是否是单独指令 - *** ------------------------------//
bool SysCheckAdd(void)
{
    bool AddFg;
    unsigned char i;
    
    AddFg=0;
    for(i=0;i<4;i++)
    {      
        if(SysBuf[3+i]==0xaa)
        {
             AddFg=1; 
        }
        else
        {
            AddFg=0;
            LongToHex(GloBuf,(unsigned char*)&ChipMac);
            if(SysBuf[3+i] == GloBuf)
            {
                AddFg=1;
            }
            else
            {
                break;
            }
        }
    }
    return AddFg;
}
void SysAddParse(void)
{
    switch(SysBuf[9])
    {
        case 0x01 ://---读数据
                  switch(SysBuf[11])//---
                  {
                      case 0x90 ://---(点抄数据)
                                switch(SysBuf[12])//---
                                {
                                     case 0x10 ://---当前数据---FE FE FE 68 10 01 AA AA AA AA AA 68 01 03 90 10 D7 16
                                                SysSendRes=0x0001;
                                                SlvSendFull(SysBuf[2],0x01,0x90,0x10,0);
                                     break;
                                     case 0x11 ://---冻结数据
                                                SysSendRes=0x0002;
                                     break;
                                     case 0x1f ://---综合数据
                                                SysSendRes=0x0004;
                                     break;
                                } 
                      break;
                  }
        break;
        case 0x03 ://---读地址
                  switch(SysBuf[11])
                  {
                      case 0x81 :
                                switch(SysBuf[12])
                                {
                                     case 0x0a :
                                               SysSendRes=0x0008;
                                     break;
                                } 
                      break;
                  }
        break;
        case 0x04 ://---写数据
                  switch(SysBuf[11])
                  {
                      case 0x90 :
                                switch(SysBuf[12])
                                {
                                     case 0x10 :
                                               SysSendRes=0x0010;
                                     break;
                                } 
                      break;
                  }
        break;
        case 0x15 ://---写地址
                  switch(SysBuf[11])
                  {
                      case 0xa0 :
                                switch(SysBuf[12])
                                {
                                     case 0x18 :
                                               SysSendRes=0x0020;
                                     break;
                                } 
                      break;
                  }
        break;
        default:
                  SysSendRes=0x0000;
        break;
    }
}
void SysClerRec(void)
{
    SysRecDptr=0;
    SysInFg=0;
    SysSendEndFg=1;
    RamCler(SysBuf,48); 
}
void SysCmdPar(void)
{
    if(SysCheckAdd()) 
    {
        SysAddParse(); 
    }
    else
    {
        SysClerRec();  
    }
    SysDataSend(SysSendRes,SysBuf[2]);   
}
void SysCommConn(void)
{
    if(SysCmdParFg)
    {
        if(SysBuf[1]==0x10)
        {
            if(SysCheckSum())
            {
                SysCmdPar();
            }
            else
            {
                SysClerRec(); 
            }
        }
        else
        {
            SysClerRec(); 
        }
        SysCmdParFg=0;
    }
    else
    {
        if(SecConSt&0x01)
        {
            SecConSt&=0xfe; 
            if(SysInFg)
            { 
                if(SysInTime>0)
                {
                    SysInTime--; 
                }
                else
                {
                    SysClerRec(); 
                }
            }
        }
    }
}
void SysRecConn(void)
{
    unsigned char i;
    i=0;
    if(P1IFG&BIT5)
    {
        ChkFg=0;
        ChkBit=0;
        SysRecData=0;
        SysInFg=1;
        SysInTime=3;//--------------------------------------------如果两秒内没有接收结束自
        SysDelay(90); 
        while(i<10){if(i<9){if(i>0){SysRecData>>=1;if(SysRxdSt){SysRecData|=0x80;if(ChkBit){ChkBit=0;}else{ChkBit=1;}}}SysDelay(165);}else{if(i==9){ChkFg=SysRxdSt;SysDelay(75);}}i++;}
        if(ChkBit==ChkFg)//-------------------------------------------------------上次数据是否发送完毕?
        {
            if(SysSendEndFg)
            {
                if(SysRecDptr<48)
                {
                    if(SysRecDptr==0)//----------------------------------数据缓冲区地址指针是否为零
                    {                                                      
                        if(SysRecData==0x68)//------------------------------------数据保存到缓冲区---缓冲区的第一个数据是否等于0x68
                        {
                            SysBuf[0]=0x68;
                            SysRecDptr++;
                        }
                        else
                        {
                            SysRecDptr=0;//------------------------------缓冲区地址归零
                        }
                    }
                    else
                    {                                                        
                        if(SysRecDptr==8)//------------------------------缓冲区指针是否等于7
                        {
                            if(SysRecData==0x68)//--------------------------------缓冲区已接收的第8位是否等于0x68
                            {
                                SysBuf[8]=0x68;//--------------------------数据保存到缓冲区
                                SysRecDptr++;
                            }
                            else
                            {
                                SysRecDptr=0;//--------------------------缓冲区地址归零
                            }
                        }
                        else
                        {
                            SysBuf[SysRecDptr]=SysRecData;//--------------数据保存到缓冲区
                            SysRecDptr++;//------------------------------缓冲区地址累加     
                        }
                        if(SysRecDptr>12)
                        {
                            if(SysBuf[SysBuf[10]+11]==0x16)//----------------------------是否完成一帧数据的接收?结束符是否等于0x16
                            {
                                SysCmdParFg=1;//-----------------------------------------------启动命令解析使能位
                                SysRecDptr=0;//------------------------------------------缓冲区地址归零
                                SysSendEndFg=0;//------------------------------------------------已发送完毕位归零
                                P1IE &= ~SysRxd;
                            }               
                        }
                    }
                }
                else
                {
                     SysRecDptr=0;//--------------------------------------缓冲区地址归零
                }
            }
            else
            {
                SysRecDptr=0; 
            }
        } 
        else
        {
            SysRecDptr=0;
            SysRecData=0;
        }
    } 
}

路过

鸡蛋

鲜花

握手

雷人

评论 (0 个评论)