100分 求60行C++ 代码 找BUG,该如何解决

100分 求60行C++ 代码 找BUG在串口接收数据消息函数里,对于发送过来的数据接收处理。老有问题。数据格式:数;

100分 求60行C++ 代码 找BUG
在串口接收数据消息函数里,对于发送过来的数据接收处理。老有问题。

数据格式:数;数;数 回车换行

2.107011e-002; 0.000000e+000; 0.000000e+000
 2.068298e-002; 1.136868e-013; 6.000000e-002
 2.065138e-002; 1.136868e-013; 8.000000e-002
 2.140983e-002; 1.136868e-013; 1.800000e-001
 2.143353e-002;-2.067077e-005; 2.900000e-001
 2.157574e-002; 1.136868e-013; 4.000000e-001
 2.136242e-002; 1.136868e-013; 5.100000e-001
。。。。。。。。。。。。。。
 
  
代码如下:
//串口数据消息处理函数
{
 static char buffer[255];//临时缓冲区
 static int buffer_index = 0;//数据索引,指向需要插入数据的点
 memset(buffer+buffer_index,0,255-buffer_index);
 buffer_index += m_serialcom.Read(buffer+buffer_index, 255-buffer_index);
 if(buffer_index<20) return 0;
  int pos =0;
 char *findlineend = std::find(buffer, buffer+buffer_index, '\r');//查找开始标志
 while(findlineend != buffer+buffer_index)//找到行尾
 {
  STRAIN_FORCE_TIME data;
  char buf[255];
  memset(buf,0,255);
  std::copy(buffer, findlineend, buf); 
  if(findlineend)
  std::copy(findlineend+1, buffer+buffer_index, buffer); 
 
  
  
  char * findfenhao1 = std::find(buffer+pos, findlineend, ';');//查找结束标志
  if(findfenhao1 != findlineend)//找到结束标志
  {
  char* data_buffer = new char[findfenhao1-(buffer+pos)+1];
  std::copy(buffer+pos, findfenhao1, data_buffer);//拷贝数据
  data.StandardForce= atof(data_buffer);
   
   
  CString f1;
  f1.Format(_T("num1=%d:%s"),findfenhao1-(buffer+pos),data_buffer);
  MessageBox(f1);
  delete data_buffer;
  char * findfenhao2 = std::find(findfenhao1+1, findlineend, ';');//查找结束标志
  if(findfenhao2 != findlineend)//找到结束标志
  {

  char* data_buffer = new char[findfenhao2-findfenhao1];
  std::copy(findfenhao1+1, findfenhao2, data_buffer);//拷贝数据 
  data.Strain= atof(data_buffer);
  delete data_buffer;
  data_buffer = new char[findlineend-findfenhao2];
  std::copy(findfenhao2+1, findlineend-1, data_buffer);//拷贝数据 
  data.Time= atof(data_buffer);
  delete data_buffer;
  pos =findlineend-buffer+1;
  AddData(data);
   

  }
  findlineend = std::find(buffer+pos, buffer+buffer_index, '\r');//查找开始标志
  }
 }
 if (pos)
 {
  if(findlineend<buffer+buffer_index)
  std::copy(findlineend+1, buffer+buffer_index, buffer);//拷贝数据 
  buffer_index=255-buffer_index;
 
 }
  
}

[解决办法]
说的不明确啊,老是有什么问题?
[解决办法]
看了半天没明白到底是怎么回事
[解决办法]
看晕了
[解决办法]
没看明白,等高手
[解决办法]

[解决办法]

探讨
就是没从串口获取的数据解析对。
buffer_index += m_serialcom.Read(buffer+buffer_index, 255-buffer_index);

m_serialcom是个串口对象,Read 函数依次是,des目标,读取长度,返回的是实际读取到的长度。

[解决办法]
友情up!~
------解决方案--------------------


