我正在开发一个轮询 RS232 到 I2C 转换器的应用程序,我连接了一个 i2c 设备,它必须实时轮询,这意味着不断:D 一旦响应到来,我再次重新发出命令......
我的代码:
lock (_locker)
{
try
{
_serialPort.DiscardInBuffer();
_serialPort.Write(sendArray, 0, sendArray.Length);
_serialPort.ReadFixed(headerArray, headerArray.Length);
returnOperation = (DeviceOperation)((int)headerArray[1] << 8 | (int)headerArray[3]);
DataToReceive = headerArray[5] * 256 + headerArray[6];
if (DataToReceive != 0)
{
_serialPort.ReadFixed(recvArray, DataToReceive);
}
_serialPort.ReadFixed(EOT, 1); //EOT
}
catch (Exception e )
{
Logger.Log(Level.Error, _name, "Fauled to execute command.", e);
return false;
}
}
其中 ReadFixed 是一个扩展:
public static void ReadFixed(this SerialPort port, byte[] buffer, int count)
{
int offset = 0;
while (count != offset)
offset += port.Read(buffer, offset, count - offset);
if (count != offset)
throw new TimeoutException("ReadFixed did not receive specified bytes in time!");
}
这段代码在双核处理器上导致大约 40 - 60 % 的 CPU 使用率。我用了ANTS profiler,它说函数READFIXED很热,里面消耗的cpu真的很高。
知道有什么问题吗?为什么这样的cpu使用率?难道我做错了什么 ?
谢谢您的回复!