📄 main.c
字号:
while((IFG1 & UTXIFG0) == 0 ) ;
TXBUF0 = ReceviceBuff[0];
SendData(CodeTable[1], 7); //总线申请允许
CommunicationErr = BUSENABLEERR;
ConflictFlag |= HASLINKEDFLG;
UartFlag = 0X8000; //接收指令并处理
break;
}
else
{
UartCount++;
}
}
UartCount = 2;
while((ReceviceBuff[UartCount] == ReceviceTable[2][UartCount])
&& (UartCount < 9) && (UartFlag == 0X00))
{ //收到是异常状态
if(UartCount == 7)
{
while((IFG1 & UTXIFG0) == 0);
TXBUF0 = ReceviceBuff[0];
while((IFG1 & UTXIFG0) == 0 ) ;
TXBUF0 = ReceviceBuff[0];
SendData(CodeTable[5], 7); //异常灯点亮
CommunicationErr = EMERGENCYONERR;
UartFlag = 0X8000; //接收指令并处理
break;
}
else
{
UartCount++;
}
}
UartCount = 2;
while((ReceviceBuff[UartCount] == ReceviceTable[3][UartCount])
&& (UartCount < 9) && (UartFlag == 0X00))
{ //收到是异常解除状态
if(UartCount == 7)
{
while((IFG1 & UTXIFG0) == 0);
TXBUF0 = ReceviceBuff[0];
while((IFG1 & UTXIFG0) == 0 ) ;
TXBUF0 = ReceviceBuff[0];
SendData(CodeTable[6], 7); //异常灯点灭
CommunicationErr = EMERGENCYOFFERR;
UartFlag = 0X8000; //接收指令并处理
break;
}
else
{
UartCount++;
}
}
UartCount = 2;
while((ReceviceBuff[UartCount] == ReceviceTable[4][UartCount])
&& (UartCount < 9) && (UartFlag == 0X00))
{ //收到是释放总线请求
if(UartCount == 3)
{
_NOP(); _NOP(); _NOP();
SendData(CodeTable[2], 9); //发送释放总线请求
CommunicationErr = BUSFREEERR;
UartFlag = 0X8000; //接收指令并处理
break;
}
else
{
UartCount++;
}
}
UartCount = 2;
while((ReceviceBuff[UartCount] == ReceviceTable[5][UartCount]) //收到PLC
&& (UartCount < 9) && (UartFlag == 0X00))
{
if(UartCount == 3)
{
switch(CommunicationErr)
{
case BUSENABLEERR:
while((IFG1 & UTXIFG0) == 0);
TXBUF0 = ReceviceBuff[0];
while((IFG1 & UTXIFG0) == 0 ) ;
TXBUF0 = ReceviceBuff[0];
SendData(CodeTable[1], 7); //总线申请允许
CommunicationErr = BUSENABLEERR;
break;
case EMERGENCYONERR:
while((IFG1 & UTXIFG0) == 0);
TXBUF0 = ReceviceBuff[0];
while((IFG1 & UTXIFG0) == 0 ) ;
TXBUF0 = ReceviceBuff[0];
SendData(CodeTable[5], 7); //异常灯点亮
CommunicationErr = EMERGENCYONERR;
break;
case EMERGENCYOFFERR:
while((IFG1 & UTXIFG0) == 0);
TXBUF0 = ReceviceBuff[0];
while((IFG1 & UTXIFG0) == 0 ) ;
TXBUF0 = ReceviceBuff[0];
SendData(CodeTable[6], 7); //异常灯点灭
CommunicationErr = EMERGENCYOFFERR;
break;
case RESENDERR:
while((IFG1 & UTXIFG0) == 0);
TXBUF0 = ReceviceBuff[0];
while((IFG1 & UTXIFG0) == 0 ) ;
TXBUF0 = ReceviceBuff[0]; //重发指令字
SendData(CodeTable[4], 2);
break;
case BEQUIETERR: //总线繁忙
UartCounter = 0;
SendData(CodeTable[0], 6);
CommunicationErr = BEQUIETERR;
break;
case BUSFREEERR:
SendData(CodeTable[2], 9); //发送释放总线
CommunicationErr = BUSFREEERR;
break;
}
UartFlag = 0X8000; //接收指令并处理
break; //跳出循环
}
else
{
UartCount++;
}
}
if((UartFlag == 0X00) //标志字不可确认,且建立了链接
&&((ConflictFlag & HASLINKEDFLG) == HASLINKEDFLG))
{
while((IFG1 & UTXIFG0) == 0);
TXBUF0 = ReceviceBuff[0];
while((IFG1 & UTXIFG0) == 0 ) ;
TXBUF0 = ReceviceBuff[0];
SendData(CodeTable[4], 2); //重发指令字
}
else if(UartFlag == 0X00) //标志字不可以确认,没有建立链接
{
SendData(CodeTable[0], 6); //发送总线冲突指令字
CommunicationErr = BEQUIETERR;
ConflictFlag |= TIMEOUTFLG; //定时超时标志
}
}
}
if((WatchRecevice >= 5) && (UartCounter > 9)) //接收到总线上的乱码 //接收到总线上的乱码
{
_DINT();
TBCCTL0 &= ~CCIE; //不允许定时器A中断
WatchRecevice = 0; //延时变量为0
UartCounter = 0;
SendData(CodeTable[0], 6); //发送总线冲突指令字
CommunicationErr = BEQUIETERR;
ConflictFlag |= TIMEOUTFLG; //定时超时标志
//_EINT();
//return;
}
ConflictFlag |= TIMEOUTFLG; //定时超时标志
/*if((ConflictFlag & VANFLAG) == VANFLAG)
{
WatchRecevice = 6;
UartCounter = 9;
}*/
_EINT();
}
/*if((P6IN & P6IN_4) != P6IN_4) //如果掉电进入掉电处理
{
Flag |= LowPowerFlg;
DisplayFlg &= ~FirstFlg;
if((DisplayFlg & FirstFlg) == FirstFlg)
{
TACCTL0 &= ~CCIE; //不允许定时器A中断
TBCTL = TBSSEL_1 + MC_1; //定时器B 32768HZ 中断
TBCCTL0 = CCIE; //定时器B 中断允许
TBCCR0 = 32768; //定时时间1s
LPM3;
}
}*/
/* if((Flag & ReceiveDataFlg) == ReceiveDataFlg) //接受上位机数据后,解包的处理
{
_DINT();
unsigned char Counter;
unsigned char ii=0;
signed char j=0;
unsigned int k=0;
unsigned int digital=0;
CheckSum=0;
for(ii=0; ii<9; ii++)
{
for(j=0; j<4; j++)
{
TotalProTemp[ii][j]=0; //临时数组初始化
}
}
while(ReceviceBuff[ii++] != '~') ; //获取接收数据指令的长度
j = 0;
for(Counter=4; Counter<(ii-4); Counter++) //截取数据字符
{
CheckSum += ReceviceBuff[Counter];
if((ReceviceBuff[Counter] != ',')) //获取ASCII数据
{
{
TotalProTemp[k][j++] = ReceviceBuff[Counter];
}
}
else
{
k++;
j = 0;
}
}
CheckSum += ReceviceBuff[3];
CheckSum = CheckSum & 0X0F; //校验和
CheckSum |= 0X20;
if(CheckSum == ReceviceBuff[ii-2]) //发送正确数据指令接收完毕
{
while((IFG1 & UTXIFG0) == 0);
TXBUF0 = AddressIndex[SelfAddress];
while((IFG1 & UTXIFG0) == 0);
TXBUF0 = AddressIndex[SelfAddress];
SendData(CorrectCode,2);
UartCount = 0;
Flag &= ~ReceiveDataFlg;
for(ii=0; ii<10; ii++)
{
TotalPro[ii]=0;
}
for(ii=0; ii<9; ii++) //将ASCII数据转换成数值数据
{
Counter = 0;
for(j=3; j>=0; j--)
{
switch(TotalProTemp[ii][j])
{
case '0':
Counter++;
digital = 0;
break;
case '1':
Counter++;
digital = 1;
break;
case '2':
Counter++;
digital = 2;
break;
case '3':
Counter++;
digital = 3;
break;
case '4':
Counter++;
digital = 4;
break;
case '5':
Counter++;
digital = 5;
break;
case '6':
Counter++;
digital = 6;
break;
case '7':
Counter++;
digital = 7;
break;
case '8':
Counter++;
digital=8;
break;
case '9':
Counter++;
digital = 9;
break;
}
switch(Counter)
{
case 1:
k = 1;
TotalPro[ii+1] += digital * k;
break;
case 2:
k = 10;
TotalPro[ii+1] += digital * k;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -