vc++MSComm控件接收数据并曲线实时显示,该如何处理

如题所述

CFile m_file(_T("data.txt"),CFile::modeCreate|CFile::modeWrite);//创建一个data.txt文件??
CFile m_file2(_T("data2.txt"),CFile::modeCreate|CFile::modeWrite);//创建一个data2.txt文件??
int savespeed,savecurrent;//savespeed是存入data.txt的全局变量,savecurrent是存入data2.txt的全局变量
//下面是MSComm控件的消息响应函数
void CreceiveDlg::OnOnCommMscomm()
{
VARIANT variant_in;
COleSafeArray safearray_in;
short m_data,m_flag;
long k,len,l_COM;
BYTE r_data[1024];//设置BYTE数组
CString temp, strtemp;
if(m_ctrlComm.GetCommEvent()==2)
{
variant_in=m_ctrlComm.GetInput();//读缓冲区数据,设置一个字符触发OnComm事件
safearray_in=variant_in;//类型转换
len=safearray_in.GetOneDimSize();//得到有效数据长度??
for(k=0;k<len;k++)
safearray_in.GetElement(&k,r_data+k);//转换成BYTE型数组,8-bit
l_COM=len;//一次从缓冲区接受的数据长度??
}
//下面是把16位数据整合为一个有效的数据,各位大神,帮看看,不知道对不对?
//下面这个if语句应该放在上面的if语句内部还是就是放在外部??也模糊
if(l_COM==2)
{
m_data=(r_data[0]$amp;<amp;$lt;8)+r_data[1]; 把接受的原始16位赋给一个整数 
}
//下面得到高两位的控制指令
m_flag=(m_data&0xc000)$amp;>amp;$gt;14;//得到高两位指令,不知道对不对??
switch(m_flag)
{
case 0:
{
CString str_speed;
short speed;
speed=m_data$amp;<amp;$lt;2;
speed=m_data$amp;>amp;$gt;2;//右移两位,左移两位把高两位置“00”得到后14位
//下面把该次接受的实时数据存入data.txt文件,不知道对不对??
savespeed=speed;//把要存的值赋给全局变量savespeed,savespeed是要存入txt的变量
savespeed+=" ";//隔开两个位置
savespeed+="\r\n";//换行
m_file.Write(savespeed,savespeed.GetLength());//写到文件中
savespeed="";//清空,以便下次继续写入
//以下是把该次转速赋给编辑框关联的变量?
str_speed.Format("d%",speed);//把speed以字符形式给临时变量
m_speed=str_speed;//m_speed位编辑框关联的变量
break;
}
case 1:
{
CString str_current;
short current;
current=m_data$amp;<amp;$lt;2;
current=m_data$amp;>amp;$gt;2;//右移两位,左移两位把高两位置“00”
//下面把该次接受的实时数据存入data2.txt文件,不知道对不对??
savecurrent=current;//把要存的值赋给全局变量savecurrent,savecurrent是要存入txt的变量
savecurrent+=" ";//隔开两个位置
savecurrent+="\r\n";//换行
m_file2.Write(savecurrent,savecurrent.GetLength());//写到文件中
savecurrent="";//清空,以便下次继续写入
//以下是把该次电流赋给编辑框关联的变量?
str_curreent.Format("d%",current);//把current以字符形式给临时变量
m_current=str_current;//m_current位编辑框关联的变量
break;
}
case 2:
{
//待写
}
}
//更新编辑框
UpdataData(False);

}
保存的文件在工程所在文件夹内。
http://www.educity.cn/wenda/248338.html

VC++串口通信中怎么将串口收到的数据保存到文件中
在OnComm事件中作如下处理:

LONG CSCRDlg::OnCommunicate(WPARAM ch, LPARAM port)

{

if(port==1) //COM1接收到数据

{

RXData[chnum] = ch;//RXData[] 全局char变量

chnum++; //接收到的字符个数

if(chnum==41) //接收到n个后进行保存处理

{

CFile file;

CFileException e;

int error=0;

if(!file.Open(defaultpath,CFile::modeCreate|CFile::typeBinary|CFile::modeWrite,&e))

MessageBox("保存文件时出错,不能保存数据","BJ2948A",MB_ICONERROR);

else

{

TRY

{

file.Write(&RXData,sizeof(N));

}

CATCH(CFileException,e)

{

if(e->m_cause!=CFileException::none)

{

error=1;

MessageBox("保存文件时出错","BJ2948A警告",MB_ICONERROR);

}

}

END_CATCH

if(error==0)

MessageBox("文件已保存!","BJ2948A提示",MB_ICONINFORMATION);

}

file.Close();

}

}

}
温馨提示:内容为网友见解,仅供参考
第1个回答  2014-11-06
坐标变换撒.至于怎么变,那就是数学问题了.
x轴对称再移动原点即可.

假设你想在屏幕坐标的, x0,y0处作为你想绘制的坐标的原点.
数学坐标计算出来是x1,y1,
那么在屏幕上应该绘制的点为: x = x1 + x0; y= -y1+y0本回答被提问者和网友采纳
相似回答