commwizarddlg.cpp
字号:
LTemp = byTemp[22];
LTemp = LTemp<<8;
LTemp = LTemp + byTemp[23];
sts.Format("%d",LTemp);
m_edAlarmBDown.SetSel(0,-1);
m_edAlarmBDown.Clear();
m_edAlarmBDown.ReplaceSel(sts);
}
nRec = 0;
KillTimer(5);
}
//CDialog::OnTimer(nIDEvent);
}
int CCommWizardDlg::String2Hex(CString str, CByteArray &senddata)
{
int hexdata,lowhexdata;
int hexdatalen=0;
int len=str.GetLength();
senddata.SetSize(len/2);
for(int i=0;i<len;)
{
char lstr,hstr=str[i];
if(hstr==' ')
{
i++;
continue;
}
i++;
if(i>=len)
break;
lstr=str[i];
hexdata=ConvertHexChar(hstr);
lowhexdata=ConvertHexChar(lstr);
if((hexdata==16)||(lowhexdata==16))
break;
else
hexdata=hexdata*16+lowhexdata;
i++;
senddata[hexdatalen]=(char)hexdata;
hexdatalen++;
}
senddata.SetSize(hexdatalen);
return hexdatalen;
}
int CCommWizardDlg::String2HexA(CString str, char *senddata)
{
int hexdata,lowhexdata;
int hexdatalen=0;
int len=str.GetLength();
// senddata.SetSize(len/2);
for(int i=0;i<len;)
{
char lstr,hstr=str[i];
if(hstr==' ')
{
i++;
continue;
}
i++;
if(i>=len)
break;
lstr=str[i];
hexdata=ConvertHexChar(hstr);
lowhexdata=ConvertHexChar(lstr);
if((hexdata==16)||(lowhexdata==16))
break;
else
hexdata=hexdata*16+lowhexdata;
i++;
senddata[hexdatalen]=(char)hexdata;
hexdatalen++;
}
// senddata.SetSize(hexdatalen);
return hexdatalen;
}
//这是一个将字符转换为相应的十六进制值的函数
//功能:若是在0-F之间的字符,则转换为相应的十六进制字符,否则返回-1
char CCommWizardDlg::ConvertHexChar(char ch)
{
if((ch>='0')&&(ch<='9'))
return ch-0x30;
else if((ch>='A')&&(ch<='F'))
return ch-'A'+10;
else if((ch>='a')&&(ch<='f'))
return ch-'a'+10;
else return (-1);
}
//红外数据上传
void CCommWizardDlg::OnDataup()
{
CString strcmd,str,stAA,st,strUp;
int nTemp,nx,ny,num;
unsigned char CRCH,CRCL;
unsigned int CRC;
unsigned int unTemp;
nRec = 0;
//清零网络命令
for(int i =0;i<150;i++)
{
SendSerData[i] = 0;
}
if(count == 0)
{
if(nChNum ==0)
{
if(AfxMessageBox("提示:上传数据将覆盖原有数据,要覆盖吗?", MB_YESNO) == IDNO)
return;
}
if(!m_bSerialSet)
SetTimer(2,500,NULL);
else
SetTimer(2,200,NULL);
}
switch(m_nChannelNum)
{
case 0:
nx = 1;
ny = 1;
break;
case 1:
nx = 2;
ny = 2;
break;
case 2:
nx = 4;
ny = 3;
break;
case 3:
nx = 8;
ny = 4;
break;
default:
break;
}
if(bReceived)
{
if( (nChNum >= 1) && ( nChNum <=5) )
{
if(m_bSerialSet)//网络传输时
{
if(!m_bTreadRWok)//等待线程读写完成
return;
}
if(count<26)
{
stAA.Format("AA(%02x-%d)",count,nChNum);
}
else
{
nTemp = count - 25;
stAA.Format("AA(%xC-%d)",nTemp,nChNum);
}
//sIrda
st.Format("NEW_CHANNEL%d_IRDA",ny);
::WritePrivateProfileString(st,stAA, sRecIrda, ".\\irda.ini");
sRecIrda = _T("");
}
if(count<=39)
{
nChNum++;
if(nChNum >= 1 && nChNum <=5)
{
if(count<26)
{
stAA.Format("AA(%02x-%d)",count,nChNum);
num=count;
}
else
{
nTemp = count - 25;
stAA.Format("AA(%xC-%d)",nTemp,nChNum);
unTemp = (unsigned int )(count - 25);
unTemp = unTemp<<4;
unTemp = unTemp + 0xc;
num=unTemp;
}
}
if( (nChNum >= 1) && (nChNum<=5) )
{
SendBuffer[0] = 0x7e;
SendBuffer[1] = 0x7e;
SendBuffer[2] = atoi(m_sAirModelAddr);//0x01;
SendBuffer[3] = 0x00;
nx = nx<<4;
nx+=nChNum;
SendBuffer[4] = nx;//通道号 + 数据段号
SendBuffer[5] = 0x02;//字节数
SendBuffer[6] = 0x11;//上传命令
SendBuffer[7] = num; //数据号
CRC = SendBuffer[2] + SendBuffer[3] + SendBuffer[4] + SendBuffer[5] + SendBuffer[6] + SendBuffer[7];
CRCL=CRC&0x00ff;
CRCH =(CRC>>8);
SendBuffer[8] = CRCH;
SendBuffer[9] = CRCL;
SendBuffer[10]= 0x7e;
SendBuffer[11]= 0x7e;
strUp = _T("");
for(int i=0;i<12;i++)
{
str.Format("%02x ",SendBuffer[i]);
strUp=strUp+str;
SendSerData[i+1] = SendBuffer[i]; //格式化网络数据命令 2008.06.23 ZQL
SendSerData[0] ++;
}
if(!m_bSerialSet)
SendCmd(strUp);//发送命令
else
{
m_bSerSendFlag = 1;//置位发送命令,开始发送
//AfxMessageBox(strUp);
AfxBeginThread(Serial_WriteThead,&SocketPr);//
}
}
if(nChNum >=6)
{
nChNum = 0;
count ++;
}
}
else
count++;
}
if(count >= 41)
{
count = 0;
bReceived = true;
nChNum =0;
m_ctPsupdown.SetPos(0); //进度指示
KillTimer(2);
return;
}
m_ctPsupdown.SetRange(0,40);
m_ctPsupdown.SetPos(count); //进度指示
}
//红外数据下载
void CCommWizardDlg::OnDatadown()
{
CString strcmd,stAA,str,strDown,strTp,st,stx;
unsigned int CRC = 0;
unsigned int nCRC=0;
unsigned char CRCL = 0;
unsigned char CRCH = 0;
char hexdata[512];
unsigned char relen;
unsigned char tm;
int n,i,j,k=0;
int nTemp,nx,ny;
#if 1 //zql Debug
for(i=0;i<512;i++)
hexdata[i] = 0x00;
for(i=0;i<150;i++)
SendSerData[i] = 0x00; //清空网络数据命令 2008.06.23 ZQL
/*
CString ss;
ss.Format("%d",byTemp[7]);
AfxMessageBox(ss);
*/
if(m_bBULK)
{
if(m_bSerialSet)//网络传输时
{
if(!m_bTreadRWok)//等待线程读写完成
return;
}
}
else
{
for(i=0;i<512;i++)
{
byTemp[i] = 0x00;//本通道第一次运行清零
}
}
//上次失败,本次五段数据均需重传
if(((byTemp[7] == 0xAA) ||(byTemp[7] == 0xff)) && m_bBULK)//0xff 失败; 0xAA 无返回值
{
if(nSendChNum==0)
{
count_d--;
}
nSendChNum = 0;//数据号
}
else
{
if(count_d >= 40)
{
count_d = 0;
nSendChNum = 0;
m_bBULK = 0;//校验数据结束
m_uAutoD++;//自动下载红外通道号
m_ctPsupdown.SetPos(0); //进度指示
if(m_bAutoDown && (m_uAutoD < 4))
{
m_ctrlChannelSel.SetCurSel(m_uAutoD);
m_nChannelNum = m_ctrlChannelSel.GetCurSel();//通道号
}
if(m_bAutoDown && m_uAutoD >=4)
{
KillTimer(3);
m_uAutoD =0;
AfxMessageBox("四个通道的红外数据下载完毕!");
m_ctrlChannelSel.SetCurSel(0);
m_nChannelNum = m_ctrlChannelSel.GetCurSel();//通道号
return;
}
else if(!m_bAutoDown)
{
KillTimer(3);
m_uAutoD =0;
AfxMessageBox("单通道的红外数据下载完毕!");
return;
}
}
}
m_bBULK = 1;//开始校验下载标志
//初始化
nRec = 0;
nSendChNum ++;
if(count_d == 0)
{
if(!m_bSerialSet)
SetTimer(3,350,NULL);
else
SetTimer(3,200,NULL);
}
switch(m_nChannelNum)
{
case 0:
nx = 1;
ny = 1;
break;
case 1:
nx = 2;
ny = 2;
break;
case 2:
nx = 4;
ny = 3;
break;
case 3:
nx = 8;
ny = 4;
break;
default:
break;
}
if(count_d<26)
stAA.Format("AA(%02x-%d)",count_d,nSendChNum);
else
{
nTemp = count_d - 25;
stAA.Format("AA(%xC-%d)",nTemp,nSendChNum);
}
if(m_bDownOneEn)//读通道1数据,下载到其他通道或本通道
{
::GetPrivateProfileString("NEW_CHANNEL1_IRDA",stAA,NULL,strcmd.GetBuffer(1024),1024,".\\irda.ini");
}
else
{
stx.Format("NEW_CHANNEL%d_IRDA",ny);
//读取文件红外数据
::GetPrivateProfileString(stx,stAA,NULL,strcmd.GetBuffer(1024),1024,".\\irda.ini");
}
str.Format("%s",strcmd);
int len = String2HexA(str,hexdata);
hexdata[2] = atoi(m_sAirModelAddr);//0x01;//空调模块地址
hexdata[3] = 0x00;//PC机地址
nx = nx<<4;
nx = nx + nSendChNum;
hexdata[4] = nx;//通道号 + 数据段号
hexdata[6] = 0x10;//下载命令
if(nSendChNum >= 5)
{
nSendChNum = 0;
count_d ++;
}
if((unsigned char)hexdata[len - 1] == 0xff)
len = len - 1;
tm = (unsigned char)hexdata[5]-1;
hexdata[5] = tm;
relen = tm + 4;
k = 0;
j = 0;
n = 0;
for(i=2;i<len-2;i++)
{
if(i>=3 )
{
if( ( (((unsigned char)hexdata[i-1]) == 0x7e) && (((unsigned char)hexdata[i]) == 0x81)) || i==8 )
{
if(i!=8)
{
n81Num++;
}
continue;
}
}
nCRC = nCRC + (unsigned char)hexdata[i];
k++;
if(relen == k)
{
k = 0;
if((unsigned char)hexdata[i] == 0x7e)//2008.05.09 ZQL ADD: ...7e 81 CRCH CRCL 7e 7e
n81Num++;
break;
}
}
/*
CString sss;
sss.Format("%04x",nCRC);
AfxMessageBox(sss);
*/
CRCL = nCRC&0x00ff;
CRC = nCRC >> 8;
CRCH = CRC&0x00ff;
i = 0;
k = 0;
n = 0;
for(j=0;j<len-2;j++)
{
if(j>=3)
{
if( j==8 )
{
continue;
}
}
SendSerData[SendSerData[0]+1] = ((unsigned char)hexdata[j]); //格式化网络数据命令 2008.06.23 ZQL
SendSerData[0] ++;
strDown.Format("%02x ",(unsigned char)hexdata[j]);
strTp = strTp + strDown;
strDown= _T("");
k++;
if(relen + 2 + n81Num == k)
{
k=0;
n81Num =0;
break;
}
}
//校验
strDown.Format("%02x ",CRCH);
strTp = strTp + strDown;
SendSerData[SendSerData[0] + 1] = CRCH; //格式化网络数据命令 2008.06.23 ZQL
SendSerData[0] ++;
if(strDown == _T("7e "))
{
strTp = strTp + _T("81 ");
SendSerData[SendSerData[0] + 1] = 0x81; //格式化网络数据命令 2008.06.23 ZQL
SendSerData[0] ++;
}
strDown= _T("");
strDown.Format("%02x ",CRCL);
strTp = strTp + strDown;
SendSerData[SendSerData[0] + 1] = CRCL; //格式化网络数据命令 2008.06.23 ZQL
SendSerData[0] ++;
if(strDown == _T("7e "))
{
strTp = strTp + _T("81 ");
SendSerData[SendSerData[0] + 1] = 0x81; //格式化网络数据命令 2008.06.23 ZQL
SendSerData[0] ++;
}
strDown= _T("");
//贞尾 7e 7e
strDown.Format("%02x ",(unsigned char)hexdata[0]);
strTp = strTp + strDown;
strDown= _T("");
SendSerData[SendSerData[0] + 1] = ((unsigned char)hexdata[0]); //格式化网络数据命令 2008.06.23 ZQL
SendSerData[0] ++;
strDown.Format("%02x ",(unsigned char)hexdata[0]);
strTp = strTp + strDown;
strDown= _T("");
SendSerData[SendSerData[0] + 1] = ((unsigned char)hexdata[0]); //格式化网络数据命令 2008.06.23 ZQL
SendSerData[0] ++;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -