0

私は物理クラスのプロジェクトに取り組んでおり、アプリをまとめて次のことを実行したいと考えています。テスト ユニットには、1 Hz でデータを出力するシリアル ポートがあります。シリアル ポート データを読み取ってファイルに保存するアプリが必要です。これをコンソール アプリで作成しましたが、正常に動作します。今、私はGUIが欲しいです。GUI のメイン画面にいくつかのチェック ボックスが必要です。ユーザーが受信データ ストリームにタイムスタンプを追加できるもの、データをテキスト ファイルに出力するもの、グラファイト グラフ サーバーにデータを送信するものなどがあります。

だから、私はここでいくつかの指針を探しています。今、私は接続ボタンを持っています。押すと、シリアル ポートが開き、serial.readline() が実行されますが、リンクを介して現在データがプッシュされていない場合、アプリはロックされます。したがって、スレッドを使用する必要があると想定しています。この音は正しいですか?

最後に、チェック ボックスをどのように処理すればよいでしょうか。ボタンは全部で4つお願いします。録音/一時停止を接続/切断します。少なくともこれらは私の考えです。

4

1 に答える 1

1

シリアル ポート用のスレッドを作成する代わりに、DataReceivedイベントにフックするだけです。

チェックボックスについては、 CheckedChangedイベントにフックします。

したがって、次のようになります。

private bool paused;
private SerialPort sp;

public Form1()
{
    InitializeComponent();

    sp = new SerialPort();
    sp.DataReceived += new SerialDataReceivedEventHandler(sp_DataReceived);
}

private void sp_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
    if (!paused)
    {
        string indata = sp.ReadExisting();

        //Display the data
        //To avoid cross thread problems do something like this
        Invoke(new Action(() =>
        {
            textBox1.Text += indata;
        }));

        //Or if you are just writing to the console 
        Console.WriteLine(indata); //Thread safe

        //Timestamp checkbox
        if (checkBox3.Checked)
        {
            //Display timestamp using DateTime.Now  
        }

    //Write to file checkbox
    if (checkBox4.Checked)
    {
        using (StreamWriter file = new StreamWriter(path, true))
        {
            file.WriteLine(indata);
        } 
    }
}
}

//Pause/Resume Checkbox
private void checkBox1_CheckedChanged(object sender, EventArgs e)
{
    paused = checkBox1.Checked;
}

//Connect/Disconnect checkbox
private void checkBox2_CheckedChanged(object sender, EventArgs e)
{
    if (checkBox2.Checked)
    {
        sp.Open();
    }
    else
    {
        sp.Close();
    }
}
于 2013-01-27T08:18:03.117 に答える