我做了一个串口通信的对话框,用文本编辑框显示串口数据,编辑框变量为m_strRXData,通过下面的代码在编辑框中可以显示十六进制数,我希望打开txt文件看到的也是十六进制的。而下面代码存储后打开是乱码。。应该如何改呢,希望高手指点迷津,给出详细一点的代码,谢谢了。代码如下:
variant_inp=m_ctrlComm.GetInput(); //读缓冲区
safearray_inp=variant_inp; //VARIANT型变量转换为ColeSafeArray型变量
len=safearray_inp.GetOneDimSize(); //得到有效数据长度
for(k=0;k<len;k++)
safearray_inp.GetElement(&k,rxdata+k);//转换为BYTE型数组
for(k=0;k<len;k++) //将数组转换为Cstring型变量
{
BYTE bt=*(char*)(rxdata+k); //字符型
strtemp.Format("%c",bt); //将字符送入临时变量strtemp存放
m_strRXData+=strtemp; //加入接收编辑框对应字符串
if(m_ctrl16.GetCheck())
strtemp.Format("%02X ",bt); //将字符以十六进制方式送入临时变量strtemp存放
else
strtemp.Format("%c",bt); //将字符送入临时变量strtemp存放
m_strRXData+=strtemp; //加入接收编辑框对应字符串
//将字符存入文件
CFile file;
file.Open("d:/d.txt",CFile::modeWrite|CFile::modeCreate|CFile::typeBinary);
file.Seek(0,CFile::begin);
file.Write(& m_strRXData,2048);
file.Close();
}
}
UpdateData(FALSE); //更新编辑框内容
variant_inp=m_ctrlComm.GetInput(); //读缓冲区
safearray_inp=variant_inp; //VARIANT型变量转换为ColeSafeArray型变量
len=safearray_inp.GetOneDimSize(); //得到有效数据长度
for(k=0;k<len;k++)
safearray_inp.GetElement(&k,rxdata+k);//转换为BYTE型数组
for(k=0;k<len;k++) //将数组转换为Cstring型变量
{
BYTE bt=*(char*)(rxdata+k); //字符型
strtemp.Format("%c",bt); //将字符送入临时变量strtemp存放
m_strRXData+=strtemp; //加入接收编辑框对应字符串
if(m_ctrl16.GetCheck())
strtemp.Format("%02X ",bt); //将字符以十六进制方式送入临时变量strtemp存放
else
strtemp.Format("%c",bt); //将字符送入临时变量strtemp存放
m_strRXData+=strtemp; //加入接收编辑框对应字符串
//将字符存入文件
CFile file;
file.Open("d:/d.txt",CFile::modeWrite|CFile::modeCreate|CFile::typeBinary);
file.Seek(0,CFile::begin);
file.Write(& m_strRXData,2048);
file.Close();
}
}
UpdateData(FALSE); //更新编辑框内容
file.Write(&m_strRXData,2048);
你这样写到文件里的数据不管你接收到是什么都是把变量地址开始的2048个字节存到文件里去了,与变量的内容一点关系都没有。
你试这样:
file.Write(m_strRXData.GetString(), m_strRXDdata.GetLength());
D:\search\SCommTest\SCommTestDlg.cpp(308) : error C2039: 'GetString' : is not a member of 'CString'
d:\work\vc98\mfc\include\afx.h(368) : see declaration of 'CString'
D:\search\SCommTest\SCommTestDlg.cpp(308) : error C2065: 'm_strRXDdata' : undeclared identifier
D:\search\SCommTest\SCommTestDlg.cpp(308) : error C2228: left of '.GetLength' must have class/struct/union type
1.CString在VC6时没有GetString(),你可以这样(LPSTR)(LPCTSTR)m_strRXData
2.很报歉,我把m_strRXData写成了m_strRXDdata了,也就是变量名拼错了。错误提示已经说明了是m_strRXDdata未声明。正确的写法应该是:
file.Write((LPSTR)(LPCTSTR)m_strRXData, m_strRXData.GetLength());
fstream f1;
f1.open("d:/d.txt",ios::in|ios::out);
f1.seekg(0,ios::end); // 移动到文件尾
if(!f1)
{
MessageBox("打不开","提示",0);
return;
}
f1<<m_strRXData;