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;
}
}
[解决办法]
说的不明确啊,老是有什么问题?
[解决办法]
看了半天没明白到底是怎么回事
[解决办法]
看晕了
[解决办法]
没看明白,等高手
[解决办法]
[解决办法]
[解决办法]
友情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’
你有什么问题 如果是开始就有问题 就设置下断点 看看........
