串口上的堆栈溢出

时间:2011-12-13 14:02:38

标签: c# .net serial-port

我的伪代码就是这个......

GetData_1()向串口发送请求,收到回复后,GetData_2()发送另一个请求。在接收到第二请求的响应之后,将所有接收的数据一起插入数据库中。然后再次调用GetData_1()以递归方式继续此过程...

但是........ 我得到堆栈溢出错误... 请帮忙......

 GetDat_1()

{

//Send a request To SerialPort

//wait a 500 ms.

// read The response and insert it into an array...

GetData_2();
}

GetData_2()
{
// Send a request to SerialPort

// Wait a 500 ms.

// Read The response and insert it into another array

InsertAllData();

GetData_1();
}

InsertAllData()
{
// insert all data into the database
}

6 个答案:

答案 0 :(得分:2)

GetData_1()调用GetData_2()调用GetData_1()调用GetData_2()......依此类推,直到你遇到堆栈溢出。

您需要重新设计您的方法才能以其他方式工作

在这种情况下使用某种类型的循环会更好。

答案 1 :(得分:2)

这是因为重复的调用永远不会返回,并且调用堆栈会继续增长,导致StackOverFlowException迟早,最有可能更快。

相反,展开迭代的编码方式。

while (!done)
    // GetDat_1 is inlined here
    // Send a request To SerialPort 
    // wait a 500 ms.
    // read The response and insert it into an array...

    // GetData_2 is inlined here
    // Send a request to SerialPort
    // Wait a 500 ms.   
    // Read The response and insert it into another array

    InsertAllData();
}

答案 2 :(得分:1)

GetData_1()GetData_2()调用每一个,所以这是一个死循环。并且由于任何方法调用“记录”线程堆栈中的一些数据(方法参数等),这种不定式调用会导致堆栈溢出,因为堆栈不是无限制的。

答案 3 :(得分:0)

问题与串口无关。这可以通过

轻松复制
Getdata_1()
{
Getdata_2();
}

Getdata_2()
{
GetData_1();
}

,别无其他。

没有简单的解决方案。您需要阅读有关递归的信息并相应地调整算法。

答案 4 :(得分:0)

您可以尝试使用此示例代码,删除GetData1GetData2方法

while (true)
{
   //Send a request To SerialPort  
   //wait a 500 ms.  
   // read The response and insert it into an array... 

   // Send a request to SerialPort  
   // Wait a 500 ms.  
   // Read The response and insert it into another array 

   InsertAllData();

   if (/*set true if i want to end the loop*/)
      break;
}

答案 5 :(得分:0)

我愿意:

while(!done)
{
    //Send request
    GetData_1();
    //Send request
    GetData_2();
    InsertAllData();
}

虽然我会设置一个中断来从串口收集数据。