📄 mp2kdlg.cpp
字号:
DestData[PackagerCount ++] = 0xfd;
DestData[PackagerCount ++] = 0x02;
DataToCheck += 2;
break;
default:
DestData[PackagerCount ++] = SourceData[i];
DataToCheck ++;
break;
}
}
pCheckedData = DestData + 1;
CRC_Check = crc16_check(pCheckedData,(BYTE)DataToCheck);
switch((BYTE)CRC_Check)
{
case 0xff:
DestData[PackagerCount ++] = 0xfd;
DestData[PackagerCount ++] = 0x00;
break;
case 0xfe:
DestData[PackagerCount ++] = 0xfd;
DestData[PackagerCount ++] = 0x01;
break;
case 0xfd:
DestData[PackagerCount ++] = 0xfd;
DestData[PackagerCount ++] = 0x02;
break;
default:
DestData[PackagerCount ++] = (BYTE)CRC_Check;
break;
}
CRC_Check >>= 8;
switch((BYTE)CRC_Check)
{
case 0xff:
DestData[PackagerCount ++] = 0xfd;
DestData[PackagerCount ++] = 0x00;
break;
case 0xfe:
DestData[PackagerCount ++] = 0xfd;
DestData[PackagerCount ++] = 0x01;
break;
case 0xfd:
DestData[PackagerCount ++] = 0xfd;
DestData[PackagerCount ++] = 0x02;
break;
default:
DestData[PackagerCount ++] = (BYTE)CRC_Check;
break;
}
DestData[PackagerCount ++] = 0xfe;
*PackagedDataLen = PackagerCount;
return true;
}
bool CMp2KDlg::Unpackager(BYTE SourceData[1024],BYTE DestData[250],
long DataToUnpackage,long *UnpackagedDataLen)
{
long DataToCheck,DestDataCounter = 0;
BYTE *pCheckedData,LowCRC,HiCRC,*pLowCRC;
DataToCheck = DataToUnpackage - 4;
HiCRC = SourceData[DataToUnpackage - 2];
if((HiCRC == 0x00 || HiCRC == 0x01 || HiCRC == 0x02) &&
(SourceData[DataToUnpackage - 3] == 0xfd))
{
DataToCheck --;
LowCRC = SourceData[DataToUnpackage - 4];
pLowCRC = SourceData + DataToUnpackage - 4;
switch(HiCRC)
{
case 0x00:
HiCRC = 0xff;
break;
case 0x01:
HiCRC = 0xfe;
break;
case 0x02:
HiCRC = 0xfd;
break;
}
}
else
{
LowCRC = SourceData[DataToUnpackage - 3];
pLowCRC = SourceData + DataToUnpackage - 3;
}
if((LowCRC == 0x00 || LowCRC == 0x01 || LowCRC == 0x02) &&
((*pLowCRC) == 0xfd))
{
DataToCheck --;
switch(LowCRC)
{
case 0x00:
LowCRC = 0xff;
break;
case 0x01:
LowCRC = 0xfe;
break;
case 0x02:
LowCRC = 0xfd;
break;
}
}
pCheckedData = SourceData + 1;
CRC_Check = crc16_check(pCheckedData,(BYTE)DataToCheck);
if(LowCRC != (BYTE)CRC_Check)
return false;
if(HiCRC != (BYTE)(CRC_Check >> 8))
return false;
for(int i = 1;i <= DataToCheck;i ++)
{
if(SourceData[i] == 0xfd)
{
switch(SourceData[++ i])
{
case 0x00:
DestData[DestDataCounter ++] = 0xff;
break;
case 0x01:
DestData[DestDataCounter ++] = 0xfe;
break;
case 0x02:
DestData[DestDataCounter ++] = 0xfd;
break;
}
}
else
DestData[DestDataCounter ++] = SourceData[i];
}
*UnpackagedDataLen = DestDataCounter;
return true;
}
WORD CMp2KDlg::crc16_check(BYTE *data_in,BYTE length)
{
BYTE i;
WORD reg_crc = 0xffff;
while(length --)
{
reg_crc ^= *data_in++;
for(i = 0;i < 8;i ++)
{
if(reg_crc & 0x01)
reg_crc = (reg_crc >> 1) ^ 0xA001;
else
reg_crc = reg_crc >> 1;
}
}
return reg_crc;
}
void CMp2KDlg::TransferData(BYTE *TransferedData,long *DataToTransfer)
{
Unpackaged_Data.PackagedDataLen = 0;
CByteArray SentArray;
SentArray.RemoveAll();
SentArray.SetSize(*DataToTransfer);
for(int i = 0;i < (*DataToTransfer);i ++)
SentArray.SetAt(i,TransferedData[i]);
if(pCurSedMode->Operation_Mode == GETVERSION)
SerialCom.SetRThreshold(10);
else
SerialCom.SetRThreshold((short)(*DataToTransfer));
SerialCom.SetOutput(COleVariant(SentArray));
*DataToTransfer = 0;
if(PreviousOperation == SETBAUD)
{
SerialCom.SetInBufferCount(0);
PreviousOperation = NOOPERATE;
}
}
void CMp2KDlg::GetInputData(BYTE *ReceivedData,long *RDataLen)
{
input = SerialCom.GetInput();
SafeArray = input;
len = SafeArray.GetOneDimSize();
for(long i = 0;i < len;i ++)
{
SafeArray.GetElement(& i,ReceivedData + (*RDataLen));
(*RDataLen) ++;
}
}
void CMp2KDlg::MCom()
{
pCurSedNode->SentData[0] = 0x01;
pCurSedNode->SentData[1] = 0x00; // 串口地址
pCurSedNode->SentData[2] = 0x00; // 功能代码
for(int i = 3;i < 240;i ++)
pCurSedNode->SentData[i] = 0x01;
pCurSedNode->DataToWrited = 240;
Packager(pCurSedNode->SentData,Packaged_Data.PackagedData,pCurSedNode->DataToWrited,
&Packaged_Data.PackagedDataLen);
TransferData(Packaged_Data.PackagedData,&Packaged_Data.PackagedDataLen);
pCurSedNode = pCurSedNode->next;
}
void CMp2KDlg::SCom1()
{
pCurSedNode->SentData[0] = 0x01;
pCurSedNode->SentData[1] = 0x01; // 串口地址
pCurSedNode->SentData[2] = 0x00; // 功能代码
for(int i = 3;i < 240;i ++)
pCurSedNode->SentData[i] = 0x01;
pCurSedNode->DataToWrited = 240;
Packager(pCurSedNode->SentData,Packaged_Data.PackagedData,pCurSedNode->DataToWrited,
&Packaged_Data.PackagedDataLen);
TransferData(Packaged_Data.PackagedData,&Packaged_Data.PackagedDataLen);
pCurSedNode = pCurSedNode->next;
}
void CMp2KDlg::SCom2()
{
pCurSedNode->SentData[0] = 0x01;
pCurSedNode->SentData[1] = 0x02; // 串口地址
pCurSedNode->SentData[2] = 0x00; // 功能代码
for(int i = 3;i < 240;i ++)
pCurSedNode->SentData[i] = 0x01;
pCurSedNode->DataToWrited = 240;
Packager(pCurSedNode->SentData,Packaged_Data.PackagedData,pCurSedNode->DataToWrited,
&Packaged_Data.PackagedDataLen);
TransferData(Packaged_Data.PackagedData,&Packaged_Data.PackagedDataLen);
pCurSedNode = pCurSedNode->next;
}
void CMp2KDlg::SCom3()
{
pCurSedNode->SentData[0] = 0x01;
pCurSedNode->SentData[1] = 0x03; // 串口地址
pCurSedNode->SentData[2] = 0x00; // 功能代码
for(int i = 3;i < 240;i ++)
pCurSedNode->SentData[i] = 0x01;
pCurSedNode->DataToWrited = 240;
Packager(pCurSedNode->SentData,Packaged_Data.PackagedData,pCurSedNode->DataToWrited,
&Packaged_Data.PackagedDataLen);
TransferData(Packaged_Data.PackagedData,&Packaged_Data.PackagedDataLen);
pCurSedNode = pCurSedNode->next;
}
void CMp2KDlg::SCom4()
{
pCurSedNode->SentData[0] = 0x01;
pCurSedNode->SentData[1] = 0x04; // 串口地址
pCurSedNode->SentData[2] = 0x00; // 功能代码
for(int i = 3;i < 240;i ++)
pCurSedNode->SentData[i] = 0x01;
pCurSedNode->DataToWrited = 240;
Packager(pCurSedNode->SentData,Packaged_Data.PackagedData,pCurSedNode->DataToWrited,
&Packaged_Data.PackagedDataLen);
TransferData(Packaged_Data.PackagedData,&Packaged_Data.PackagedDataLen);
pCurSedNode = pCurSedNode->next;
}
void CMp2KDlg::OnMcom()
{
MComLoop = !MComLoop;
if(MComLoop)
{
KillTimer(ID_SCom1Timer);
KillTimer(ID_SCom2Timer);
KillTimer(ID_SCom3Timer);
KillTimer(ID_SCom4Timer);
SCom1Loop = false;
SCom2Loop = false;
SCom3Loop = false;
SCom4Loop = false;
SetTimer(ID_MComTimer,SEPTESTDELAY,NULL);
}
else
KillTimer(ID_MComTimer);
}
void CMp2KDlg::OnScom1()
{
SCom1Loop = !SCom1Loop;
if(SCom1Loop)
{
KillTimer(ID_MComTimer);
KillTimer(ID_SCom2Timer);
KillTimer(ID_SCom3Timer);
KillTimer(ID_SCom4Timer);
MComLoop = false;
SCom2Loop = false;
SCom3Loop = false;
SCom4Loop = false;
SetTimer(ID_SCom1Timer,SEPTESTDELAY,NULL);
}
else
KillTimer(ID_SCom1Timer);
}
void CMp2KDlg::OnScom2()
{
SCom2Loop = !SCom2Loop;
if(SCom2Loop)
{
KillTimer(ID_MComTimer);
KillTimer(ID_SCom1Timer);
KillTimer(ID_SCom3Timer);
KillTimer(ID_SCom4Timer);
MComLoop = false;
SCom1Loop = false;
SCom3Loop = false;
SCom4Loop = false;
SetTimer(ID_SCom2Timer,SEPTESTDELAY,NULL);
}
else
KillTimer(ID_SCom2Timer);
}
void CMp2KDlg::OnScom3()
{
SCom3Loop = !SCom3Loop;
if(SCom3Loop)
{
KillTimer(ID_MComTimer);
KillTimer(ID_SCom1Timer);
KillTimer(ID_SCom2Timer);
KillTimer(ID_SCom4Timer);
MComLoop = false;
SCom1Loop = false;
SCom2Loop = false;
SCom4Loop = false;
SetTimer(ID_SCom3Timer,SEPTESTDELAY,NULL);
}
else
KillTimer(ID_SCom3Timer);
}
void CMp2KDlg::OnScom4()
{
SCom4Loop = !SCom4Loop;
if(SCom4Loop)
{
KillTimer(ID_MComTimer);
KillTimer(ID_SCom1Timer);
KillTimer(ID_SCom2Timer);
KillTimer(ID_SCom3Timer);
MComLoop = false;
SCom1Loop = false;
SCom2Loop = false;
SCom3Loop = false;
SetTimer(ID_SCom4Timer,SEPTESTDELAY,NULL);
}
else
KillTimer(ID_SCom4Timer);
}
void CMp2KDlg::UpdateVersion()
{
CString tempString;
int VersionInt;
if(Data.DataToRead != 6)
return;
VersionInt = Data.ReceivedData[4];
VersionInt <<= 8;
VersionInt += Data.ReceivedData[5];
tempString.Format("%d",VersionInt);
if(m_VersionString.GetLength() == m_VersionString.ReverseFind(':') + 1)
m_VersionString += (" V" + tempString);
else
m_VersionString.Replace(m_VersionString.Mid(
m_VersionString.ReverseFind('V') + 1),tempString);
UpdateData(false);
}
void CMp2KDlg::OnOnCommMscomm1()
{//0
int i;
CString temp,temp1;
int ii;
switch(SerialCom.GetCommEvent())
{//1
case 1:
// 在发送缓冲区中的字符比SThresHold少
break;
case 2:
// 收到RThresHold个字符
GetInputData(Unpackaged_Data.PackagedData,&Unpackaged_Data.PackagedDataLen);
if(Unpackaged_Data.PackagedData[Unpackaged_Data.PackagedDataLen - 1] == 0xfe)
{//2
Unpackager(Unpackaged_Data.PackagedData,Data.ReceivedData,
Unpackaged_Data.PackagedDataLen,&Data.DataToRead);
Unpackaged_Data.PackagedDataLen = 0;
if(Data.DataToRead != pCurCheckedNode->DataToWrited)
{//3
switch(pCurCheckedMode->Operation_Mode)
{
case MCOM:
m_MComFail ++;
UpdateData(false);
break;
case SCOM1:
m_SCom1Fail ++;
UpdateData(false);
break;
case SCOM2:
m_SCom2Fail ++;
UpdateData(false);
break;
case SCOM3:
m_SCom3Fail ++;
UpdateData(false);
break;
case SCOM4:
m_SCom4Fail ++;
UpdateData(false);
break;
case LOOPMCOM:
m_MComLoopFail ++;
UpdateData(false);
break;
case LOOPSCOM1:
m_SCom1LoopFail ++;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -