0

質問がありますが、私はC#でフォームアプリケーションをビルドしますが、あまりうまくいきません。 フォームに新しい機能を追加して、シリアルポートをバックグラウンドでリスンし、受信したデータをテキストボックスに表示します。これは、アプリケーションが実行されている間に行わなければなりません。バックグラウンドのシリアルポートリスナーC#

私はコンソールアプリケーションでこれを行う方法からいくつかのコードを見つけましたが、今ではフォームに使用できるようにコードを変更したいと思います。

using System; 
using System.IO.Ports; 

class PortDataReceived 
{ 
    public static void Main() 
    { 
     SerialPort mySerialPort = new SerialPort("COM8"); 

     mySerialPort.BaudRate = 57600; 
     mySerialPort.Parity = Parity.None; 
     mySerialPort.StopBits = StopBits.One; 
     mySerialPort.DataBits = 8; 
     mySerialPort.Handshake = Handshake.None; 

     mySerialPort.DataReceived += new SerialDataReceivedEventHandler(DataReceivedHandler); 

     mySerialPort.Open(); 

     Console.WriteLine("Press any key to continue..."); 
     Console.WriteLine(); 
     Console.ReadKey(); 
     mySerialPort.Close(); 
    } 

    private static void DataReceivedHandler(
         object sender, 
         SerialDataReceivedEventArgs e) 
    { 
     SerialPort sp = (SerialPort)sender; 
     string indata = sp.ReadExisting(); 
     Console.WriteLine("Data Received:"); 
     Console.Write(indata); 
    } 
} 

答えて

0

代わりにコンソールへの書き込みのフォームクラスにDataReceivedイベントハンドラのコードをコピーして、フォームのShownイベントハンドラにシリアルポートの初期化コードを入れて、テキストボックスまたはそうにデータを置きます。

DataReceivedハンドラは別のスレッドで呼び出されるため、UIスレッドでUIを更新するコードを実行するにはthis.Invokeに電話する必要があります。それ以外の場合は、例外が発生します。

+0

Thxを:P – sanderfcb95

0

DataRecievedイベントのメソッド呼び出し者デリゲートを使用してテキストを設定できます。

例:私はそれを試してみるつもり

private static void DataReceivedHandler(object sender, SerialDataReceivedEventArgs e) 
{ 
    SerialPort sp = (SerialPort)sender; 
    string indata = sp.ReadExisting(); 

    this.Invoke((MethodInvoker)delegate 
    { 
     textBox.Text += indata; 
    }); 
} 
関連する問題