Merge branch 'nefarius/bugfix/refactoring'

This commit is contained in:
Benjamin Höglinger-Stelzer 2022-10-03 19:20:37 +02:00
commit 9b0bec2633
10 changed files with 808 additions and 1047 deletions

416
.gitignore vendored
View File

@ -1,400 +1,36 @@
## Ignore Visual Studio temporary files, build results, and
## files generated by popular Visual Studio add-ons.
##
## Get latest from https://github.com/github/gitignore/blob/main/VisualStudio.gitignore
# User-specific files
*.rsuser
*.suo
#ignore thumbnails created by windows
Thumbs.db
#Ignore files build by Visual Studio
*.obj
*.exe
*.pdb
*.user
*.userosscache
*.sln.docstates
# User-specific files (MonoDevelop/Xamarin Studio)
*.userprefs
# Mono auto generated files
mono_crash.*
# Build results
[Dd]ebug/
[Dd]ebugPublic/
[Rr]elease/
[Rr]eleases/
x64/
x86/
[Ww][Ii][Nn]32/
[Aa][Rr][Mm]/
[Aa][Rr][Mm]64/
bld/
[Bb]in/
[Oo]bj/
[Ll]og/
[Ll]ogs/
# Visual Studio 2015/2017 cache/options directory
.vs/
# Uncomment if you have tasks that create the project's static files in wwwroot
#wwwroot/
# Visual Studio 2017 auto generated files
Generated\ Files/
# MSTest test Results
[Tt]est[Rr]esult*/
[Bb]uild[Ll]og.*
# NUnit
*.VisualState.xml
TestResult.xml
nunit-*.xml
# Build Results of an ATL Project
[Dd]ebugPS/
[Rr]eleasePS/
dlldata.c
# Benchmark Results
BenchmarkDotNet.Artifacts/
# .NET Core
project.lock.json
project.fragment.lock.json
artifacts/
# ASP.NET Scaffolding
ScaffoldingReadMe.txt
# StyleCop
StyleCopReport.xml
# Files built by Visual Studio
*.aps
*.pch
*.vspscc
*_i.c
*_p.c
*_h.h
*.ilk
*.meta
*.obj
*.iobj
*.pch
*.pdb
*.ipdb
*.pgc
*.pgd
*.rsp
*.sbr
*.ncb
*.suo
*.tlb
*.tli
*.tlh
*.tmp
*.tmp_proj
*_wpftmp.csproj
*.bak
*.cache
*.ilk
*.log
*.tlog
*.vspscc
*.vssscc
.builds
*.pidb
*.svclog
*.scc
# Chutzpah Test files
_Chutzpah*
# Visual C++ cache files
ipch/
*.aps
*.ncb
*.opendb
*.opensdf
*.sdf
*.cachefile
*.VC.db
*.VC.VC.opendb
# Visual Studio profiler
*.psess
*.vsp
*.vspx
*.sap
# Visual Studio Trace Files
*.e2e
# TFS 2012 Local Workspace
$tf/
# Guidance Automation Toolkit
*.gpState
# ReSharper is a .NET coding add-in
[Bb]in
[Dd]ebug*/
*.lib
*.sbr
obj/
[Rr]elease*/
_ReSharper*/
*.[Rr]e[Ss]harper
*.DotSettings.user
# TeamCity is a build add-in
_TeamCity*
# DotCover is a Code Coverage Tool
*.dotCover
# AxoCover is a Code Coverage Tool
.axoCover/*
!.axoCover/settings.json
# Coverlet is a free, cross platform Code Coverage Tool
coverage*.json
coverage*.xml
coverage*.info
# Visual Studio code coverage results
*.coverage
*.coveragexml
# NCrunch
_NCrunch_*
.*crunch*.local.xml
nCrunchTemp_*
# MightyMoose
*.mm.*
AutoTest.Net/
# Web workbench (sass)
.sass-cache/
# Installshield output folder
[Ee]xpress/
# DocProject is a documentation generator add-in
DocProject/buildhelp/
DocProject/Help/*.HxT
DocProject/Help/*.HxC
DocProject/Help/*.hhc
DocProject/Help/*.hhk
DocProject/Help/*.hhp
DocProject/Help/Html2
DocProject/Help/html
# Click-Once directory
publish/
# Publish Web Output
*.[Pp]ublish.xml
*.azurePubxml
# Note: Comment the next line if you want to checkin your web deploy settings,
# but database connection strings (with potential passwords) will be unencrypted
*.pubxml
*.publishproj
# Microsoft Azure Web App publish settings. Comment the next line if you want to
# checkin your Azure Web App publish settings, but sensitive information contained
# in these scripts will be unencrypted
PublishScripts/
# NuGet Packages
[Tt]est[Rr]esult*
*.testsettings
*.nupkg
# NuGet Symbol Packages
*.snupkg
# The packages folder can be ignored because of Package Restore
**/[Pp]ackages/*
# except build/, which is used as an MSBuild target.
!**/[Pp]ackages/build/
# Uncomment if necessary however generally it will be regenerated when needed
#!**/[Pp]ackages/repositories.config
# NuGet v3's project.json files produces more ignorable files
*.nuget.props
*.nuget.targets
# Microsoft Azure Build Output
csx/
*.build.csdef
# Microsoft Azure Emulator
ecf/
rcf/
# Windows Store app package directories and files
AppPackages/
BundleArtifacts/
Package.StoreAssociation.xml
_pkginfo.txt
*.appx
*.appxbundle
*.appxupload
# Visual Studio cache files
# files ending in .cache can be ignored
*.[Cc]ache
# but keep track of directories ending in .cache
!?*.[Cc]ache/
# Others
ClientBin/
~$*
*~
*.dbmdl
*.dbproj.schemaview
*.jfm
*.pfx
*.publishsettings
orleans.codegen.cs
# Including strong name files can present a security risk
# (https://github.com/github/gitignore/pull/2483#issue-259490424)
#*.snk
# Since there are multiple workflows, uncomment next line to ignore bower_components
# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622)
#bower_components/
# RIA/Silverlight projects
Generated_Code/
# Backup & report files from converting an old project file
# to a newer Visual Studio version. Backup files are not needed,
# because we have git ;-)
_UpgradeReport_Files/
Backup*/
UpgradeLog*.XML
UpgradeLog*.htm
ServiceFabricBackup/
*.rptproj.bak
# SQL Server files
*.mdf
*.ldf
*.ndf
# Business Intelligence projects
*.rdl.data
*.bim.layout
*.bim_*.settings
*.rptproj.rsuser
*- [Bb]ackup.rdl
*- [Bb]ackup ([0-9]).rdl
*- [Bb]ackup ([0-9][0-9]).rdl
# Microsoft Fakes
FakesAssemblies/
# GhostDoc plugin setting file
*.GhostDoc.xml
# Node.js Tools for Visual Studio
.ntvs_analysis.dat
node_modules/
# Visual Studio 6 build log
*.plg
# Visual Studio 6 workspace options file
*.opt
# Visual Studio 6 auto-generated workspace file (contains which files were open etc.)
*.vbw
# Visual Studio 6 auto-generated project file (contains which files were open etc.)
*.vbp
# Visual Studio 6 workspace and project file (working project files containing files to include in project)
*.dsw
*.dsp
# Visual Studio 6 technical files
*.ncb
*.aps
# Visual Studio LightSwitch build output
**/*.HTMLClient/GeneratedArtifacts
**/*.DesktopClient/GeneratedArtifacts
**/*.DesktopClient/ModelManifest.xml
**/*.Server/GeneratedArtifacts
**/*.Server/ModelManifest.xml
_Pvt_Extensions
# Paket dependency manager
.paket/paket.exe
paket-files/
# FAKE - F# Make
.fake/
# CodeRush personal settings
.cr/personal
# Python Tools for Visual Studio (PTVS)
__pycache__/
*.pyc
# Cake - Uncomment if you are using it
# tools/**
# !tools/packages.config
# Tabs Studio
*.tss
# Telerik's JustMock configuration file
*.jmconfig
# BizTalk build output
*.btp.cs
*.btm.cs
*.odx.cs
*.xsd.cs
# OpenCover UI analysis results
OpenCover/
# Azure Stream Analytics local run output
ASALocalRun/
# MSBuild Binary and Structured Log
*.binlog
# NVidia Nsight GPU debugger configuration file
*.nvuser
# MFractors (Xamarin productivity tool) working folder
.mfractor/
# Local History for Visual Studio
.localhistory/
# Visual Studio History (VSHistory) files
.vshistory/
# BeatPulse healthcheck temp database
healthchecksdb
# Backup folder for Package Reference Convert tool in Visual Studio 2017
MigrationBackup/
# Ionide (cross platform F# VS Code tools) working folder
.ionide/
# Fody - auto-generated XML schema
FodyWeavers.xsd
# VS Code files for those working on multiple tools
.vscode/*
!.vscode/settings.json
!.vscode/tasks.json
!.vscode/launch.json
!.vscode/extensions.json
*.code-workspace
# Local History for Visual Studio Code
.history/
# Windows Installer files from build outputs
*.cab
*.msi
*.msix
*.msm
*.msp
# JetBrains Rider
*.sln.iml
/.vs
/packages
/.tmp
*.DotSettings
/misc

View File

@ -1,4 +1,4 @@
CreateFile
CreateFile
GetHandleInformation
SetCommState
SetCommTimeouts

View File

@ -1,149 +1,151 @@
using System.Text;
using Nefarius.Peripherals.SerialPort.Win32PInvoke;
namespace Nefarius.Peripherals.SerialPort;
/// <summary>
/// Represents the current condition of the port queues.
/// </summary>
public readonly struct QueueStatus
namespace Nefarius.Peripherals.SerialPort
{
private const uint fCtsHold = 0x1;
private const uint fDsrHold = 0x2;
private const uint fRlsdHold = 0x4;
private const uint fXoffHold = 0x8;
private const uint fXoffSent = 0x10;
internal const uint fEof = 0x20;
private const uint fTxim = 0x40;
private readonly uint _status;
private readonly uint _inQueue;
private readonly uint _outQueue;
private readonly uint _inQueueSize;
private readonly uint _outQueueSize;
internal QueueStatus(uint stat, uint inQ, uint outQ, uint inQs, uint outQs)
/// <summary>
/// Represents the current condition of the port queues.
/// </summary>
public struct QueueStatus
{
_status = stat;
_inQueue = inQ;
_outQueue = outQ;
_inQueueSize = inQs;
_outQueueSize = outQs;
}
private readonly uint _status;
private readonly uint _inQueue;
private readonly uint _outQueue;
private readonly uint _inQueueSize;
private readonly uint _outQueueSize;
/// <summary>
/// Output is blocked by CTS handshaking.
/// </summary>
public bool CtsHold => (_status & fCtsHold) != 0;
/// <summary>
/// Output is blocked by DRS handshaking.
/// </summary>
public bool DsrHold => (_status & fDsrHold) != 0;
/// <summary>
/// Output is blocked by RLSD handshaking.
/// </summary>
public bool RlsdHold => (_status & fRlsdHold) != 0;
/// <summary>
/// Output is blocked because software handshaking is enabled and XOFF was received.
/// </summary>
public bool XoffHold => (_status & fXoffHold) != 0;
/// <summary>
/// Output was blocked because XOFF was sent and this station is not yet ready to receive.
/// </summary>
public bool XoffSent => (_status & fXoffSent) != 0;
/// <summary>
/// There is a character waiting for transmission in the immediate buffer.
/// </summary>
public bool ImmediateWaiting => (_status & fTxim) != 0;
/// <summary>
/// Number of bytes waiting in the input queue.
/// </summary>
public long InQueue => _inQueue;
/// <summary>
/// Number of bytes waiting for transmission.
/// </summary>
public long OutQueue => _outQueue;
/// <summary>
/// Total size of input queue (0 means information unavailable)
/// </summary>
public long InQueueSize => _inQueueSize;
/// <summary>
/// Total size of output queue (0 means information unavailable)
/// </summary>
public long OutQueueSize => _outQueueSize;
public override string ToString()
{
var m = new StringBuilder("The reception queue is ", 60);
if (_inQueueSize == 0)
m.Append("of unknown size and ");
else
m.Append(_inQueueSize + " bytes long and ");
if (_inQueue == 0)
internal QueueStatus(uint stat, uint inQ, uint outQ, uint inQs, uint outQs)
{
m.Append("is empty.");
}
else if (_inQueue == 1)
{
m.Append("contains 1 byte.");
}
else
{
m.Append("contains ");
m.Append(_inQueue.ToString());
m.Append(" bytes.");
_status = stat;
_inQueue = inQ;
_outQueue = outQ;
_inQueueSize = inQs;
_outQueueSize = outQs;
}
m.Append(" The transmission queue is ");
if (_outQueueSize == 0)
m.Append("of unknown size and ");
else
m.Append(_outQueueSize + " bytes long and ");
if (_outQueue == 0)
{
m.Append("is empty");
}
else if (_outQueue == 1)
{
m.Append("contains 1 byte. It is ");
}
else
{
m.Append("contains ");
m.Append(_outQueue.ToString());
m.Append(" bytes. It is ");
}
internal const uint fCtsHold = 0x1;
internal const uint fDsrHold = 0x2;
internal const uint fRlsdHold = 0x4;
internal const uint fXoffHold = 0x8;
internal const uint fXoffSent = 0x10;
internal const uint fEof = 0x20;
internal const uint fTxim = 0x40;
if (_outQueue > 0)
/// <summary>
/// Output is blocked by CTS handshaking.
/// </summary>
public bool CtsHold => (_status & fCtsHold) != 0;
/// <summary>
/// Output is blocked by DRS handshaking.
/// </summary>
public bool DsrHold => (_status & fDsrHold) != 0;
/// <summary>
/// Output is blocked by RLSD handshaking.
/// </summary>
public bool RlsdHold => (_status & fRlsdHold) != 0;
/// <summary>
/// Output is blocked because software handshaking is enabled and XOFF was received.
/// </summary>
public bool XoffHold => (_status & fXoffHold) != 0;
/// <summary>
/// Output was blocked because XOFF was sent and this station is not yet ready to receive.
/// </summary>
public bool XoffSent => (_status & fXoffSent) != 0;
/// <summary>
/// There is a character waiting for transmission in the immediate buffer.
/// </summary>
public bool ImmediateWaiting => (_status & fTxim) != 0;
/// <summary>
/// Number of bytes waiting in the input queue.
/// </summary>
public long InQueue => _inQueue;
/// <summary>
/// Number of bytes waiting for transmission.
/// </summary>
public long OutQueue => _outQueue;
/// <summary>
/// Total size of input queue (0 means information unavailable)
/// </summary>
public long InQueueSize => _inQueueSize;
/// <summary>
/// Total size of output queue (0 means information unavailable)
/// </summary>
public long OutQueueSize => _outQueueSize;
public override string ToString()
{
if (CtsHold || DsrHold || RlsdHold || XoffHold || XoffSent)
var m = new StringBuilder("The reception queue is ", 60);
if (_inQueueSize == 0)
m.Append("of unknown size and ");
else
m.Append(_inQueueSize + " bytes long and ");
if (_inQueue == 0)
{
m.Append("holding on");
if (CtsHold) m.Append(" CTS");
if (DsrHold) m.Append(" DSR");
if (RlsdHold) m.Append(" RLSD");
if (XoffHold) m.Append(" Rx XOff");
if (XoffSent) m.Append(" Tx XOff");
m.Append("is empty.");
}
else if (_inQueue == 1)
{
m.Append("contains 1 byte.");
}
else
{
m.Append("pumping data");
m.Append("contains ");
m.Append(_inQueue.ToString());
m.Append(" bytes.");
}
}
m.Append(". The immediate buffer is ");
if (ImmediateWaiting)
m.Append("full.");
else
m.Append("empty.");
return m.ToString();
m.Append(" The transmission queue is ");
if (_outQueueSize == 0)
m.Append("of unknown size and ");
else
m.Append(_outQueueSize + " bytes long and ");
if (_outQueue == 0)
{
m.Append("is empty");
}
else if (_outQueue == 1)
{
m.Append("contains 1 byte. It is ");
}
else
{
m.Append("contains ");
m.Append(_outQueue.ToString());
m.Append(" bytes. It is ");
}
if (_outQueue > 0)
{
if (CtsHold || DsrHold || RlsdHold || XoffHold || XoffSent)
{
m.Append("holding on");
if (CtsHold) m.Append(" CTS");
if (DsrHold) m.Append(" DSR");
if (RlsdHold) m.Append(" RLSD");
if (XoffHold) m.Append(" Rx XOff");
if (XoffSent) m.Append(" Tx XOff");
}
else
{
m.Append("pumping data");
}
}
m.Append(". The immediate buffer is ");
if (ImmediateWaiting)
m.Append("full.");
else
m.Append("empty.");
return m.ToString();
}
}
}

File diff suppressed because it is too large Load Diff

View File

@ -4,7 +4,7 @@ namespace Nefarius.Peripherals.SerialPort;
internal static class DCBExtensions
{
public static void Init(this DCB dcb, bool parity, bool outCts, bool outDsr, int dtr, bool inDsr, bool txc,
public static void Init(this ref DCB dcb, bool parity, bool outCts, bool outDsr, int dtr, bool inDsr, bool txc,
bool xOut,
bool xIn, int rts)
{

View File

@ -0,0 +1,91 @@
using System;
using System.Runtime.InteropServices;
namespace Nefarius.Peripherals.SerialPort.Win32PInvoke
{
internal class Win32Com
{
[DllImport("kernel32.dll")]
internal static extern Boolean GetHandleInformation(IntPtr hObject, out UInt32 lpdwFlags);
[DllImport("kernel32.dll")]
internal static extern Boolean SetCommMask(IntPtr hFile, UInt32 dwEvtMask);
// Constants for dwEvtMask:
internal const UInt32 EV_RXCHAR = 0x0001;
internal const UInt32 EV_RXFLAG = 0x0002;
internal const UInt32 EV_TXEMPTY = 0x0004;
internal const UInt32 EV_CTS = 0x0008;
internal const UInt32 EV_DSR = 0x0010;
internal const UInt32 EV_RLSD = 0x0020;
internal const UInt32 EV_BREAK = 0x0040;
internal const UInt32 EV_ERR = 0x0080;
internal const UInt32 EV_RING = 0x0100;
internal const UInt32 EV_PERR = 0x0200;
internal const UInt32 EV_RX80FULL = 0x0400;
internal const UInt32 EV_EVENT1 = 0x0800;
internal const UInt32 EV_EVENT2 = 0x1000;
[DllImport("kernel32.dll", SetLastError = true)]
internal static extern Boolean WaitCommEvent(IntPtr hFile, IntPtr lpEvtMask, IntPtr lpOverlapped);
[DllImport("kernel32.dll")]
internal static extern Boolean CancelIo(IntPtr hFile);
[DllImport("kernel32.dll", SetLastError = true)]
internal static extern Boolean ReadFile(IntPtr hFile, [Out] Byte[] lpBuffer, UInt32 nNumberOfBytesToRead,
out UInt32 nNumberOfBytesRead, IntPtr lpOverlapped);
[DllImport("kernel32.dll")]
internal static extern Boolean TransmitCommChar(IntPtr hFile, Byte cChar);
/// <summary>
/// Control port functions.
/// </summary>
[DllImport("kernel32.dll")]
internal static extern Boolean EscapeCommFunction(IntPtr hFile, UInt32 dwFunc);
// Constants for dwFunc:
internal const UInt32 SETXOFF = 1;
internal const UInt32 SETXON = 2;
internal const UInt32 SETRTS = 3;
internal const UInt32 CLRRTS = 4;
internal const UInt32 SETDTR = 5;
internal const UInt32 CLRDTR = 6;
internal const UInt32 RESETDEV = 7;
internal const UInt32 SETBREAK = 8;
internal const UInt32 CLRBREAK = 9;
[DllImport("kernel32.dll")]
internal static extern Boolean GetCommModemStatus(IntPtr hFile, out UInt32 lpModemStat);
// Constants for lpModemStat:
internal const UInt32 MS_CTS_ON = 0x0010;
internal const UInt32 MS_DSR_ON = 0x0020;
internal const UInt32 MS_RING_ON = 0x0040;
internal const UInt32 MS_RLSD_ON = 0x0080;
/// <summary>
/// Status Functions.
/// </summary>
[DllImport("kernel32.dll", SetLastError = true)]
internal static extern Boolean GetOverlappedResult(IntPtr hFile, IntPtr lpOverlapped,
out UInt32 nNumberOfBytesTransferred, Boolean bWait);
//Constants for lpErrors:
internal const UInt32 CE_RXOVER = 0x0001;
internal const UInt32 CE_OVERRUN = 0x0002;
internal const UInt32 CE_RXPARITY = 0x0004;
internal const UInt32 CE_FRAME = 0x0008;
internal const UInt32 CE_BREAK = 0x0010;
internal const UInt32 CE_TXFULL = 0x0100;
internal const UInt32 CE_PTO = 0x0200;
internal const UInt32 CE_IOE = 0x0400;
internal const UInt32 CE_DNS = 0x0800;
internal const UInt32 CE_OOP = 0x1000;
internal const UInt32 CE_MODE = 0x8000;
}
}

View File

@ -8,8 +8,11 @@
<Product>PInvokeSerialPort.Sample</Product>
<Copyright>Copyright © 2012</Copyright>
<OutputPath>bin\$(Configuration)\</OutputPath>
<LangVersion>latest</LangVersion>
</PropertyGroup>
<ItemGroup>
<ProjectReference Include="..\Nefarius.Peripherals.SerialPort\Nefarius.Peripherals.SerialPort.csproj" />
</ItemGroup>
</Project>

View File

@ -7,9 +7,12 @@ internal class Program
{
private static void Main(string[] args)
{
var serialPort = new SerialPort("COM7") { UseRts = HsOutput.Online };
var serialPort = new SerialPort("com7") { UseRts = HsOutput.Online };
serialPort.DataReceived += x => Console.Write((char)x);
serialPort.DataReceived += x =>
{
Console.Write($"{x:X2} ");
};
serialPort.Open();

View File

@ -0,0 +1,11 @@
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
// Setting ComVisible to false makes the types in this assembly not visible
// to COM components. If you need to access a type in this assembly from
// COM, set the ComVisible attribute to true on that type.
[assembly: ComVisible(false)]
// The following GUID is for the ID of the typelib if this project is exposed to COM
[assembly: Guid("9628528d-5e4d-4071-aad1-b1f85f3d45d5")]

View File

@ -1,21 +1,21 @@
using System;
using System.Text;
using System.Threading;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using System.Threading;
using Nefarius.Peripherals.SerialPort;
namespace PInvokeSerialPort.Test
{
/// <summary>
/// Test class.
/// Attention: Run it just in test debug.
/// Test class.
/// Attention: Run it just in test debug.
/// </summary>
[TestClass]
public class PInvokeSerialPortTest
{
private dynamic _reciever;
private dynamic _sender;
private StringBuilder _stringBuilder;
dynamic _sender;
dynamic _reciever;
StringBuilder _stringBuilder;
public void OpenWriteDoWaitClose(Action action)
{
@ -25,7 +25,7 @@ namespace PInvokeSerialPort.Test
_reciever.Open();
action();
_sender.Write(testSting);
Thread.Sleep(100);
Assert.AreEqual(testSting, _stringBuilder.ToString());
@ -40,22 +40,22 @@ namespace PInvokeSerialPort.Test
_sender = new SerialPort("com1");
_reciever = new SerialPort("com2");
OpenWriteDoWaitClose(() =>
{
((SerialPort)_reciever).DataReceived += x => _stringBuilder.Append((char)x);
});
{
((SerialPort)_reciever).DataReceived += x => _stringBuilder.Append((char)x);
});
}
[TestMethod]
public void OverallTest2()
{
_sender = new System.IO.Ports.SerialPort("com1");
_reciever = new SerialPort("com2");
OpenWriteDoWaitClose(() =>
{
((SerialPort)(object)_reciever).DataReceived += x => _stringBuilder.Append((char)x);
});
{
((SerialPort)(object)_reciever).DataReceived += x => _stringBuilder.Append((char)x);
});
}
[TestMethod]
@ -65,10 +65,9 @@ namespace PInvokeSerialPort.Test
_reciever = new System.IO.Ports.SerialPort("com2");
OpenWriteDoWaitClose(() =>
{
((System.IO.Ports.SerialPort)_reciever).DataReceived +=
(x, y) => _stringBuilder.Append(_reciever.ReadExisting());
});
{
((System.IO.Ports.SerialPort)_reciever).DataReceived += (x, y) => _stringBuilder.Append(_reciever.ReadExisting());
});
}
[TestMethod]
@ -76,12 +75,11 @@ namespace PInvokeSerialPort.Test
{
_sender = new System.IO.Ports.SerialPort("com1");
_reciever = new System.IO.Ports.SerialPort("com2");
OpenWriteDoWaitClose(() =>
{
((System.IO.Ports.SerialPort)_reciever).DataReceived +=
(x, y) => _stringBuilder.Append(_reciever.ReadExisting());
});
{
((System.IO.Ports.SerialPort)_reciever).DataReceived += (x, y) => _stringBuilder.Append(_reciever.ReadExisting());
});
}
}
}
}