关于VC+问题

来源:百度知道 编辑:UC知道 时间:2024/06/14 14:16:39
某程序从下位机获取后处理的源代码如下:
void CFTY100_SIMDlg::OnGetAcceleData()
{unsigned char BReadData[40];
CString sTemp;
short swTemp;
float fTemp;
if(g_bInExecute) return;
g_bInExecute = 1;
m_strRecData = "";
memset(BReadData,0,sizeof(BReadData));
if(FTYPerformCmd(GET_SPEEDUP_DATA,BReadData))
{
if ((BReadData[1]==3) &&(BReadData[3]==0x0f) )
{
m_strRecData += "正在触发,稍后再取数。";
}
else
{
m_strRecData += sTemp;
swTemp = BReadData[4]*256+BReadData[5];
fTemp=(float)(-(log(1-(float)swTemp/1000))/0.43);
sTemp.Format("加速码:%2x,烟度值:%4d,吸收系数:%5.3f",BReadData[3],swTemp,fTemp);
m_strRecData += sTemp;
}

获取到的数据格式:
第一组:
地址 数据长度 命令码 数据1 数据2 数据3 校验和
01 05 04 01 03 9B 58
第二组:
地址 数据长度 命令码 数据1 数据2 数据3 数据4 数据5 校验和
01 07 04 02 03 80 03 9B D2

经过上面代码处理后
第一组值:01 05 04 01 03 9B 58(十六进制)等于5.963 (M-1 单位)

这个程序是这样一来的:

FTYPerformCmd(GET_SPEEDUP_DATA,BReadData)) 首先用该涵数接受数据. 存放在 BReadData 数组内. 存放格式应该为:

地址 数据长度 命令码 数据1 数据2 数据3 数据4 数据5 校验和
[0] [1] [2] [3] [4] [5] [6] [7] [8]

swTemp = BReadData[4]*256+BReadData[5];
fTemp=(float)(-(log(1-(float)swTemp/1000))/0.43);
然后再用这两个式子进行计算

现在我用你的第一组数据为例子:
BReadData[4]就是 03, BReadData[5]就是 9B;
所以swTemp算出来为: 923 也就是 所谓的烟度值
(1-(float)swTemp/1000)等于0.077.然后用MATH.H的LOG涵数求
(这里我补充一点,函数里的LOG()和计算器的LOG()是不一样的.涵数如果不给底数的话,是自然对数,也就是LOG E X.E = 2.718281828... 通常也写为 LN . 而计算器上的LOG 是常用对数, 用10做底.)
fTemp就为:5.963 了 也就是 所谓的吸收系数
加速码:01

代码不全,没办法帮你解读。最起码要把OnGetAcceleData类的源码写上啊。

偶连C语言的考试都没通过呢,泪奔