我对编码很陌生,在 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.
}
}
}