//全局变量
int LineHight[122];
int LHTemp[120];
CString DTemp;
int LineNum=0;
int NextTime;
int RightLeftNum=0;
int check='n';
int gogo=0;
int speed=9600;
int tab=0;
CString FilePath="c:\\data.txt";
// 画图函数
// 算法:运用LineTo函数把120个点连成折线
void CCommDlg::OnPaint() 
{
int hoc;
if (NextTime<600 && stop==FALSE) hoc = 600;
else hoc = NextTime;
CString TabStr="";
CPaintDC dc(this);// 用于绘制的设备上下文
dc.GetNearestColor(RGB(128,0,0));//设备能显示的最接近crColor值 
dc.MoveTo(108,250);//移动到坐标(108,250)
if (NextTime<=600 && stop==FALSE) //将点连成线
for (int i=0;i<(NextTime/5);i++)
{
dc.LineTo(108+(5*i),250-LineHight[i]*5+99);//
}
else
for (int i=0;i<121;i++)
{
dc.LineTo(108+(5*i),250-LineHight[i]*5+99);
}
TabStr.Format("%d",hoc/5-120); //X轴对应的时间坐标值,使时间对应数据改变
SetDlgItemText(IDC_TAB1,TabStr);
TabStr.Format("%d",hoc/5-100);
SetDlgItemText(IDC_TAB2,TabStr);
TabStr.Format("%d",hoc/5-80);
SetDlgItemText(IDC_TAB3,TabStr);
TabStr.Format("%d",hoc/5-60);
SetDlgItemText(IDC_TAB4,TabStr);
TabStr.Format("%d",hoc/5-40);
SetDlgItemText(IDC_TAB5,TabStr);
TabStr.Format("%d",hoc/5-20);
SetDlgItemText(IDC_TAB6,TabStr);
TabStr.Format("%d",hoc/5);
SetDlgItemText(IDC_TAB7,TabStr);
}
void CCommDlg::OnComm() 
{
if(stop)return;//若暂停,不接受数据
VARIANT m_input1;//定义VARIANT型变量,用于存放接收到的数据
COleSafeArray m_input2;;//定义safearray型变量
long length,i;
BYTE data[600];//定义BYTE型数组
CString str;//定义字符串
if(m_Comm.GetCommEvent()==2) //接收缓冲区内有字符
{
m_input1=m_Comm.GetInput(); //读取缓冲区内的数据,把接收到的数据存放到VARIANT型变量里
m_input2=m_input1; //将VARIANT型变量转换为ColeSafeArray型变量
length=m_input2.GetOneDimSize(); //确定数据长度
//.GetOneDimSize()是返回一维数组元素的个数,这个一维数组里面每个元素都是数组类型,依次存放到data[]中 
for(i=0;i<length;i++)
m_input2.GetElement(&i,data+i); //将数据转换为BYTE型数组,存在data[i]中。 for(i=0;i<length;i++) //将数组转换为Cstring型变量
{
CFile file;
CString tempstr;
BYTE a=* (char *)(data+i);
BYTE b=* (char *)(data+(++i));
float c=(float)a+(float)(b%10)/10;
str.Format("%2.1f ",c); //将c格式化
if (str.GetLength()<5) str="0"+str;
str = str.Right(5); //从数组中提取5个字符
m_ReceiveData+=str; //将刚采集的数加到编辑框中
LineHight[121]=a;
Display();//对数据显示前的处理
//将数据保存到文件中
if (m_ReceiveData.GetLength()>=600)//600个字符刚好对应120个数据
{
CStdioFile readfile; 
CString readstr,readstr2;
if(readfile.Open(FilePath,CFile::modeRead))
{
while(readfile.ReadString(readstr))//逐行查询,至到文件尾
{
readstr2+=readstr;
}
readfile.Close();
} if (file.Open(FilePath,CFile::modeCreate|CFile::modeReadWrite))
{
file.Write(readstr2,readstr2.GetLength());//原来的数据
  file.Write(m_ReceiveData,600);//写入新的120个数据
file.Close();
m_ReceiveData="";//清除编辑框内容
break;
}
}
}
}
UpdateData(FALSE);//更新编辑框内容
}
//对数据显示前的处理:将新数年据加到左边,原来的右移一位
void CCommDlg::Display()
{
if (NextTime <= 600 && stop==FALSE)
{
LineHight[NextTime/5] = LineHight[121];
}
else
{
for (int i=0;i<120;i++)
{
LineHight[i] = LineHight[i+1];
}
LineHight[120]=LineHight[121];
}
NextTime = NextTime+5;
this->Invalidate();
return;
}//这三个函数之间的运行先后顺序是怎么样的?没有main函数一下子不会看代码了。
//我的问题是dc.LineTo(108+(5*i),250-LineHight[i]*5+99);
//以及BYTE a=* (char *)(data+i);
// BYTE b=* (char *)(data+(++i));
// float c=(float)a+(float)(b%10)/10;
// str.Format("%2.1f ",c); //将c格式化
// if (str.GetLength()<5) str="0"+str;
// str = str.Right(5); //从数组中提取5个字符
// m_ReceiveData+=str; //将刚采集的数加到编辑框中
// LineHight[121]=a;
//这两个算法看不懂希望大家能帮我讲解一下。