这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » MCU » MSP430F413模拟的串口001/002

共1条 1/1 1 跳转至

MSP430F413模拟的串口001/002

工程师
2014-09-29 20:10:42     打赏
#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;         }     }  }

共1条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]