我用的是龔建偉老師的串口除錯助手v2.2,我在他源代碼基礎上加了一些自己想要實作的功能,但不能接收大量的資料并保存在一個檔案,原來的程式只能將接收到的一部分資料保存為txt檔案,我是想實作將下位機傳來的大量資料都保存在同一個txt檔案 。他的那本書上寫了是在這里面修改,我反復看了好幾天,試了一些方法都沒有弄出來,希望會的人幫忙弄弄啊,非常感謝。
源程式中的接收處理部分的程式
LONG CSCOMMDlg::OnCommunication(WPARAM ch, LPARAM port)
{
rxdatacount++; //接收的位元組計數
strTemp.Format("%ld",rxdatacount);///將字符送入臨時變數strTemp存放
strTemp="RX:"+strTemp;
m_ctrlRXCOUNT.SetWindowText(strTemp); //顯示接收計數
if(m_bStopDispRXData) //如果選擇了“停止顯示”接收資料,則回傳
return -1; //注意,這種情況下,計數仍在繼續,只是不顯示
//若設定了“自動清空”,則達到50行后,自動清空接收編輯框中顯示的資料
if((m_ctrlAutoClear.GetCheck())&&(m_ctrlReceiveData.GetLineCount()>=50))
{
m_ReceiveData.Empty();
UpdateData(FALSE);
}
//如果沒有“自動清空”,資料行達到400后,也自動清空
//因為資料過多,影響接收速度,顯示是最費CPU時間的操作
if(m_ctrlReceiveData.GetLineCount()>400)
{
m_ReceiveData.Empty();
m_ReceiveData="https://bbs.csdn.net/topics/***The Length of the Text is too long, Emptied Automaticly!!!***/r/n";
UpdateData(FALSE);
}
//如果選擇了"十六進制顯示",則顯示十六進制值
CString str;
if(m_ctrlHexReceieve.GetCheck())
str.Format("%02X ",ch);
else
str.Format("%c",ch);
//以下是將接收的字符加在字串的最后,這里費時很多
//但考慮到資料需要保存成檔案,所以沒有用List Control
int nLen=m_ctrlReceiveData.GetWindowTextLength();
m_ctrlReceiveData.SetSel(nLen, nLen);
m_ctrlReceiveData.ReplaceSel(str);
nLen+=str.GetLength();
m_ReceiveData+=str;
return 0;
}
保存資料部分的函式
void CSCOMMDlg::OnButtonSavedata()
{
// TODO: Add your control notification handler code here
UpdateData(TRUE);
int nLength;
nLength = m_strCurPath.GetLength();//////m_strCurPath是資料檔案保存路徑
for( int nCount = 0; nCount < nLength; nCount++ )
{
if( m_strCurPath.GetAt( nCount ) == '\\' )
CreateDirectory( m_strCurPath.Left( nCount + 1 ), NULL );
}
CreateDirectory( m_strCurPath, NULL );
CFile m_rFile;
LPCSTR lpszPath =m_strCurPath; // "c:\\comdata";
SetCurrentDirectory( lpszPath );
//檔案名為Rec**.txt,以下代碼自動檢測檔案名是否存在,若存在,則后面序號自動遞增
//如Rec00.txt Rec01.txt,程式自動為正要保存的檔案命名為Rec02.txt.
char buf[20];
for(int j=0;j<100;j++)
{
sprintf(buf,"Rec%02d.txt",j);
if( (access( buf, 0 )) == -1 )
break;
}
if(!m_rFile.Open(buf,CFile::modeCreate | CFile::modeWrite ))
{
AfxMessageBox( "創建記錄檔案失敗!");
return;
}
if((access(buf,0))==-1)
{
AfxMessageBox("failed");
return;
}
CTime t = CTime::GetCurrentTime();
CString str=t.Format("%Y年%m月%d日%H時%M分%S秒\r\n");
m_rFile.Write((LPCTSTR)str,str.GetLength());
m_rFile.Write((LPCTSTR)m_ReceiveData,m_ReceiveData.GetLength());////////出現了m_ReceiveData
m_rFile.Flush();
m_rFile.Close();
str="OK,";
for(int i=0;i<5;i++)
str+=buf[i];
str+=".txt saved";
m_ctrlSavePath.SetWindowText(str);
SetTimer(2,5000,NULL); //在定時器中顯示保存檔案狀態
}
uj5u.com熱心網友回復:
串口很簡單, 自己寫一個串口通訊工具, 接收資料保存uj5u.com熱心網友回復:
strcpy(buf,"recv.txt",);if(!m_rFile.Open(buf,CFile::modeCreate | CFile::modeWrite|CFile::modeNoTruncate ))
{
AfxMessageBox( "創建記錄檔案失敗!");
return;
}
uj5u.com熱心網友回復:
http://blog.csdn.net/cvbtvbwu/article/details/24694739看上面的實體,能改得了不
uj5u.com熱心網友回復:
我也遇到這個問題,樓主是如何解決的???uj5u.com熱心網友回復:
各位道友,都還在論壇嗎?uj5u.com熱心網友回復:
肯定是記憶體中要快取啊,接收與顯示不在同一級別,有可能你接收了500K,才顯示了200K。轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/109599.html
標籤:基礎類
