#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;
}
}
}
有奖活动 | |
---|---|
【EEPW电子工程师创研计划】技术变现通道已开启~ | |
发原创文章 【每月瓜分千元赏金 凭实力攒钱买好礼~】 | |
【EEPW在线】E起听工程师的声音! | |
“我踩过的那些坑”主题活动——第001期 | |
高校联络员开始招募啦!有惊喜!! | |
【工程师专属福利】每天30秒,积分轻松拿!EEPW宠粉打卡计划启动! | |
送您一块开发板,2025年“我要开发板活动”又开始了! | |
打赏了!打赏了!打赏了! |
打赏帖 | |
---|---|
多组DCTODC电源方案被打赏50分 | |
【我踩过的那些坑】STM32cubeMX软件的使用过程中的“坑”被打赏50分 | |
新手必看!C语言精华知识:表驱动法被打赏50分 | |
【我踩过的那些坑】STM32的硬件通讯调试过程的“坑”被打赏50分 | |
【我踩过的那些坑】晶振使用的问题被打赏100分 | |
【我踩过的那些坑】电感选型错误导致的处理器连接不上被打赏50分 | |
【我踩过的那些坑】工作那些年踩过的记忆深刻的坑被打赏10分 | |
【我踩过的那些坑】DRC使用位置错误导致的问题被打赏100分 | |
我踩过的那些坑之混合OTL功放与落地音箱被打赏50分 | |
汽车电子中巡航控制系统的使用被打赏10分 |