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

日志

MSP430F413模拟的串口001/002

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

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

#define SlvRxd                   BIT7
#define SlvRxdSt                 P1IN   &  BIT7
#define SlvRxdIns                P1DIR &=~ BIT7


extern void SlvDataSend(unsigned char SendNo,unsigned char Table);
extern void SlvSendFull(unsigned char Table,unsigned char CmdData,unsigned char DI0,unsigned char DI1,unsigned char Length);
extern void SysSendFull(unsigned char Table,unsigned char CmdData,unsigned char DI0,unsigned char DI1,unsigned char Length);
//------------------------------ *** - 判断指令数据是否是单独指令 - *** ------------------------------//
bool SlvCheckAdd(void)
{
    bool AddFg;
    unsigned char i;
    
    AddFg=0;
    for(i=0;i<4;i++)
    {      
        if(SlvBuf[3+i]==0xaa)
        {
             AddFg=1; 
        }
        else
        {
            AddFg=0;
            LongToHex(GloBuf,(unsigned char*)&ChipMac);
            if(SlvBuf[3+i] == GloBuf)
            {
                AddFg=1;
            }
            else
            {
                break;
            }
        }
    }
    return AddFg;
}
void SlvAddParse(void)
{
    switch(SlvBuf[9])
    {
        case 0x01 ://---读数据
                  switch(SlvBuf[11])//---
                  {
                      case 0x90 ://---(点抄数据)
                                switch(SlvBuf[12])//---
                                {
                                     case 0x10 ://---当前数据---FE FE FE 68 10 01 AA AA AA AA AA 68 01 03 90 10 D7 16
                                                SlvSendRes=0x0001;
                                     break;
                                     case 0x11 ://---冻结数据
                                                SlvSendRes=0x0002;
                                     break;
                                     case 0x1f ://---综合数据
                                                SlvSendRes=0x0004;
                                     break;
                                } 
                      break;
                  }
        break;
        case 0x03 ://---读地址
                  switch(SlvBuf[11])
                  {
                      case 0x81 :
                                switch(SlvBuf[12])
                                {
                                     case 0x0a :
                                               SlvSendRes=0x0008;
                                     break;
                                } 
                      break;
                  }
        break;
        case 0x04 ://---写数据
                  switch(SlvBuf[11])
                  {
                      case 0x90 :
                                switch(SlvBuf[12])
                                {
                                     case 0x10 :
                                               SlvSendRes=0x0010;
                                     break;
                                } 
                      break;
                  }
        break;
        case 0x15 ://---写地址
                  switch(SlvBuf[11])
                  {
                      case 0xa0 :
                                switch(SlvBuf[12])
                                {
                                     case 0x18 :
                                               SlvSendRes=0x0020;
                                     break;
                                } 
                      break;
                  }
        break;
        default:
                  if(SlvBuf[9]==0x81)
                  {
                      if(SlvBuf[11]==0x90)
                      {
                          if(SlvBuf[12]==0x10)
                          {
                              ByteCopy(GloBuf,&SlvBuf[13],12);
                              SysSendFull(SlvBuf[2],0x81,0x90,0x10,12);
                          }
                      }
                  }
        break;
    }
}
void SlvClerRec(void)
{
    SlvRecDptr=0;
    SlvInFg=0;
    SlvSendEndFg=1;
    RamCler(SlvBuf,48); 
}
void SlvCmdPar(void)
{
    if(SlvCheckAdd()) 
    {
        SlvAddParse(); 
    }
    else
    {
        SlvClerRec();  
    }
    SlvDataSend(SlvSendRes,SlvBuf[2]);   
}
void SlvCommConn(void)
{
    if(SlvCmdParFg)
    {
        if(SlvBuf[1]==0x10)
        {
            if(SlvCheckSum())
            {
                SlvCmdPar();
            }
            else
            {
                SlvClerRec(); 
            }
        }
        else
        {
            SlvClerRec(); 
        }
        SlvCmdParFg=0;
    }
    else
    {
        if(SecConSt&0x02)
        {
            SecConSt&=0xfd; 
            if(SlvInFg)
            { 
                if(SlvInTime>0)
                {
                    SlvInTime--; 
                }
                else
                {
                    SlvClerRec(); 
                }
            }
        }
    }
}
void SlvRecConn(void)
{
    unsigned char i;
    i=0;
    
    if(P1IFG&BIT7)
    {
        ChkFg=0;
        ChkBit=0;
        SlvRecData=0;
        SlvInFg=1;
        SlvInTime=3;//--------------------------------------------如果两秒内没有接收结束自
        SlvDelay(90); 
        while(i<10){if(i<9){if(i>0){SlvRecData>>=1;if(SlvRxdSt){SlvRecData|=0x80;if(ChkBit){ChkBit=0;}else{ChkBit=1;}}}SlvDelay(165);}else{if(i==9){ChkFg=SlvRxdSt;SlvDelay(75);}}i++;}
        if(ChkBit==ChkFg)//-------------------------------------------------------上次数据是否发送完毕?
        {
            if(SlvSendEndFg)
            {
                if(SlvRecDptr<48)
                {
                    if(SlvRecDptr==0)//----------------------------------数据缓冲区地址指针是否为零
                    {                                                      
                        if(SlvRecData==0x68)//------------------------------------数据保存到缓冲区---缓冲区的第一个数据是否等于0x68
                        {
                            SlvBuf[0]=0x68;
                            SlvRecDptr++;
                        }
                        else
                        {
                            SlvRecDptr=0;//------------------------------缓冲区地址归零
                        }
                    }
                    else
                    {                                                        
                        if(SlvRecDptr==8)//------------------------------缓冲区指针是否等于7
                        {
                            if(SlvRecData==0x68)//--------------------------------缓冲区已接收的第8位是否等于0x68
                            {
                                SlvBuf[8]=0x68;//--------------------------数据保存到缓冲区
                                SlvRecDptr++;
                            }
                            else
                            {
                                SlvRecDptr=0;//--------------------------缓冲区地址归零
                            }
                        }
                        else
                        {
                            SlvBuf[SlvRecDptr]=SlvRecData;//--------------数据保存到缓冲区
                            SlvRecDptr++;//------------------------------缓冲区地址累加     
                        }
                        if(SlvRecDptr>12)
                        {
                            if(SlvBuf[SlvBuf[10]+11]==0x16)//----------------------------是否完成一帧数据的接收?结束符是否等于0x16
                            {
                                SlvCmdParFg=1;//-----------------------------------------------启动命令解析使能位
                                SlvRecDptr=0;//------------------------------------------缓冲区地址归零
                                SlvSendEndFg=0;//------------------------------------------------已发送完毕位归零
                                P1IE &= ~SlvRxd;
                            }               
                        }
                    }
                }
                else
                {
                     SlvRecDptr=0;//--------------------------------------缓冲区地址归零
                }
            }
            else
            {
                SlvRecDptr=0; 
            }
        } 
        else
        {
            SlvRecDptr=0;
            SlvRecData=0;
        }
    } 
}

路过

鸡蛋

鲜花

握手

雷人

评论 (0 个评论)