SerialPort već nasleđuje Component, pa je dovoljno nasleđivanje. Paket: System.IO.Ports (NuGet).
SerialPortComponent.cs
using System.ComponentModel;
using System.IO.Ports;
namespace WinFormsApp_test
{
/// <summary>
/// SerialPort kao non-visual komponenta u Toolbox-u (u .NET-u nije tamo podrazumevano).
/// </summary>
[ToolboxItem(true)]
[DesignerCategory("Code")]
public class SerialPortComponent : SerialPort
{
public SerialPortComponent() { }
public SerialPortComponent(IContainer container)
{
container.Add(this);
}
}
}SerialPortComponent na formu.PortName, BaudRate, DataBits, Parity, StopBits, Handshake, ReadTimeout...DataReceived, ErrorReceived, PinChanged.DataReceived je na pozadinskoj nitiOvo je originalni SerialPort, pa event stiže sa pozadinske niti. Direktno menjanje kontrola baca cross-thread operation:
private void serialPortComponent1_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
string data = serialPortComponent1.ReadExisting();
BeginInvoke(() => textBox1.AppendText(data));
}Ako podaci stižu brzo (mnogo poruka u sekundi), umesto BeginInvoke po poruci koristi isti obrazac kao za log: red + tajmer (stranica Dugačak posao).