看了开头一点代码,感觉有点问题,你这段代码多次调用?第一次调会崩?
如果这段代码调用多次的话,这句就有问题
static int buffer_index = 0;静态变量只初始化一次,第二次进来不走这条语句,该值就不是0了,如果继续累加下去肯定越界
[解决办法]
结贴率 101.87% ,楼主怎么弄的?
[解决办法]
//串口数据消息处理函数
{
 static char buffer[255];//临时缓冲区
 static int buffer_index = 0;//数据索引,指向需要插入数据的点
 memset(buffer+buffer_index,0,255-buffer_index);
 buffer_index += m_serialcom.Read(buffer+buffer_index, 255-buffer_index);
 if(buffer_index<20) return 0;
int pos =0;
 char *findlineend = std::find(buffer, buffer+buffer_index, '\r');//查找开始标志???老兄, 这里是"结束"标志吧?
 while(findlineend != buffer+buffer_index)//找到行尾
 {
STRAIN_FORCE_TIME data;
char buf[255];
memset(buf,0,255);
std::copy(buffer, findlineend, buf);
//以下 2 行有问题, 应当删除, 否则后面引用的buffer就是修改后的buffer了, 导致数据丢失
//将这 2 行移至while循环结尾之前 //if(findlineend)
//std::copy(findlineend+1, buffer+buffer_index, buffer);
 
 
 
char * findfenhao1 = std::find(buffer/*+pos???删除此处指针移动, 否则与copy操作重复*/, findlineend, ';');//查找结束标志
if(findfenhao1 != findlineend)//找到结束标志
{
char* data_buffer = new char[findfenhao1-(buffer+pos)+1];
std::copy(buffer+pos, findfenhao1, data_buffer);//拷贝数据
data.StandardForce= atof(data_buffer);


CString f1;
f1.Format(_T("num1=%d:%s"),findfenhao1-(buffer/*+pos???删除此处指针移动, 否则与copy操作重复*/),data_buffer);
MessageBox(f1);
delete data_buffer;
char * findfenhao2 = std::find(findfenhao1+1, findlineend, ';');//查找结束标志
if(findfenhao2 != findlineend)//找到结束标志
{

char* data_buffer = new char[findfenhao2-findfenhao1];
std::copy(findfenhao1+1, findfenhao2, data_buffer);//拷贝数据
data.Strain= atof(data_buffer);
delete data_buffer;
data_buffer = new char[findlineend-findfenhao2];
std::copy(findfenhao2+1, findlineend/*-1???你减1不打紧, '\r'前的一个数字字符丢掉了*/, data_buffer);//拷贝数据
data.Time= atof(data_buffer);
delete data_buffer;
//pos =findlineend-buffer+1;//此行代码错误, 应当更改为下行代码: pos+=findlineend-buffer+1;//此行正确, 计数器可以累加, 但通过copy操作不断缩小长度的buffer若在来个buffer=buffer+pos, 即再次进行了指针后移, 肯定会越界
AddData(data);


}
//findlineend = std::find(buffer+pos, buffer+buffer_index, '\r');//查找开始标志???此行代码与下面的 2 行代码功能雷同, 须删除 }
if(findlineend)
std::copy(findlineend+1, buffer+buffer_index, buffer);
//在此处添加 2 行代码, 判断buffer是否为空, 若无此判断, 会导致死循环
if(!strlen(buffer))
break; }
 if (pos)
 {
if(findlineend<buffer+buffer_index)
std::copy(findlineend+1, buffer+buffer_index, buffer);//拷贝数据
buffer_index=255-buffer_index;
  
 }
 
}

附带说一句, 如果老兄对指针操作不太熟练的话, 可以使用CString来处理这种数据, 很简单的. 例如以下代码将存入strData的数据, 按照你的格式将每行文字中的三个数字提取到dbla,dblb,dblc 3 个数字中:
int nLeft=0;
int nRight;
CString strData=_T("***************");
while((nRight=strData.Find('\r',nLeft))>-1)
{
CString strtmp=strData.Mid(nLeft,nRight-nLeft);
int nl=strtmp.find(';');
double dbla=_wtof(strtmp.Left(nl));
int nr=strtmp.find(';',++nl);
double dblb=_wtof(strtmp.Mid(nl,nr++-nl));
double dblc=_wtof(strtmp.Right(nRight-nLeft-nr));

nLeft=nRight+1;
}







[解决办法]
太难了 太难了
[解决办法]
友情帮顶了,这个我不懂。
[解决办法]
很高深!!!!
[解决办法]
你这么接收和分析数据 势必会出现问题 太繁琐了


而且 你是以'\r'作为开始符号的 第一行没有上一行 所以没有‘\r’

你有什么问题 如果是开始就有问题 就设置下断点 看看........