vc++MSComm控件接收数据并曲线实时显示,该如何处理
2个回答
展开全部
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();
}
}
}
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();
}
}
}
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询