菜鸟求指教MFV VC++6.0:代码一样,编译无错但运行之后没达到预期效果、成员变量“.(点)”后没出现成员函数、代码中几个问题
我是根据《Visual.C.TurboC串口通信编程实践(第2版)》的7.3节的CRC校验码计算的简单测试程序,按照书上一步步做,最后又和源代码句句对照,搞了一下午编译运行成功了,但点击“计算校验码”按钮但没生成校验码,又按F10一步步对照也没搞定,都已经第二个了!郁闷啊! 单步调试我觉得有问题的地方以用大红表示
.cpp中全部的成员变量“.”后没有成员函数,我关闭再删掉.ncb文件也没有,但我运行配套代码能达到预期效果和也能跳出成员函数等
还有我看代码中几个不懂的地方,我以用红色和???表示
请大家多多教下我这菜鸟,要工程我也会打包给您!!谢谢各位
.cpp代码:
void CCRCProgramDlg::OnButtonGetcrc()
{
// TODO: Add your control notification handler code here
UpdateData(TRUE); //得到编辑框中输入的十六进制数据段
char data[512];
//断点单步从下面开始变量就没变化了,好像是Str2Hex(m_strEditRawdata,data)没进去不知怎么回事 int len=Str2Hex(m_strEditRawdata,data);//将编辑框中的十六进制数据段读入
unsigned char *ptemp=(unsigned char*)((LPCTSTR)data);
unsigned short cc=CreateCRC(ptemp,len);//调用计算校验函数
unsigned short hightbit =cc/256;//计算校验码的高字节
unsigned short lowbit = cc-hightbit*256;//计算校验码的低字节
if(hightbit == 0 && hightbit ==0 && m_strEditRawdata.GetLength() == 0)
{ //???????上面一行的其中一个hightbit要改成lowbit吗?
//如果没有输入校验数据,则不输出结果
m_strEditCRCResult.Empty();
}
CString strHightBit;
strHightBit.Format("%02x",hightbit);
CString strLowBit;
strLowBit.Format("%02x",lowbit);
//显示时低字节在前,高字节在后
m_strEditCRCResult = strLowBit + ' ' + strHightBit;
if ((hightbit == 0 && lowbit == 0 )|| m_strEditRawdata.GetLength() == 0 )
{
m_strEditCRCResult.Empty();
}
UpdateData(false);//?????这干嘛用?与true有什么区别?}
//-------------------------下面为校验码处理函数--------------------------//
//
#define CRC16_GEN_POL 0x8005
#define MKSHORT(a,b) ((unsigned short) (a) | ((unsigned short) (b) << 8))
/* ::---------------------------------------------------------------------
:: FN: CreateCRC; CRC in ANSI - C
:: Synopsis: static void CreateCRC(BYTE *CommData,WORD uLen)
:: Function: formation of the CRC16 checksum.
------------------------------------------------------------------------*/
unsigned short CCRCProgramDlg::CreateCRC(unsigned char *RawData,unsigned int Len )
{
/*
RawData 为需要转换的原始数据
Len 为数组的长度
程序的返回值uCrc16为原始数据的校验码
*/
unsigned short uCrc16;
unsigned char abData[2];
uCrc16 = 0;
abData[0] = 0;
while (Len--)
{
abData[1] = abData[0];
abData[0] = *RawData++;
if(uCrc16 & 0x8000)
{
uCrc16 = (uCrc16 & 0x7fff) << 1;
uCrc16 ^= CRC16_GEN_POL;
}
else
{
uCrc16 <<=1;
}
uCrc16 ^= MKSHORT (abData[0] , abData[1]);
}
return(uCrc16);
}
//将字符串数据转换为十六进制数,并储存在data[]数组中,同时返回字符串的长度值
int CCRCProgramDlg::Str2Hex(CString str, char* data)
{
int t,t1;
int rlen=0,len=str.GetLength();
//data.SetSize(len/2);
for(int i=0;i<len;)
{
char l,h=str[i];//?????str不是字符串吗可以用数组? if(h==' ')
{
i++;
continue;
}
i++;
if(i>=len)
break;
l=str[i];
t=HexChar(h);
t1=HexChar(l);
if((t==16)||(t1==16))
break;
else
t=t*16+t1;
i++;
data[rlen]=(char)t;
rlen++;
}
return rlen;//?????rlen不是等于rlen?
}
//?????下面这个函数有什么用?为什么分3个循环?最好能具体点char CCRCProgramDlg::HexChar(char c)
{
if((c>='A')&&(c<='F'))
return c-0x30;
else if((c>='a')&&(c<='f'))
return c-'a'+10;
else
return 0x10;
}
void CCRCProgramDlg::OnButtonCleardata()
{
//清空数据
// TODO: Add your control notification handler code here
m_strEditCRCResult.Empty();
m_strEditRawdata.Empty();
UpdateData(FALSE);
}