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

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

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

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

その文字列の内容に応じて、PLCからの信号を聞きたいかもしれません…​

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

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

{空} [PLCとPCが通信する方法がまだわかりません。テキストではなくバイナリであると理解していますが、現時点ではそれだけです。]

  19  10


ベストアンサー

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

例えば、あなたはインターフェースを持っているでしょう

public interface ISerialComms
{
    void SendMessage(string message)
}

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

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

それが役立つことを願っています!

15


私は過去にhttp://com0com.sourceforge.net/[com0com]を使用してある程度成功しました。

12


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

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

安っぽい名前にもかかわらず、実際には非常に便利です。 USBからシリアルへのコンバータを外す場合は、ポートのリッスンを停止する必要があることに注意してください。 そうしないと、クラッシュする可能性があります(まあ…​ 終了時に無期限に待機しますが、これは迷惑です)。 データを盗聴するために、シリアル接続の途中に自分自身を置く必要はありません。 Win32 APIを使用してIOを監視します。

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

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

” ” ‘

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

CommStudio

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

2


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

32ビットバージョンは無料で、かなりまともなようです。 Virtual Serial Ports Emulatorと呼ばれます。

2


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

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

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

1


私は、Microsoft SerialPort Class(Sytem。 IO.Ports)、他の通信ポートツールを使用することはもちろん可能です。

ソフトウェアでは、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) { }
    }
}

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

1


タイトルとURLをコピーしました