怎样把vc6的MSComm控件接受的数据实时的显示在编辑框,并把数据实时惠存txt文件中

来源:互联网 发布:小规模企业 交税 算法 编辑:程序博客网 时间:2024/05/21 10:34

 

怎样把vc6的MSComm控件接受的数据实时的显示在编辑框,并把数据实时存入txt文件中
我在做一个基于VC6的MSComm控件的电机上位机控制,数据帧格式采用9600bps,8位数据位,奇校验,1位停止位,下位机每次发送16位数据,(16位是分两次发送吗??),高两位代表指令,后14位代表实际的数据,例如“00”代表的是发送的是转速数据,后14位才是转速的实际值。我现在要用vc++6.0的MSComm控件接受数据,把每次接受的数据要正确的显示在编辑框,并且要把每次的数据实时存入到不同的txt文件中。下面是我写的部分的代码,由于下位机还没有好。不知道写正确了没有,我是新手,望各位指导,共同学习。

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(); } } } 建议你看一下,龚建伟编的那本串口的书,他是编串口调试助手的那人,有很多例子不错。 还有,vckbase上的代码库里也有很多关于串口的例子,建议你看看!


 

0 0