web-dev-qa-db-ja.com

テストのためにSerialPortの相互作用をシミュレートするにはどうすればよいですか?

シリアルポートを介してPLCおよびテストユニットと通信する小さなアプリ(C#)の開発を開始しようとしています。これは、この分野への私の最初のベンチャーです。

基本的に、PLCに操作を開始する信号を送信し、テストユニット(PLCと独立して通信する)からの操作の結果がASCII文字列。

その文字列の内容によっては、PLCからの信号を聞きたい場合があります...

それは私にとってまったく新しいので、現時点では、System.IO.Ports.SerialPortを調査しているだけです。余談:シリアルポートとの相互作用を単純化するよりもサードパーティの製品はありますか、または組み込みクラスはあなたが得るのと同じくらい良いですか?より良い機能ではなく、使いやすさを考えています。

ただし、ハードウェアが開発とテストに利用できるようになるまでには数週間かかるので、疑問に思っていましたアプリの開発を開始できるようにシリアルポートとの間の通信をシミュレートするにはどうすればよいですか?

[PLCとPCがどのように通信するのかはまだわかりません。テキストではなくバイナリになることは理解していますが、現時点ではそれだけです。]

19
CJM

インターフェースの背後にあるシリアルポート通信を抽象化して、インターフェースに対してアプリをコーディングし、「偽の」実装でテストできるようにします。本物のハードウェアを入手したら、インターフェースの「本物の」実装をコード化して、偽の実装を交換することができます。

たとえば、インターフェースがあります

public interface ISerialComms
{
    void SendMessage(string message)
}

偽の実装を使用して、そのインターフェースに対してアプリをコーディングします。

public class FakeSerialComms : ISerialComms
{
    public void SendMessage(string message)
    {
        //some implementation
    }
}

お役に立てば幸いです。

15
DavidGouge

com0com を使用して、過去にある程度の成功を収めました。

12
fryguybob

他の誰かがまだまともなシリアルデバッグツールを探しているなら、Windowsのシリアルポートをエミュレートする別のリソースがあります。

32ビットバージョンは無料で、かなりまともなようです。それは 仮想シリアルポートエミュレーター と呼ばれます。

2
jlafay

シリアルポートの作業中に非常に貴重だと思ったソフトウェアが2つあります。

無料のシリアルポートモニター

http://www.serial-port-monitor.com

安っぽい名前にもかかわらず、それは実際には非常に便利です。 USB-シリアルコンバーターのプラグを抜く場合は、ポートのリッスンを停止する必要があることに注意してください。そうしないと、クラッシュする可能性があります(まあ...終了時に無期限に待つのは面倒です)。データをスニッフィングするために、シリアル接続の途中に置く必要はありません。 Win32APIを使用してIO)を監視します。

フランソンシリアルポートツール

http://franson.com/serialtools/

または..本当にループバックソフトウェア。そこにはたくさんあります。これにより、ソフトウェア内でデータを送受信できます。 GPS作業を行うことになった場合、FransonにはNice GPSシミュレーターもあるので、コードをデバッグするためにずっと外に座っている必要はありません。


最後に、組み込みのシリアルクラスとその恐ろしい欠点を十分に理解している場合は、交換が必要であり、Win32APIに直接アクセスするには永遠に時間がかかります。

CommStudio

CommStudio は絶対に堅実であることがわかりました。率直に言って、他のオプションの調査と購入に5か月を費やした後、リムーバブルUSBアダプターで完全に機能するのはこのオプションだけです。他のすべてのソリューションには、デバイスを接続し直すと問題が発生します。無料の「Express」バージョンは、次の場所からダウンロードできます。 http://www.componentsource.com/products/commstudio/downloads.html?rv= 42917

2
Brad

上記のDavidの回答が好きですが、統合テストを実行して実際にシリアルポート通信をテストする場合は、過去にViNソフト仮想シリアルケーブルと呼ばれるアプリケーションを使用して、仮想ケーブルで接続された2つのシリアルポートをマシン上に基本的に作成します。 。

また、開発マシンにシリアルポートがある場合は、それを使用して、シリアルポートを持つ別のマシンに接続し、基本的にPLCの通信をシミュレートするアプリケーションを作成できます。

適切なテストを確実にするために、Davidの方法とこの方法の両方を組み合わせて使用​​したいと思います。

1
Cole W

Microsoft SerialPort Class(Sytem.IO.Ports)を使用した仮想シリアルポートドライバー9.0標準を使用して、このトピックについて 記事 を作成しました。もちろん、他の通信ポートツールを使用することもできます。

ソフトウェアで、2つの仮想ポートCOM1とCOM2を作成します。

COM1を使用してデータ送信者としてエミュレートします。

COM2を使用して、COM1から送信されたものを受信します。

これは、組み込みまたはIoTソリューションを開発している場合に役立ちます。

エミュレーター(この例ではランダム加速度計として)

private static bool _continue;
private static SerialPort _serialPort;

public static void Main()
{
    var stringComparer = StringComparer.OrdinalIgnoreCase;
    var readThread = new Thread(Read);

    _serialPort = new SerialPort
    {
        PortName = "COM1",
        ReadTimeout = 500,
        WriteTimeout = 500
    };

    _serialPort.Open();
    _continue = true;
    readThread.Start();

    while (_continue)
    {
        var x = ValueGenerator();
        var y = ValueGenerator();
        var z = ValueGenerator();
        var message = $"x:{x};y:{y};z:{z}";

        if (stringComparer.Equals("quit", message))
        {
            _continue = false;
        }
        else
        {
            _serialPort.WriteLine(message);
            Thread.Sleep(200);
        }
    }

    readThread.Join();
    _serialPort.Close();
}

public static double ValueGenerator()
{
    const int range = 1;
    var random = new Random();
    return random.NextDouble() * range;
}

public static void Read()
{
    while (_continue)
    {
        try
        {
            var message = _serialPort.ReadLine();
            Console.WriteLine(message);
        }
        catch (TimeoutException) { }
    }
}

そして私のデータ受信機はほとんど似ています

private static bool _continue;
private static SerialPort _serialPort;

public static void Main()
{
    var stringComparer = StringComparer.OrdinalIgnoreCase;
    var readThread = new Thread(Read);

    _serialPort = new SerialPort
    {
        PortName = "COM2",
        ReadTimeout = 500,
        WriteTimeout = 500
    };

    _serialPort.Open();
    _continue = true;
    readThread.Start();

    while (_continue)
    {
        var message = Console.ReadLine();

        if (stringComparer.Equals("quit", message))
        {
            _continue = false;
        }
        else
        {
            _serialPort.WriteLine(message);
        }
    }

    readThread.Join();
    _serialPort.Close();
}

public static void Read()
{
    while (_continue)
    {
        try
        {
            var message = _serialPort.ReadLine();
            Console.WriteLine(message);
        }
        catch (TimeoutException) { }
    }
}

免責事項:このガイドラインのリンクは、私の個人的なWebサイトを参照しています。