📄 新建_文本文档_(2).txt
字号:
}
//******************************************************************************
//中断服务程序
//注:FF--命令解释出错,请求重发,FE--命令处理出错
//******************************************************************************
//串口数据接收中断服务程序
#pragma interrupt_handler uart0_rx_isr:12
void uart0_rx_isr(void)
{
int i=0;
uchar Temp=0;//临时变量
int DataLen=0;//长度
CLI(); //关闭一切中断
Temp=getuchar(); //读缓冲取数据
if(Temp==HANDEL) //判断是否是握手符号,确定是合法数据串
{
Temp=getuchar();
RecvBuff[0]=Temp;//命令
switch(RecvBuff[0])
{
//-----------------------------------------------------------------------------
//功 能:握手
//上位机:AA 01 00 00
//下位机: 5个字节
// 正确:BB 01 00 00 00
// CRC错误:BB 01 FF 00 00
//-----------------------------------------------------------------------------
case 0x01:
for(i=0;i<2;i++)
{
Temp=getuchar();
RecvBuff[i+1]=Temp;//数据
}
//处理命令
if(RecvBuff[0]==0x01&&RecvBuff[1] ==0x00&&RecvBuff[2]==0x00)
{
SendBuff[0]=0x05;//发送长度
SendBuff[1]=0xBB;
SendBuff[2]=0x01;
SendBuff[3]=0x00;
SendBuff[4]=0x00;
SendBuff[5]=0x00;
sendComm();
}
else
{
SendBuff[0]=0x05;//发送长度
SendBuff[1]=0xBB;
SendBuff[2]=0x01;
SendBuff[3]=0xFF;//FF--命令解释出错,请求重发,FE--命令处理出错
SendBuff[4]=0x00;
SendBuff[5]=0x00;
sendComm();
}
break;
//-----------------------------------------------------------------------------
//功 能:复位
//上位机:AA 02 00 00
//下位机: 5个字节
// 正确:BB 02 00 00 00
// CRC错误:BB 02 FF 00 00
//-----------------------------------------------------------------------------
case 0x02:
for(i=0;i<2;i++)
{
Temp=getuchar();
RecvBuff[i+1]=Temp;//数据
}
//处理命令
if(RecvBuff[0]==0x02&&RecvBuff[1] ==0x00&&RecvBuff[2]==0x00)
{
init_devices();
SendBuff[0]=0x05;//发送长度
SendBuff[1]=0xBB;
SendBuff[2]=0x02;
SendBuff[3]=0x00;
SendBuff[4]=0x00;
SendBuff[5]=0x00;
sendComm();
}
else
{
SendBuff[0]=0x05;//发送长度
SendBuff[1]=0xBB;
SendBuff[2]=0x02;
SendBuff[3]=0xFF;
SendBuff[4]=0x00;
SendBuff[5]=0x00;
sendComm();
}
break;
//-----------------------------------------------------------------------------
//功 能:设置模拟量上下限
//上位机:AA 03 组号 XX1 XX2 XX3 XX4 CRC1 CRC2 ----XX1,XX2=上限,XX3,XX4=下限
//下位机: 5个字节
// 正确:BB 03 00 00 00
// CRC错误:BB 03 FF 00 00
//-----------------------------------------------------------------------------
case 0x03:
for(i=0;i<7;i++)
{
Temp=getuchar();
RecvBuff[i+1]=Temp;//数据
}
//处理命令
if (CRC_Check(&RecvBuff[0],6,RecvBuff[6],RecvBuff[7]))//CRC校验
{
//放入数据
ADUp[RecvBuff[1]-1]=BytesToInt(RecvBuff[2],RecvBuff[3]);
ADDown[RecvBuff[1]-1]=BytesToInt(RecvBuff[4],RecvBuff[5]);
SendBuff[0]=0x05;//发送长度
SendBuff[1]=0xBB;
SendBuff[2]=0x03;
SendBuff[3]=0x00;
SendBuff[4]=0x00;
SendBuff[5]=0x00;
sendComm();
NeedSaveFlag=0x03;
}
else
{
SendBuff[0]=0x05;//发送长度
SendBuff[1]=0xBB;
SendBuff[2]=0x03;
SendBuff[3]=0xFF;
SendBuff[4]=0x00;
SendBuff[5]=0x00;
sendComm();
}
break;
//-----------------------------------------------------------------------------
//功 能:复位报警
//上位机:AA 04 00 00
//下位机: 5个字节
// 正确:BB 04 00 00 00
// CRC错误:BB 04 FF 00 00
//-----------------------------------------------------------------------------
case 0x04:
for(i=0;i<2;i++)
{
Temp=getuchar();
RecvBuff[i+1]=Temp;//数据
}
//处理命令
if (RecvBuff[0]==0x04&&RecvBuff[1]==0x00&&RecvBuff[2]==0x00)//校验
{
SendBuff[0]=0x06;//发送长度
SendBuff[1]=0xBB;
SendBuff[2]=0x04;
SendBuff[3]=0x00;
if(UseWarning)
{
UseWarning=0;
SendBuff[4]=0;
}
else
{
UseWarning=1;
SendBuff[4]=1;
}
CRC_Assign(&SendBuff[2],3,&SendBuff[5],&SendBuff[6]);//CRC校验
sendComm();
NeedSaveFlag=0x04;
}
else
{
SendBuff[0]=0x06;//发送长度
SendBuff[1]=0xBB;
SendBuff[2]=0x04;
SendBuff[3]=0xFF;
SendBuff[4]=0x00;
SendBuff[5]=0x00;
SendBuff[6]=0x00;
sendComm();
}
break;
//-----------------------------------------------------------------------------
//功 能:索取仪器编号
//上位机:AA 05 00 00
//下位机: 8个字节
// 正确:BB 05 00 XX1 XX2 XX3 00 00 ----XX1 XX2 XX3为编号
// CRC错误:BB 05 FF 00 00
//-----------------------------------------------------------------------------
case 0x05:
for(i=0;i<2;i++)
{
Temp=getuchar();
RecvBuff[i+1]=Temp;//数据
}
//处理命令
if (RecvBuff[0]==0x05&&RecvBuff[1]==0x00&&RecvBuff[2]==0x00)//校验
{
SendBuff[0]=0x08;//发送长度
SendBuff[1]=0xBB;
SendBuff[2]=0x05;
SendBuff[3]=0x00;
ReadMachineNumber();
SendBuff[4]=MachineNumber[0];
SendBuff[5]=MachineNumber[1];
SendBuff[6]=MachineNumber[2];
CRC_Assign(&SendBuff[2],5,&SendBuff[7],&SendBuff[8]);//CRC校验
sendComm();
}
else
{
SendBuff[0]=0x08;//发送长度
SendBuff[1]=0xBB;
SendBuff[2]=0x05;
SendBuff[3]=0xFF;
SendBuff[4]=0x00;
SendBuff[5]=0x00;
SendBuff[6]=0x00;
CRC_Assign(&SendBuff[2],5,&SendBuff[7],&SendBuff[8]);//CRC校验
sendComm();
}
break;
//-----------------------------------------------------------------------------
//功 能:索取仪器密码------------考滤到安全原因,暂时无用!!!!!!!!!!
//描 述:共三个密码,每一个密码点6个字节
//上位机:AA 06 00 00
//下位机: 23个字节
// 正确:BB 06 00 XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX CRC1 CRC2
// CRC错误: BB 06 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 CRC1 CRC2
//-----------------------------------------------------------------------------
case 0x06:
for(i=0;i<2;i++)
{
Temp=getuchar();
RecvBuff[i+1]=Temp;//数据
}
//处理命令
if (RecvBuff[0]==0x06&&RecvBuff[1]==0x00&&RecvBuff[2]==0x00)//校验
{
SendBuff[0]=23;//发送长度
SendBuff[1]=0xBB;
SendBuff[2]=0x06;
SendBuff[3]=0x00;
SendBuff[4]=0x00;
SendBuff[5]=0x00;
SendBuff[6]=0x00;
SendBuff[7]=0x00;
SendBuff[8]=0x00;
SendBuff[9]=0x00;
SendBuff[10]=0x00;
SendBuff[11]=0x00;
SendBuff[12]=0x00;
SendBuff[13]=0x00;
SendBuff[14]=0x00;
SendBuff[15]=0x00;
SendBuff[16]=0x00;
SendBuff[17]=0x00;
SendBuff[18]=0x00;
SendBuff[19]=0x00;
SendBuff[20]=0x00;
SendBuff[21]=0x00;
CRC_Assign(&SendBuff[2],20,&SendBuff[22],&SendBuff[23]);//CRC校验
sendComm();
}
else
{
SendBuff[0]=23;//发送长度
SendBuff[1]=0xBB;
SendBuff[2]=0x06;
SendBuff[3]=0xFF;
SendBuff[4]=0x00;
SendBuff[5]=0x00;
SendBuff[6]=0x00;
SendBuff[7]=0x00;
SendBuff[8]=0x00;
SendBuff[9]=0x00;
SendBuff[10]=0x00;
SendBuff[11]=0x00;
SendBuff[12]=0x00;
SendBuff[13]=0x00;
SendBuff[14]=0x00;
SendBuff[15]=0x00;
SendBuff[16]=0x00;
SendBuff[17]=0x00;
SendBuff[18]=0x00;
SendBuff[19]=0x00;
SendBuff[20]=0x00;
SendBuff[21]=0x00;
CRC_Assign(&SendBuff[2],20,&SendBuff[22],&SendBuff[23]);//CRC校验
sendComm();
}
break;
//-----------------------------------------------------------------------------
//功 能:索取仪器累计使用次数
//上位机:AA 07 00 00
//下位机: 7个字节
// 正确:BB 07 00 XX XX CRC1 CRC2 ----XX为数据
// CRC错误: BB 07 FF 00 00 CRC1 CRC2
//-----------------------------------------------------------------------------
case 0x07:
for(i=0;i<2;i++)
{
Temp=getuchar();
RecvBuff[i+1]=Temp;//数据
}
//处理命令
if (RecvBuff[0]==0x07&&RecvBuff[1]==0x00&&RecvBuff[2]==0x00)//校验
{
SendBuff[0]=0x07;//发送长度
SendBuff[1]=0xBB;
SendBuff[2]=0x07;
SendBuff[3]=0x00;
IntToBytes_Assign(&UseCount, &SendBuff[4],&SendBuff[5]);
CRC_Assign(&SendBuff[2],4,&SendBuff[6],&SendBuff[7]);//CRC校验
sendComm();
}
else
{
SendBuff[0]=0x07;//发送长度
SendBuff[1]=0xBB;
SendBuff[2]=0x07;
SendBuff[3]=0xFF;
SendBuff[4]=0x00;
SendBuff[5]=0x00;
CRC_Assign(&SendBuff[2],4,&SendBuff[6],&SendBuff[7]);//CRC校验
sendComm();
}
break;
//-----------------------------------------------------------------------------
//功 能:读取电流数据和开关量数据
//上位机:AA 08 00 00
//下位机: 22个字节
// 正确:BB 08 00 XX1 XX1 XX2 XX2 XX3 XX3 XX4 XX4 XX5 XX5 XX6 XX6 XX7 XX7 XX8 XX8 YY CRC1 CRC2
// |电流1| .... 开关量
// CRC错误: BB 08 FF 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 CRC1 CRC2
//-----------------------------------------------------------------------------
case 0x08:
for(i=0;i<2;i++)
{
Temp=getuchar();
RecvBuff[i+1]=Temp;//数据
}
//处理命令
if (RecvBuff[0]==0x08&&RecvBuff[1]==0x00&&RecvBuff[2]==0x00)//校验
{
//读去开关量
SendBuff[0]=22;//发送长度
SendBuff[1]=0xBB;
SendBuff[2]=0x08;
SendBuff[3]=0x00;
SendBuff[4]=AD[0]>>8;
SendBuff[5]=AD[0]&0xFF;
SendBuff[6]=AD[1]>>8;
SendBuff[7]=AD[1]&0xFF;
SendBuff[8]=AD[2]>>8;
SendBuff[9]=AD[2]&0xFF;
SendBuff[10]=AD[3]>>8;
SendBuff[11]=AD[3]&0xFF;
SendBuff[12]=AD[4]>>8;
SendBuff[13]=AD[4]&0xFF;
SendBuff[14]=AD[5]>>8;
SendBuff[15]=AD[5]&0xFF;
SendBuff[16]=AD[6]>>8;
SendBuff[17]=AD[6]&0xFF;
SendBuff[18]=AD[7]>>8;
SendBuff[19]=AD[7]&0xFF;
SendBuff[20]=PINC;//开关量
CRC_Assign(&SendBuff[2],19,&SendBuff[21],&SendBuff[22]);//CRC校验
sendComm();
}
else
{
SendBuff[0]=22;//发送长度
SendBuff[1]=0xBB;
SendBuff[2]=0x08;
SendBuff[3]=0xFF;
SendBuff[4]=00;
SendBuff[5]=00;
SendBuff[6]=00;
SendBuff[7]=00;
SendBuff[8]=00;
SendBuff[9]=00;
SendBuff[10]=00;
SendBuff[11]=00;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -