hur.cn - 华软网

 热门搜索

如何将串口接收的数据实时在保存在txt文件?

  作者:未知    来源:网络    更新时间:2013/4/17
   用MScomm控件读取到光功率计的字符串,转换成双精度的数据实时显示在编辑框中,现在我想保存实时显示的数据在TXT或excel文件中,哪位大神能告诉我该怎么做吗?我是新手
---华软 网友回答---
你保存在编辑框都会了, 那么保存在文件中问题不大.
无非是在保存到编辑框中的那个时候, 打开一个文件(以追加的方式打开), 然后写入文件, 再关闭.

当然, 也可以一直打开, 然后只是写入.
程序退出时关闭文件即可.

示例:
//假设下面函数中接收Com数据的函数
CDlgXXX::OnRecv(char *data)
{
   //SetDlgItemText(IDC_EDIT, data);//
   FILE *pFile = fopen("c:\\data.txt","a");
   fwrite(data,1, strlen(data), pFile);
   fclose(pFile);
}
---华软网友回复---
想保存成EXCEL的格式,就把扩展名改成csv就行了,数据用空格或逗号分隔.也就是只要是空格或逗号分隔的数据,扩展名就可以是txt和csv
---华软网友回复---
FILE *pFile = fopen("c:\\data.txt","a");
fseek( pFile, 0, SEEK_END); //每次都移动到文件结尾在写入
   fwrite(data,1, strlen(data), pFile);
   fclose(pFile);

---华软网友回复---
经典的串口接收数据的例子如下:
1.在头文件中声明存储数据的数组和记录数据的文件地址
BYTE   rxdata[4096]; //设置BYTE数组 An 8-bit integerthat is not signed.
CFile m_file(_T("data.txt"),CFile::modeCreate|CFile::modeWrite);
2.写MScomm232的接收事件(记得接收事件的ID应该是2吧)
[align=left]void COperation::OnCommMscomm1()//串口接收数据并处理

int nEvent=m_Comm.get_CommEvent();//得到事件
switch(nEvent)
{
case 2://接收数据事件
{
VARIANT variant_inp; 
COleSafeArray safearray_inp; 
long len,k;  
//-------------接收数据并进行处理---------------//
k=m_Comm.get_InBufferCount();//接收缓冲区字符数
if(k>0)
{
variant_inp=m_Comm.get_Input(); //读缓冲区
safearray_inp=variant_inp; //VARIANT型变量转换为ColeSafeArray型变量
len=safearray_inp.GetOneDimSize(); //得到有效数据长度
for(k=0;k<len;k++) 
safearray_inp.GetElement(&k,rxdata+k);//转换为BYTE型数组,存入rxdata
}
//-------------写入文本文件---------------//
for (int j=0;j<len;j++)
{
temp.Format(_T("%0x"),rxdata[j]);
mydata += temp;
mydata += "  ";//隔开两个位置;
}
mydata += "\r\n";
m_file.Write(mydata,mydata.GetLength());//写到文件中
mydata = "";//清空
}

default:
break;
}
}
[/align]






---华软网友回复---
上段代码,楼主就懂


CString cstrSaveFilePath;
cstrSaveFilePath = m_cstrSaveOBpath + _T("\\HotPoint_") + cstrViewName +_T(".txt");
if(!saveHotFile.Open(cstrSaveFilePath, CFile::modeWrite|CFile::modeCreate, &err))
{
err.ReportError();
return FALSE;
}

CString cstrHead = _T("Longitude\tLatitude\tTraffic In Grid\n"); //列头
saveHotFile.WriteString(cstrHead); //输出列头
std::map<DWORD,OptimizedBaseOut>::iterator iter = newSiteResult.hotSpotSet.begin();
for(; iter!= newSiteResult.hotSpotSet.end(); iter++)  //循环写内容
{
CString strLine;
strLine.Format("%0.6f\t%0.6f\t%0.2f\n", iter->second.dLongitude, iter->second.dLatitude,iter->second.fWeight);
saveHotFile.WriteString(strLine);
}

saveHotFile.Close();

---华软网友回复---
楼上的大虾们都写的很详细,可以用了吗?
---华软网友回复---
現在有一顆IC能同時連接電腦和安卓的, 是USB轉串口的, FT231X
---华软网友回复---
用createfile。
---华软网友回复---
引用 5 楼 tiger9991 的回复:
上段代码,楼主就懂

C/C++ code?12345678910111213141516171819CString cstrSaveFilePath;        cstrSaveFilePath = m_cstrSaveOBpath + _T("\\HotPoint_") + cstrViewName +_T(".txt");        if(!saveHo……
 
万分感谢,可以用了


---华软网友回复---
FILE *pFile = fopen("c:\\data.txt","a");
fseek( pFile, 0, SEEK_END); //每次都移动到文件结尾在写入
   fwrite(data,1, strlen(data), pFile);
   fclose(pFile)
---华软网友回复---
大神给出的“经典的串口接收数据的例子”确实很好,开始我就几个疑问,mydata和temp都是什么?前面没有声明啊!
引用


引用 4 楼 rxguoblp 的回复:
经典的串口接收数据的例子如下:
1.在头文件中声明存储数据的数组和记录数据的文件地址
BYTE   rxdata[4096]; //设置BYTE数组 An 8-bit integerthat is not signed.
CFile m_file(_T("data.txt"),CFile::modeCreate|CFile::modeWrite);
2.写MScomm232的接收事件(记得接收事件的ID应该是2吧)
[align=left]void COperation::OnCommMscomm1()//串口接收数据并处理

int nEvent=m_Comm.get_CommEvent();//得到事件
switch(nEvent)
{
case 2://接收数据事件
{
VARIANT variant_inp; 
COleSafeArray safearray_inp; 
long len,k;  
//-------------接收数据并进行处理---------------//
k=m_Comm.get_InBufferCount();//接收缓冲区字符数
if(k>0)
{
variant_inp=m_Comm.get_Input(); //读缓冲区
safearray_inp=variant_inp; //VARIANT型变量转换为ColeSafeArray型变量
len=safearray_inp.GetOneDimSize(); //得到有效数据长度
for(k=0;k<len;k++) 
safearray_inp.GetElement(&k,rxdata+k);//转换为BYTE型数组,存入rxdata
}
//-------------写入文本文件---------------//
for (int j=0;j<len;j++)
{
temp.Format(_T("%0x"),rxdata[j]);
mydata += temp;
mydata += "  ";//隔开两个位置;
}
mydata += "\r\n";
m_file.Write(mydata,mydata.GetLength());//写到文件中
mydata = "";//清空
}

default:
break;
}
}
[/align]

---华软网友回复---
给出没有说明的部分代码,就是耍流氓!
---华软网友回复---
谢谢!学习了
---华软网友回复---
我按照上面的方法在头文件中加入
#include "afx.h"
#include <string>
using namespace std;
也加入了CFile m_file(_T("data.txt"),CFile::modeCreate|CFile::modeWrite);
编译的时候出现了下面的错误
Compiling...
sendcomDlg.cpp
d:\my documents\vc6\sendcom\sendcomdlg.h(26) : error C2059: syntax error : 'string'
这是为什么啊,有谁遇到过吗
---华软网友回复---
引用 11 楼 hannibaychty 的回复:
大神给出的“经典的串口接收数据的例子”确实很好,开始我就几个疑问,mydata和temp都是什么?前面没有声明啊!
引用


引用 4 楼 rxguoblp 的回复:
经典的串口接收数据的例子如下:
1.在头文件中声明存储数据的数组和记录数据的文件地址
BYTE   rxdata[4096]; //设置BYTE数组 An 8-bit integerthat is not signed.
CFile m_file(_T("data.txt"),CFile::modeCreate|CFile::modeWrite);
2.写MScomm232的接收事件(记得接收事件的ID应该是2吧)
[align=left]void COperation::OnCommMscomm1()//串口接收数据并处理

int nEvent=m_Comm.get_CommEvent();//得到事件
switch(nEvent)
{
case 2://接收数据事件
{
VARIANT variant_inp; 
COleSafeArray safearray_inp; 
long len,k;  
//-------------接收数据并进行处理---------------//
k=m_Comm.get_InBufferCount();//接收缓冲区字符数
if(k>0)
{
variant_inp=m_Comm.get_Input(); //读缓冲区
safearray_inp=variant_inp; //VARIANT型变量转换为ColeSafeArray型变量
len=safearray_inp.GetOneDimSize(); //得到有效数据长度
for(k=0;k<len;k++) 
safearray_inp.GetElement(&k,rxdata+k);//转换为BYTE型数组,存入rxdata
}
//-------------写入文本文件---------------//
for (int j=0;j<len;j++)
{
temp.Format(_T("%0x"),rxdata[j]);
mydata += temp;
mydata += "  ";//隔开两个位置;
}
mydata += "\r\n";
m_file.Write(mydata,mydata.GetLength());//写到文件中
mydata = "";//清空
}

default:
break;
}
}
[/align]

上面的代码会不会造成此次的写入数据把原来保存的数据刷新了??

---华软网友回复---
我也实现不了,求帮助呀
---华软网友回复---
引用 3 楼 shen_wei 的回复:
FILE *pFile = fopen("c:\\data.txt","a");
fseek( pFile, 0, SEEK_END); //每次都移动到文件结尾在写入
   fwrite(data,1, strlen(data), pFile);
   fclose(pFile);

请教您一下,如果我想把第一天收到的数据保存成一个文件,第二天收到的保存成第二个文件应该怎么写呢。。然后以此类推呢?谢谢!!
---华软网友回复---
给你干货:
/**
* Logging.
*
* @param lpszFileDir - 日志文件保存目录,如D:, D:\\test, D:\\log等
* @param lpszContent - 要写入当天日志文件的内容.
* @return void.
* @remark 
* 这个函数是根据当前系统日期生成指定格式文件名的txt文件,只要日期不变,文件名
* 就是一样的,所以当天的日志全部写入当天对应文件名的文件,第二天日期一变,文件名就
* 跟着变了,就会创建新文件,文件名对应当天日期.
*/
void Log(LPCTSTR lpszFileDir, LPCTSTR lpszContent)
{
CTime tm = CTime::GetCurrentTime();
CString strFileName;
strFileName.Format(_T("log%04d%02d%02d.txt"), tm.GetYear(), tm.GetMonth(), tm.GetDay());

CString strFilePath;
strFilePath +=  lpszFileDir;
strFilePath += _T("\\");
strFilePath += strFileName;
CStdioFile file;
if(file.Open(strFilePath, CFile::modeCreate|CFile::modeNoTruncate|CFile::modeWrite))
{
file.SeekToEnd();
file.WriteString(lpszContent);
file.WriteString(_T("\n"));
file.Close();
}
}

---华软网友回复---
文件名这种格式,你可以自己修改:

log20150707.txt
log20150708.txt
log20150709.txt
---华软网友回复---
读一次串口,打开txt写入一次,每次写入结尾加换行,这样txt以后导入数据库也方便。
---华软网友回复---
     
华软声明:本内容来自网络,如有侵犯您版权请来信指出,本站立即删除。