Когда я пытаюсь читать с последовательного порта (uart) в Linux на RaspberryPi, я всегда получаю нагрузку на процессор 5-10% в цикле.Поскольку SerialPorts должен блокировать, это не должно использовать слишком большую загрузку процессора, или я ошибаюсь?
Я пробовал два кода:
Простой код
var port = new SerialPort("/dev/ttyUSB0", 57600);
port.Open();
while (true)
{
if (port.BytesToRead > 0)
{
while (port.BytesToRead > 0)
Console.Write($"{port.ReadByte().ToString("X2")} ");
Console.WriteLine("");
}
Thread.Sleep(100);
}
AdvancedКод
static int blockLimit = 100;
static void Main(string[] args)
{
var port = new SerialPort("/dev/ttyUSB0", 57600);
port.Open();
byte[] buffer = new byte[blockLimit];
Action kickoffRead = null;
kickoffRead = delegate
{
port.BaseStream.BeginRead(buffer, 0, buffer.Length, delegate (IAsyncResult ar)
{
try
{
int actualLength = port.BaseStream.EndRead(ar);
byte[] received = new byte[actualLength];
Buffer.BlockCopy(buffer, 0, received, 0, actualLength);
raiseAppSerialDataEvent(received);
}
catch (IOException exc)
{
handleAppSerialError(exc);
}
kickoffRead();
}, null);
};
kickoffRead();
while (true)
Thread.Sleep(1000);
}
private static void handleAppSerialError(IOException exc)
{
throw new NotImplementedException();
}
private static void raiseAppSerialDataEvent(byte[] received)
{
Console.WriteLine(BitConverter.ToString(received));
}
Оба с одинаковым результатом: два процесса, которые используют вместе 5-10% загрузки процессора
Использование .NET Core 3.0 Preview 2
и System.IO.Ports 4.6.0-preview-19073.11
на RaspberryPi 3b+
работает с HypriotOS 1.10.0