1

我对编码很陌生,在 ASM 和 C for PIC 方面有一些经验。我仍在学习使用 C# 进行高级编程。

问题

我有一个 C# 中的串口数据接收和处理程序。为了避免丢失数据并知道数据何时到来,我设置了一个DataReceived事件并循环到处理方法中,直到没有更多字节可供读取。

当我尝试这样做时,当我不断地接收数据时,循环会无休止地继续并阻止我的程序执行其他任务(例如处理检索到的数据)。

我阅读了 C# 中的线程,我创建了一个线程来不断检查SerialPort.Bytes2Read属性,以便它知道何时检索可用数据。

我创建了第二个线程,可以在仍在读取新数据时处理数据。如果已读取字节并且 ReadSerial() 有更多字节要读取并且超时(每次从串行读取新字节时重新启动)它们仍然可以被处理并且通过名为 DataProcessing() 的方法组装帧,该方法从ReadSerial() 填充相同的变量。

这给了我想要的结果,但我注意到使用我的解决方案(ReadSerial()DataProcessing()线程都处于活动状态),CPU 使用率一路飙升至 100%!

您如何在不导致如此高的 CPU 使用率的情况下解决此问题?

public static void ReadSerial() //Method that handles Serial Reception
{
    while (KeepAlive) // Bool variable used to keep alive the thread. Turned to false
    {                 // when the program ends.
        if (Port.BytesToRead != 0)
        {
            for (int i = 0; i < 5000; i++) 
            {

             /* I Don't know any other way to 
                implement a timeout to wait for 
                additional characters so i took what 
                i knew from PIC Serial Data Handling. */

                if (Port.BytesToRead != 0)
                {
                    RxList.Add(Convert.ToByte(Port.ReadByte()));
                    i = 0;

                    if (RxList.Count > 20) // In case the method is stuck still reading
                        BufferReady = true; // signal the Data Processing thread to 
                 }                          // work with that chunk of data.

                 BufferReady = true; // signals the DataProcessing Method to work      
            }                        // with the current data in RxList.
        }         
    }    
}
4

1 回答 1

0

我无法完全理解“DataReceived”和“循环”的含义。我还经常使用串行端口以及其他接口。在我的应用程序中,我附加到 DataReceived 事件并根据要读取的字节数进行读取,但我没有在那里使用循环:

int bytesToRead = this._port.BytesToRead;
var data = new byte[bytesToRead];
this._port.BaseStream.Read(data , 0, bytesToRead);

如果您使用循环来读取字节,我建议您使用以下内容:

  System.Threading.Thread.Sleep(...);

否则,您用来读取字节的线程一直都很忙。这将导致无法处理其他线程或您的 CPU 处于 100% 的事实。

但我认为,如果您使用 DataReceived 事件,则不必使用循环来轮询数据。如果我的理解不正确或您需要更多信息,请询问。

于 2013-07-24T23:34:42.827 回答